当我从另一个实例调用方法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
真的很困惑为什么会这样,因为调试时没有错误,所以感谢任何帮助。
感谢。
答案 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();
}
}