使用委托和事件从另一个表单更新表单

本文关键字:表单 另一个 事件 更新 | 更新日期: 2023-09-27 18:03:00

我总是忘记这是怎么做的。

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

帮我一下,谢谢。

使用委托和事件从另一个表单更新表单

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

在某处实现EventArgs类:

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

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);
  }
}
在Form1:

Form2 MyForm2 = new Form2();
MyForm2.OnMyChange += MyChanged;
static void MyChanged(object source, MyEventArgs e)
{
    //e.EventInfo will contain list
    Console.WriteLine("changed");
}

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

你所能做的就是在form2中注册一些函数作为更改事件的处理程序。如果函数是主窗体的成员,那么它可以影响该窗体的组件。

传递一个委托基本上是相同的,但将允许您使用您选择的任意函数。但是,大多数情况下,这是不值得的。

很难从问题中确切地得到您需要的内容,但是听起来您可以向表单传递一个Action来添加项目。你可以改变Form2中的构造函数,以确保你总是有回调-例如

 private Action<string> addItemsToParent;
 public Form2(Action<string> addItemsToParent)
 {
    this.addItemsToParent = addItemsToParent;
 }
 public void AddItems()
 {
     addItemsToParent("item 1");
 }