首次博客内容是将自己对于委托在窗体通信方面的应用做一次总结,也算是将自己的见解用言语来表达出来吧。在开始接触委托时云里雾里,完全没有这个概念的存在,更不用提委托用于窗体通信之中这么高深的运用了尽管在现在看来我还是觉得委托用在窗体通信中是一件很神奇的事情,不是说没有弄懂,而是说这里面的逻辑思维也值得我们去学习(思维是个关键的东西,一旦理解了,也会顺水推舟)。
首先委托的格式想必是一目了然
public delegate void MessageDele(string Message);
委托的五大步骤:
1.声明委托
2.根据委托创建具体方法
3.创建委托变量
4.委托变量关联具体方法
5.调用委托
然而在此处如果我们将窗体通信想象成主窗体和从窗体通信的话,那么必然存在一个问题,委托变量的放置问题。(本次只考虑主从窗体通信这种特殊情形,其余情形照搬该逻辑思路即可了)。例如,如果是主窗体向从窗体发送信息,是在主窗体里面定义委托变量并且绑定相关从窗体的方法,还是从窗体内定义委托变量,并且将委托变量与自身的相关方法进行绑定(该方法好比说是将主窗体传过来的信息展现出来),然后在主窗体中创建从窗体对象后,调用从窗体对象的委托变量用来发送信息呢。又或是在从窗体向主窗体发送信息情况下,委托变量是跟随谁的问题,一种是将委托变量定义在从窗体中,在主窗体中创建从窗体对象,然后通过从窗体对象去调用内部成员委托变量,并且绑定主窗体中的相关方法,另一种情况是主窗体中定义委托变量,并且绑定相关方法,再主窗体中创建从窗体对象,通过从窗体去调用主窗体中的委托(然而基本上这种方式完全不太推荐使用,不是说不可以用而是实现的步骤太过于复杂,付出的成本大于了其收益)。
一、主窗体向从窗体发送信息
主窗体中定义委托变量:
public partial class FrmMain : Form { //【3】创建委托变量 public MessageDele objMessageDele; public FrmMain() { InitializeComponent(); FrmOther objFrmOther = new FrmOther(); objFrmOther.Show(); //【4】委托变量绑定方法 objMessageDele += objFrmOther.Message; } //【5】调用委托变量 private void btnclick_Click(object sender, EventArgs e) { objMessageDele(txt1.Text.ToString()); } } //【1】声明委托(定义一个函数原型:返回值+参数类型+个数) public delegate void ShowCount(string message);
从窗体提供委托实现方法:
public partial class FrmOther : Form { public FrmOther() { InitializeComponent(); } //【2】根据委托创建具体方法 public void Message(string message) { label1.Text = message; } }
二、从窗体中定义委托变量
主窗体调用从窗体并发送消息:
public partial class FrmMain : Form { FrmOther objFrmOther; public FrmMain() { InitializeComponent(); objFrmOther = new FrmOther(); objFrmOther.Show(); } private void btnSend_Click(object sender, EventArgs e) { //[5]调用委托变量传递信息 objFrmOther.objmessageDele(this.txtMessageSend.Text.Trim().ToString()); } }
从窗体声明委托并实现方法:
public partial class FrmOther : Form { public FrmOther() { InitializeComponent(); //[4]委托变量关联方法 objmessageDele += Message1; } //[3]创建委托变量 public MessageDelegate objmessageDele; //[2]创建具体方法 private void Message1(string text) { lblMessage.Text = text; } } //[1]声明委托 public delegate void MessageDelegate(string text);
两种方法的实现结果都是差不都的即都是主窗体发送消息然后从窗体接受消息并且显示消息内容。但是委托变量的归属问题却产生了,哪一种方式更应该被推荐使用呢。
其实委托的引入就是为了将需要的方法整合到一起,从这个观点来说应该将委托变量和方法放在同一级下即是选用主窗体中定义委托变量。毕竟从多方面考虑 如果是多个从窗体接受信息,那么委托的优势在这里也就消失了,由此来看必定是在主窗体中一次将委托变量绑定方法,然后调用的时候只需进行委托变量的调用,如果委托变量放在从窗体中,那么在主窗体中调用每一个从窗体对象的委托时是如此的繁琐,也就失去了委托存在的意义了。
三、从窗体向主窗体发送信息
public partial class Form1 : Form { FrmOther objfrmOther; public MessageDele objmessageDele; public Form1() { InitializeComponent(); objfrmOther = new FrmOther(); //[4]委托变量绑定方法 objfrmOther.objMessageDele += showMessage; objfrmOther.Show(); } //[2]根据委托创建方法 public void showMessage(string text) { this.lblMessage.Text = text; } }
四、从窗体中定义委托变量
public partial class FrmOther : Form { public FrmOther() { InitializeComponent(); } //[3]创建委托变量 public MessageDele objMessageDele; //[5]调用委托实现方法 private void btnSend_Click(object sender, EventArgs e) { objMessageDele(this.txtSend.Text.Trim().ToString()); } } //[1]声明委托 public delegate void MessageDele(string text);
这是相对来说比较好的选择,毕竟我们要选择的必定是最优选择,在主窗体中创建委托变量是一种浪费时间的做法,不推荐使用。在这里仅仅是做了委托在窗体通信方面的相关实例,委托其他方面并未涉及,以后的更新中将会出现委托的深一步的运用。委托在窗体通信方面的应用还是比较热门的,毕竟响应速度比起通过刷新来判断是否有新消息的接入所用的时间少之又少。