使用委托和事件从另一个表单更新表单
本文关键字:表单 另一个 事件 更新 | 更新日期: 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");
}