1.首先你需要 两个窗体 可以叫做 A和B窗体。现在呢从A窗体弹出B窗体 然后B窗体返回值到A窗体如何优雅的完成呢?
解决方式:
可以试试委托
第一步在B窗体定义委托方法
cs
public delegate void ValueChangedHandler(object sender, EventArgs<List<DataGridViewRow>> e);
public event ValueChangedHandler ValueChanged;
然后第二步在你需要回传的时候执行
cs
ValueChanged(this, new EventArgs<List<DataGridViewRow>>(listMoDId));
备注:listMoDId 就是List<DataGridViewRow>
第三步A窗体接收创建一个方法
cs
private void BulletFrame_ValueChanged(object sender, BulletFrame.EventArgs<List<DataGridViewRow>> e)
{
//e.Value 就是传过来的值
}
第四步 A窗体的BulletFrame_ValueChanged方法要绑定到B窗体上面
cs
B frm = new B();
frm.ValueChanged += BulletFrame_ValueChanged;
frm.ShowDialog();
来讲点理论吧:
在C#中,delegate
和 event
是两个非常有用的关键字,它们经常一起使用来在类之间传递消息或通知
delegate(委托)
委托就好像一个银行可以接收多个方法来源 ValueChangedHandler
是一个委托类型,它定义了一个方法签名,该方法没有返回值(void
),接受两个参数:
object sender
:通常用于传递触发事件的对象。这是一个常见的模式,允许事件处理程序知道是哪个对象触发了事件(作用于A和B建立绑定之后有一个唯一的标识可以精准指定是谁和我建立了绑定)
EventArgs<List<DataGridViewRow>> e
:这是一个泛型参数,假设 EventArgs<T>
是一个自定义的或来自某个库的泛型类,它继承自 EventArgs
类。这个参数用于传递与事件相关的数据,当然你可在里面写任意的类返回
Event(事件)
接下来,event
关键字用于在类中声明一个事件。事件是基于委托的,它允许类或对象提供通知。在例子中,ValueChanged
是一个事件,它的类型是之前声明的 ValueChangedHandler
委托。这意味着任何订阅了 ValueChanged
事件的方法都必须符合 ValueChangedHandler
委托的签名。
怎么使用订阅事件呢?
当其他类(或同一个类中的其他方法)想要知道 ValueChanged
事件何时发生时,它们可以订阅该事件。订阅事件通常是通过将符合委托签名的方法作为参数传递给 +=
操作符来完成的
cs
frm.ValueChanged += BulletFrame_ValueChanged;
总结
通过这种方式,delegate
和 event
提供了一种灵活且类型安全的方式来在C#中的类之间传递消息和通知。它们是实现事件驱动编程模式的关键组件。