网上都介绍了一大堆委托了,用简单的方式看待一下,但为何要使用委托呢?
从初级用户的角度看,就是在2个界面中,界面1的进程调用一个方法去更新界面2内的控件,就需要用到委托。否则就可能引发异常:“在该控件上执行的操作正从错误的线程调用。使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。”
上面说的是可能引发异常,并非一定引发(估计控件界面来不及响应会引发异常),我的测试是简单的控件更新操作不会引起异常。
看文章有实例,不错的:
实例1:https://www.cnblogs.com/ZhengDaChuan/p/3765005.html
画个图来帮大家了解下委托:
其实委托,很容易理解,通过图可以体会到,可以把委托看作是一种用来装方法的容器。
实例2:https://blog.csdn.net/rell336/article/details/78345867
那么我们可以在界面1(FrmMain.cs)使用委托。
1.界面1(FrmMain.cs):
(1).声明委托:
delegate void DgltPrgListAddSafe(PrgInfoSt prgInfo);
(2).调用:
在界面1(FrmMain.cs)中,调用界面2(FrmMuxStruct.cs)
进程或函数中,frmMuxStruct.PrgListAddSafe(prgInfo);
2.界面2(FrmMuxStruct.cs):
(1).控件调用委托(tv_muxStruct是控件TreeView):
public void PrgListAddSafe(PrgInfoSt prgInfo)
{
//1.ProgListAdd是实现函数
//2.object内可传递多个参数
tv_muxStruct.Invoke((DgltPrgListAddSafe)PrgListAdd, new object[] { prgInfo });
}
(2).实现函数:
private void PrgListAdd(PrgInfoSt prgInfo)
{
//1.TreeView信息
string newPrgText = prgInfo.prgNum.ToString() + "-" + prgInfo.pmtPid.ToString();
int i = 0;
if (tv_muxStruct.Nodes.Count == 0)
{
tv_muxStruct.Nodes.Add(string.Empty);
tv_muxStruct.ImageKey = tv_muxStruct.SelectedImageKey = "muxStruct";
}
ListViewItem lvi = new ListViewItem();
lvi.Name = newPrgPmtText;
lvi.Text = (i + 1).ToString();
lvi.SubItems.Add("0x" + prgInfo.prgNum.ToString("x4") + "(" + prgInfo.prgNum.ToString() + ")");
lvi.SubItems.Add(prgInfo.prgName);
....................................................
lv_prgInfo.Items.Add(lvi);
}