【问题标题】:How can I loop through all the open instances of a particular form?如何遍历特定表单的所有打开实例?
【发布时间】:2011-06-06 12:16:43
【问题描述】:

我需要更新动态创建的 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
}

【问题讨论】:

  • 听起来您需要找到一种更好的方式来管理您的表单。 “一个或几个实例可能会或可能不会打开,我真的不知道”听起来像是无法维护的混乱。你做错了 OOP。
  • 你说得对,其实这个问题更多的是好奇而不是真正的需要^^

标签: c# winforms forms


【解决方案1】:

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

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

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

【讨论】:

  • 当然是+1,但也要考虑一下:stackoverflow.com/questions/3751554/… :)
  • @Shadow Wizard,谢谢你的好点。现在我必须重新考虑我上一个项目中的本地化 :)
  • 我去试试,同时谢谢,看起来很有用!
  • 是的,好点。 Form1 中的代码绝对没有理由不引用 Form2。将其存储在一个字段中,使用 FormClosed 事件将其设置回 null。
【解决方案2】:

我会将所有 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 实例已关闭,请将其从列表中删除(此处:在 formClosed 事件中)

【讨论】:

  • 我也想过数组,但我想实现一些新的和“不寻常”的东西,无论如何谢谢!
  • 这是正确的方法,尽管 List 对这个问题来说太过分了。阅读 makkam 的答案中的 cmets,为什么这是一种更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多