2015-10-20 78 views
0

任何人都可以幫助我解決以下問題嗎? : 我在我的winform應用程序中有兩種形式。在form1中,我有一個按鈕來打開form2。 在窗口2,我有一個列表框從XML得到他的項目:以其他形式更新控制

private void FillListBox() 
{ 
    string filename = @"employee.xml"; 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(filename); 
    XmlNodeList xnList = doc.SelectNodes("/Information/username"); 
    foreach (XmlNode xn in xnList) 
    { 
     ListboxUsername.Items.Add(xn.InnerText); 
    } 
} 

在Form1,我有一個組合框也從同一個XML文件中獲取自己的項目:

public void FillCombobox() 
{ 
    comboboxPersonen.Items.Clear(); 
    string filename = @"emplyee.xml"; 
    XmlDocument doc = new XmlDocument(); 
    doc.Load(filename); 
    XmlNodeList xnList = doc.SelectNodes("/Information/username"); 
    foreach (XmlNode xn in xnList) 
    { 
     comboboxUsername.Items.Add(xn.InnerText); 
    } 
} 

在窗口2我是能夠編輯listboxUsername中的xmlnodelist。而當關閉form2時,我想要在comboboxUsername中最近的項目。就像在asp.net中回發一樣,但在winform應用程序中。有什麼建議麼?

private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    //acces comboboxusername in form1 to update it with recent xml list items   
} 

感謝您的時間。

+0

您是否在關閉Form2之前將編輯後的xml保留迴文件中?如果您可以從Form2中觸發Form1可以處理的事件,那麼您將從文件中重新加載Form1的組合框。如果沒有,您可以在自定義EventArg中傳遞更新的XmlNodeList,並讓Form1從傳遞的XmlNodeList中重新加載組合框。 – Kevin

+0

是的,在關閉Form2之前編輯hame。我應該開火什麼樣的事件以及如何在Form1中接收它? – user3114347

+0

您可以考慮查看http://stackoverflow.com/questions/31190976/how-do-i-update-a-child-form-from-another-child-form/31191633#31191633並瀏覽我周圍的答案。總的答案是「也許你不想直接這樣做,因爲可能需要集中的方法」,但我們也都會談及如何更直接地做到這一點。在下面,Dan也許是你需要的東西,但是你可能錯過了一些事物可能嵌套在父容器中(或者是多層)。您可能需要檢查迭代的項目是否具有子容器項目。 –

回答

0

可以使用

Application.OpenForms 

可以使用得到所需要的形式得到開放形式:

foreach(Form f in Application.OpenForms) 
{ 
    if (f.Name == "Form2") 
     { 
      //Do Stuff.. 
     } 
    } 
} 
+0

private void Form2_FormClosing(Object sender,FormClosingEventArgs e) { }這是我的關閉事件處理程序。我如何使用Openforms訪問comboboxUsername? – user3114347

+0

如果您使用此方法查找其他表單,它將位於Controls集合中。 –

1

如果打開窗體2作爲一個模式對話框,您可以訪問的形式,它已經經過被解僱,像這樣:

private void cmdOpenForm2_Click(object sender, EventArgs e) 
{ 
    using (var dlg = new Form2()) 
    { 
    if (dlg.ShowDialog(parent) == DialogResult.OK) 
    { 
     // do stuff with dlg: 
     foreach(var itm in dlg.ListboxUsername.Items) 
     blah blah 
    } 
    } 
} 
+0

dlg.ListboxUsername。項目<---仍然沒有對form2中的列表框的訪問 – user3114347

+0

嗯,當然,你需要將ListboxUsername的修飾符公開而不是私有。通常你不用這種方法直接訪問控制器,但它可以工作。 –

+0

這需要使用對話框的控件集合。它不能作爲表單本身的字段訪問。 –

0

從Form1使用回調事件。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // Open Form2 
     Form2 f = new Form2(); 
     // Set callback 
     f.SetCallbackFromForm1(FillComboBox); 
     f.ShowDialog(this); 
    } 

    private void FillComboBox() 
    { 
     comboBox1.Items.Add("Sample1"); 
     comboBox1.Items.Add("Sample2"); 
     comboBox1.Items.Add("Sample3"); 
    } 
} 

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
     FormClosed += Form2_FormClosed; 
    } 

    // This is callback var 
    private Action callbackFromForm1; 

    // Set callback 
    public void SetCallbackFromForm1(Action callback) 
    { 
     callbackFromForm1 = callback; 
    } 

    void Form2_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     // When form closed, our callback will be called. 
     callbackFromForm1(); 
    } 
} 

如果您需要從Form2的一些對象(數據)傳輸到Form1,當它關閉,您可以創建一個必要的參數回調。