为什么此调用没有将信息从我的 xml 文件传递到 winForm

本文关键字:文件 xml winForm 我的 调用 信息 为什么 | 更新日期: 2023-09-27 18:31:03

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

有一个工作的应用程序,我相信我正在使用以下代码序列化 (??) 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 或 onDisplay)开始遍历每一行,它找到文件夹,找到文件,找到元素,将元素分配给字符串,并准备将字符串提供给调用窗体上的控件。当我采取最后一步将其转换为表单时,它会将字符串清除为 " 并显示带有空白字段的调用表单。

如果我在locateFolder(object sender, XmlDocument xmldoc)功能中休息并尝试超越它

        string senderName = sender.ToString();

我收到一个 NullReferenceException 错误,其中包含关键字new提示并检查对象是否为空。这是我能找到的唯一一个给我提示的错误。几乎就像将字符串加载到控件中,然后再次清空内容一样。我不明白的是为什么没有locateFolder()调用它就可以正常工作,以及为什么当我不在代码中放置中断以尝试查找错误时不会抛出错误。正如我所说,我已经在Shown事件和Load事件中发出了这一呼吁。

有没有人了解这里发生了什么。我真的很想重用这段代码。

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");
            }
        }
    }

编辑3 每个加尔多 我将代码更改为此。

    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 的建议都已清除错误,但它仍然没有将值传递到发件人表单文本框。

非常感谢大家的评论。我正在努力跟上。谢谢!!

编辑4 根据克里斯托夫的要求。来自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);
    }

为什么此调用没有将信息从我的 xml 文件传递到 winForm

好的,终于找到可能解决您问题的方法了。
这行代码中的"this":

WidgetLogic.elementUser(this);

是包含空ApproveTime_Load的类。
我希望课堂是一种形式。(如果没有,请指定类别)
代码的问题在于,您将其作为对象传递到函数元素User中,然后将其转换为字符串。你能将字符串而不是对象传递给这个函数吗?
假设"this"是一种形式,它应该看起来像这样:

WidgetLogic.elementUser(this.Text);

然后,您可以重构 elementUser 和以下函数,使其不采用发送方对象,而是采用发送方字符串(这更有意义)。
单词 sender 通常用作对象,因为您传递调用按钮或窗体。
您仍然可以传递实际的发送者,但您可以只执行toString。您必须将发送者对象强制转换为窗体并获取 Text 属性。