2016-11-30 68 views
1

當我從另一個實例調用方法idload()時,它不會更新它應該的列表視圖列表。我知道該方法正在調用正確,因爲我在idload()中的每個語句後都放了一個MessageBox,並且顯示了它。如果idload()被稱爲Form2.cs [它的形式]它工作正常,但如果我從Form4.cs調用它,它不會更新列表視圖。從另一個實例調用方法時,listview不會更新

我使用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

通常的誤解。在你的代碼中你創建了一個Form2的NEW實例,你正在調用那個實例上的方法,而不是已經顯示的實例。嘗試在調用idload之後調用form2.Show,然後您會看到您在不同實例上的更改 – Steve

+0

@Steve哦謝謝我沒有意識到這一點。有沒有辦法在初始表單上進行更改,而不是第二個表單上的更改? – Venomz

回答

0

這是一個根植於OOP概念實例的常見問題。您已經顯示了Form2的一個實例,但是您的代碼創建了Form2的一個NEW實例並從不顯示它。現在代碼調用使用該新實例的方法並使用其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(); 
    } 
} 
相關問題