当从另一个实例调用方法时,listview不会更新

时间:2016-11-30 13:36:43

标签: c# winforms

当我从另一个实例调用方法idload()时,它不会更新它应该的列表视图列表。我知道该方法被正确调用,因为我在MessageBox中的每个语句后放置了idload()并显示了它。如果从idload()调用Form2.cs [它所在的表单],它可以正常工作但如果我从Form4.cs调用它,它就不会更新列表视图。

我使用了MessageBox.Show(xmlReader.GetAttribute("id"));,当idload()Form2.cs调用时,它会循环遍历xml中的每个id,并按预期更新列表视图。当它从Form4.cs调用时,它会循环遍历所有内容并且不会更新列表视图。

以下是代码的相关部分:

Form4.cs

public void myMethod()
    {
        Form2 form2 = new Form2();
        form2.idload();
    }

    public void idwrite()
    {
        XElement xml = XElement.Load("settings.xml");
        xml.Add(new XElement("Chat",
        new XAttribute("id", textBox1.Text),
        new XAttribute("name", textBox2.Text)));
        xml.Save("settings.xml");
        myMethod();
        this.Close();
    }

Form2.cs

 public void idload()
    {

        listView1.Items.Clear();

        XmlReader xmlReader = XmlReader.Create("settings.xml");

        while (xmlReader.Read())
            {

            if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "Chat"))  
            {
                if (xmlReader.HasAttributes)
                {

                    //    listView1.Items.Add(xmlReader.GetAttribute("id"));
                    //    listView1.Items.Add(xmlReader.GetAttribute("name"));

                    string[] arr = new string[4];
                    ListViewItem itm;


                    arr[0] = (xmlReader.GetAttribute("id"));
                    arr[1] = (xmlReader.GetAttribute("name"));


                    itm = new ListViewItem(arr);
                    MessageBox.Show(xmlReader.GetAttribute("id"));
                    listView1.Items.Add(itm);

                }
            }
        }

        xmlReader.Close();

    }

如果需要,这是项目:https://ufile.io/8dc20

真的很困惑为什么会这样,因为调试时没有错误,所以感谢任何帮助。

感谢。

1 个答案:

答案 0 :(得分:0)

这是一个根植于实例的OOP概念的常见问题。您已经显示了Form2的实例,但您的代码创建了一个Form2的新实例,并且从未显示它。现在代码使用该新实例调用该方法并使用其ListView 当然,作为一个从未展示的实例,你不会看到任何变化 如果您在调用idload后调用 form2.Show ,您将在不同的实例上看到您的更改。

最简单的解决方法是让Winforms引擎通过Application.OpenForms集合返回对已经显示的Form2实例的引用。在这里,您可以选择对扩展名为OfType的Form2实例的引用,并获取该类型的第一种形式。如果没有,则创建并显示它。

public void myMethod()
{
    Form2 form2 = Application.OpenForms.OfType<Form2>().FirstOrDefault();     
    if(form2 != null) 
        form2.idload();
    else
    {
        form2 = new Form2();
        form2.Show();
        form2.idload();
    }
}