1

我一直忘记这是怎么做到的。。

我想在不创建表单实例的情况下从 Form2 更新主表单上的 UI。
我记得使用委托/事件并可能以某种方式传入第一个表单的实例,但完全空白。

帮帮我,谢谢。

从 Form2 向 Form1 上的 listBox1 添加一些内容。

4

3 回答 3

4

是的,delegate 和 event 是正确的关键词

在某处实现您的 EventArgs 类:

public class MyEventArgs : EventArgs
{
    private List<string> EventInfo;
    public MyEventArgs(List<string> strings)
    {
        EventInfo = strings;
    }
    public List<string> GetInfo()
    {
        return EventInfo;
    }
}

在表格 2 中:

public class Form2
{
  public event EventHandler<MyEventArgs> OnMyChange;

  //call it then you need to update:
  if(OnMyChange!= null)
  {
    MyEventArgs e = new MyEventArgs();

    List<string> content = new List<string>();
    content.Add("abc");
    e.EventInfo = content;

    OnMyChange(this, e);
  }
}

在表格 1 中:

Form2 MyForm2 = new Form2();
MyForm2.OnMyChange += MyChanged;

static void MyChanged(object source, MyEventArgs e)
{
    //e.EventInfo will contain list
    Console.WriteLine("changed");
}
于 2013-03-09T09:12:25.140 回答
0

您无法更新未实例化的对象。

您可以做的是将某些函数注册为 form2 中更改事件的处理程序。如果该函数是主窗体的成员,则它可以影响该窗体的组件。

传递委托基本相同,但允许您使用您选择的任意函数。不过,大多数时候这不值得开销。

于 2013-03-09T09:10:00.947 回答
0

很难从问题中得到你真正需要的东西,但听起来你可以将一个Action传递给你的表单来添加项目。您可以更改 Form2 中的构造函数以确保您始终拥有回调 - 例如

 private Action<string> addItemsToParent;

 public Form2(Action<string> addItemsToParent)
 {
    this.addItemsToParent = addItemsToParent;
 }

 public void AddItems()
 {
     addItemsToParent("item 1");
 }
于 2013-03-09T09:12:06.513 回答