【发布时间】:2014-11-19 13:00:14
【问题描述】:
我是新手,我迷路了。我请求你的耐心。
我有一个工作应用程序,我相信我正在使用以下代码序列化 (??) xml 文件数据。
public static string elementUser(object sender)
{
XmlDocument xmldoc = new XmlDocument();
//**EDIT:** This is where I would call
//locateFolder(sender, xmldoc);
//instead of fileExistsRequest(xmldoc);
fileExistsRequest(xmldoc);
XmlNodeList nodelist = xmldoc.SelectNodes("//Name");
foreach (XmlNode xmlnode in nodelist)
{
if (xmlnode["User"] != null)
{
usertxt = xmlnode["User"].InnerText;
}
else
{
}
return usertxt;
}
return usertxt;
}
调用它后,我将 xml 元素的内容加载到 winForm 中,以显示给用户进行操作。其他形式会调用其他元素。 Ex Math.cs 将仅调用 <Start> <End> 或 <Ticks> 以用于其他对话框。
以上设计用于处理一个带有一个条目 (??) 的 xml 文件,看起来像这样
<?xml version="1.0" encoding="utf-8"?>
<SubmitTime12>
<Name Key="11/18/2014">
<User>fpytel</User>
<Date>11/18/2014</Date>
<JobNum>00000</JobNum>
<RevNum>CR8</RevNum>
<Task>why</Task>
<Start>00:00 AM</Start>
<End>8:00 AM</End>
<Ticks></Ticks>
<Explanation>Expletives Abound</Explanation>
</Name>
</SubmitTime12>
我突然想到,我可以使用elementUser(object sender) 来加载具有相同基本格式但具有更多条目的其他 xml 文件。真正唯一的变化是<User> 不包含在Reportfpytel.xml 文件条目中,因为用户是文件名的一部分。例如:
...
<Name Key="11/14/2014 6:45:57 AM">
<Date>11/3/2014</Date>
<JobNum>00000</JobNum>
<RevNum>00000</RevNum>
<Task>Testing less</Task>
<Start>4:00 AM</Start>
<End>4:00 AM</End>
<TotalTime></TotalTime>
</Name>
<Name Key="11/14/2014 6:46:39 AM">
<Date>11/13/2014</Date>
<JobNum>26356</JobNum>
<RevNum>00000</RevNum>
<Task>Red Lines</Task>
<Start>2:00 AM</Start>
<End>2:00 AM</End>
<TotalTime></TotalTime>
</Name>
...
所以在上面的第一个代码中,我通过在 elementUser(object sender); 中创建它并从代码中重构它,将 fileExistsRequest(xmldoc); 替换为以下调用。这是VS2010提供的。
public static void locateFolder(object sender, XmlDocument xmldoc)
{
string senderName = sender.ToString();
if (senderName == "Start")
{
}
else if (senderName.Contains("ApproveTime"))
{
fileExistsRequest(xmldoc);
}
else if (senderName.Contains("Report"))
{
fileExistsReport(xmldoc);
}
else if (senderName == "Math")
{
fileExistsReport(xmldoc);
}
}
这可以正常工作,但不会将元素加载到调用表单上的控件。从调用它(onLoad 或 onShown)开始,我逐步完成了每一行,它找到了文件夹,找到了文件,找到了元素,将元素分配给了一个字符串,并准备好将字符串提供给调用时的控件形式。当我采取最后一步将其带到表单时,它将字符串清除为“”并显示带有空白字段的调用表单。
如果我中断 locateFolder(object sender, XmlDocument xmldoc) 函数并尝试跳过此函数
string senderName = sender.ToString();
我收到带有提示 new 关键字的 NullReferenceException 错误并检查对象是否为空。这是我能找到的唯一给我提示的错误。几乎就像是将字符串加载到控件中,然后再次清空内容。我不明白的是为什么没有locateFolder() 调用它就可以正常工作,为什么当我没有在代码中放置一个中断来尝试查找错误时没有引发错误。就像我说的,我已经在Shown 事件和Load 事件上进行了调用。
有没有人了解这里发生了什么。我真的很想重用这段代码。
EDIT2:根据 JTMon 进行了修改以尝试捕获 null 异常。它直接从它身边跑了过去。我的配置是否正确?
public static void locateFolder(object sender, XmlDocument xmldoc)
{
//XmlDocument xmldoc1 = new XmlDocument();
try
{
string senderName = sender.ToString();
if (senderName == "Start")
{
}
//...OriginalCode
}
catch
{
if (sender == null)
{
MessageBox.Show("returned null");
}
}
finally
{
if(sender == null)
{
MessageBox.Show("returned null");
}
}
}
EDIT3 Per Galdo 我把代码改成了这个。
public static void locateFolder(object sender, XmlDocument xmldoc)
{
if (sender != null)
{
string senderName = sender.ToString();
if (senderName == "Start")
{
}
//...OriginalCode
}
else
{
MessageBox.Show("returned Null");
}
}
我的错误已清除。 JTMon 和 Galdo 的建议都清除了错误,但仍然没有将值传递给发件人表单文本框。
非常感谢大家的评论。我正在努力跟上。谢谢!!
EDIT4 根据 Kristof 的要求。来自elementUser();发件人的来电
private void ApproveTime_Load(object sender, EventArgs e)
{
Start p = (Start)this.Owner;
Control[] c = p.Controls.Find("bApproveTime", false);
Button b = (Button)c[0];
b.Enabled = false;
WidgetLogic.elementUser(this);
}
【问题讨论】:
-
我们能看到你调用locateFolder的代码吗?
-
@Galdo 是的,对不起。我在代码中添加了一个注释掉的部分。我会打电话给
fileExistsRequest(xmldoc);。相反,我打电话给locateFolder();谢谢你的评论!! -
您是否检查过 sender 实际上是否== null?我没有看到它在您的代码中的任何地方初始化,并且 fileExistsRequest 方法没有使用它,而 locatefoder 使用它。
-
@JTMon 当 sender==null 我实际上无法捕捉到它。我试图将它放入 Try{}Catch{} 中,但它甚至没有捕捉到它。它只是不间断地运行并完成代码。我确定它是 null 只是因为它会引发运行时错误?来自 VS2010 的对话框显示“嘿,假人。你没有做对'我可以单步执行代码并且它正在返回发件人,我正在尝试使用 FormName 或其一部分,如代码
locateFolder()所示 -
@JTMon 如果我把它放在 Try{}Catch{}Finally{} 中,Finally{} 会捕捉到它吗?我会尝试快速重新配置它。如果你知道那会很棒
标签: c# xml code-reuse