以其他形式更新控件

时间:2015-10-20 11:50:58

标签: c# winforms

任何人都可以帮我解决以下问题吗? : 我的winform应用程序中有两个表单。在form1中,我有一个用于打开form2的按钮。 在form2中,我有一个Listbox从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);
    }
}

在form2中,我可以编辑listboxUsername中的xmlnodelist。关闭form2时,我想要使用comboboxUsername中最新的项目。像asp.net中的回发,但在winforms应用程序中。有什么建议吗?

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

3 个答案:

答案 0 :(得分:1)

如果您将Form2作为模式对话框打开,则可以在表单解除后访问该表单,如下所示:

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
    }
  }
}

答案 1 :(得分:0)

您可以使用

获取打开的表单
Application.OpenForms

您可以使用以下方式获取所需的表格:

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

答案 2 :(得分: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,你可以使用必要的参数创建回调。