Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个调用没有将信息从xml文件传递到winForm?_C#_Xml_Code Reuse - Fatal编程技术网

C# 为什么这个调用没有将信息从xml文件传递到winForm?

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

我是个新手,我迷路了。我请求你耐心等待

我有一个正在工作的应用程序,我相信我正在使用以下代码序列化(??)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);