如何遍历特定表单的所有打开实例?

时间:2011-01-10 12:15:30

标签: c# winforms forms

我需要更新动态创建的Form2的ListBox。让我们说,如果我必须更新这个ListBox(当然在Form1中)我没有这个Form2的引用,所以我不能调用UpdateList方法(不,我不能让它静态)

我甚至不知道是否打开了Form2,它可能与否。

你有什么建议?

有没有办法遍历Form2的所有开放性?

代码示例:

//Form1

public void event()
{
    //UPDATE FORM2 LISTBOX
}

//SOMEWHERE IN FORM1

Form2 runTime = new Form2();

//Form2

public void UpdateList()
{
    //UPDATE LISTBOX
}

2 个答案:

答案 0 :(得分:6)

我不确定你到底想要实现什么。但在我看来,你可以遍历已打开表单的集合:

var formsList  = Application.OpenForms.OfType<Form2>();
listBox.Items.AddRange(formsList.Select(f=>f.Text).ToArray());

这一行将为您提供应用程序中所有打开的Form2实例的IEnumerable。您可能希望使用自己的字符串表示形式(而不是上面代码段中使用的表单标题)

答案 1 :(得分:3)

我会将所有Form2引用添加到arrayList(其他一些其他集合类,例如List)

/// form1
List<Form2> list = new List<Form2>();

void createForm2(object sender, EventArgs e)
{
     Form2 newForm = new Form2();
     newForm.FormClosed += new FormClosedEventHandler(form2_closed);
     list.add(newForm);
}

void updateListBox()
{
    for each (Form2 curform in list)
    {
         curform.updateListbox();
    }
}

void form2_closed(object sender, FormClosedEventArgs e)
{
   list.Remove(sender);
   updateListBox();  // in case a form2 instance is closed, recall method
}

/// form2
public void updateListbox()
{
    // enter code here ...
}

如果关闭Form2实例,请将其从列表中删除(此处:on formClosed事件)