C# 为什么这个调用没有将信息从xml文件传递到winForm?
我是个新手,我迷路了。我请求你耐心等待 我有一个正在工作的应用程序,我相信我正在使用以下代码序列化(??)xml文件数据C# 为什么这个调用没有将信息从xml文件传递到winForm?,c#,xml,code-reuse,C#,Xml,Code Reuse,我是个新手,我迷路了。我请求你耐心等待 我有一个正在工作的应用程序,我相信我正在使用以下代码序列化(??)xml文件数据 public static string elementUser(object sender) { XmlDocument xmldoc = new XmlDocument(); //**EDIT:** This is where I would call //locateFolder(sender, 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将仅调用
或
以在其他对话框中使用
上面的设计是为了处理一个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>
因此,在上面的第一个代码中,我替换了fileExistsRequest(xmldoc)通过在elementUser(objectsender)中创建以下调用,使用code>代码>并从代码中重构它。这是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(objectsender,XmlDocument xmldoc)
函数中设置了一个中断,并尝试跳过此步骤
string senderName = sender.ToString();
我得到一个NullReferenceException错误,提示new
关键字并检查对象是否为null。这是我能找到的唯一一个给我暗示的错误。就像将字符串加载到控件中,然后再次清空内容一样。我不明白的是,为什么它在没有调用locateFolder()
的情况下工作得很好,为什么我没有在代码中插入中断符来尝试查找错误时不会抛出错误。正如我所说,我在显示的
事件以及加载
事件中进行了调用
有人知道这里发生了什么吗。我真的很想重用这段代码
EDIT2:根据JTMon修改以尝试捕获空异常。它正好跑过它。我的配置正确吗
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");
}
}
}
EDIT3Per 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根据克里斯托夫的请求。来自elementUser()的发送方的调用代码>
好了,终于找到了解决问题的办法。
这行代码中的“this”:
WidgetLogic.elementUser(this);
是包含void ApproveTime_加载的类。
我希望该类是一种形式。(如果不是,请指定该类)
代码的问题在于,您将其作为对象传递给函数elementUser,然后将其转换为字符串。
能否将字符串而不是对象传递到此函数中?
假设“this”是一种形式,它应该是这样的:
WidgetLogic.elementUser(this.Text);
然后,您可以重构elementUser和以下函数,使其不采用sender对象,而是采用sender字符串(这更有意义)。
sender一词通常用作对象,因为您传递了呼叫按钮或表单。
你仍然可以传递实际的发送者,但是你可以只做toString。您必须将sender对象强制转换为表单并获取Text属性。我们可以看到您调用locateFolder的代码吗?@Galdo是的,我很抱歉。我在代码中添加了一个注释掉的部分。我会在这里调用fileExistsRequest(xmldoc)代码>。相反,我调用locateFolder()代码>感谢您的评论!!您是否检查了发送方是否实际为==null?我看不到它在代码中的任何地方被初始化,fileExistsRequest方法不使用它,而locatefoder使用它。@JTMon当sender==null时,我实际上无法捕获它。我试着把它放进一个Try{}Catch{}中,但那甚至都没有抓住它。它只是不间断地运行并完成代码。我确信它是空的,只是因为它抛出了一个运行时错误??VS2010中显示“嘿,笨蛋”的对话框。你做得不对‘我可以一步一步地检查代码,但它返回了发件人,我试图使用FormName或它的某些部分,如代码locateFolder()
@JTMon中所示,如果我将它放入Try{}Catch{}Finally{}中,Finally{}会捕获它吗?我会尽快重新配置它。如果你知道这将是一个了不起的好,我会测试一段时间,这是没有意义的。此编辑实际上从else{}返回null,但它可以工作:-我不想耽误你,但看起来你已经找到了答案,克里斯托夫!!我会让你知道的。我可能会测试一下。非常感谢。我仍然不能100%确定我完全理解你的情况,所以只要让我知道是否有任何问题,我们将从那里开始。现在就要回家了,希望我16小时后回来;)祝你今晚愉快,克里斯托夫。还有5个小时!!:-我又回到了早期阶段。我犯了太多的错误,我想我不可能把它们都找出来。它们不是在调试、构建或运行时抛出的错误。应用程序的其他部分只是完全停止运行。我不知道发生了什么事。现在我需要把我的东西写完,因为我必须把它拿出来。以后的管理可能会有点痛苦,但这就是代价。再次感谢你,克里斯托夫。我在这本书上做了记号。我打算以后再谈这个问题。谢谢,非常感谢!!:-祝你今天愉快好的,祝你重构好运!如果你再次需要我,就戳我,然后飞走
WidgetLogic.elementUser(this);
WidgetLogic.elementUser(this.Text);