【问题标题】:Why is this call not passing the information from my xml file to the winForm?为什么这个调用没有将我的 xml 文件中的信息传递给 winForm?
【发布时间】: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 文件。真正唯一的变化是&lt;User&gt; 不包含在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


【解决方案1】:

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

WidgetLogic.elementUser(this);

是包含 void ApproveTime_Load 的类。
我希望该课程是一种形式。(如果不是,请指定课程)
您的代码的问题是您将其作为对象传递给函数 elementUser,然后将其转换为字符串。 你能把一个字符串而不是一个对象传递给这个函数吗?
假设“this”是一种形式,它应该是这样的:

WidgetLogic.elementUser(this.Text);

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

【讨论】:

  • 好吧,我会测试一段时间,它没有任何意义。此编辑实际上从 else{} 返回 null,但它有效。 :-O 我不想阻止你,但看起来你已经找到了答案 Kristof!我会告诉你。我可能会测试一下。谢谢!!
  • 我仍然不能 100% 确定我完全理解您的情况,所以请让我知道是否有任何问题,我们将从那里开始。不过现在要回家了,期待我在 16 小时内回来;)
  • 克里斯托夫度过了一个美好的夜晚。还有5个小时!! :-D
  • 我已恢复到较早的阶段。我有这么多错误,我想我不可能把它们全部找出来。它们不是在调试、构建或运行时抛出的错误。应用程序的其他部分完全停止运行。我不确定发生了什么。目前我需要写完我所拥有的,因为我必须把它拿出来。以后的管理可能会有点痛苦,但这就是代价。再次感谢克里斯托夫。我已经在这本书上做了标记。我打算在未来回到它。谢谢你 太谢谢你了!! :-D 有一个美好的一天
  • 好的,祝重构顺利!如果你需要我再戳我飞走
猜你喜欢
  • 2018-09-09
  • 1970-01-01
  • 2014-09-21
  • 2019-06-14
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多