前言this
從事開發工做兩年有餘了,但仍是對Delegate,Event神馬的看見就頭疼,文章看過無數,本身也練習過好多遍,但到用的時候或者人家換了一種形式以後就又不懂了,哎~智商捉急啊!!spa
可是,這兩天的收穫仍是不錯的~!因此筒子們必定要有信心+幾分堅持,回頭一看,原來是這麼簡單。code
正文orm
下面是我練習時作的一個小例子,在這記錄下來,一是提醒本身,二來也許還能幫助到別人。:Pblog
跟着個人思路走,你會發現 so easy.事件
1、祝福傳遞功能開發
流程如圖:get
一、第一步很簡單,就很少說了。可是注意要設置frm3.MdiParent = this;博客
Form3 frm3 = new Form3(); frm3.MdiParent = this; frm3.Show();
二、來看第二步,首先要明確咱們的目的是什麼?string
1)修改Form3中的ListBox1中的值;
2)改變背景色爲Green。
那麼兩件事,咱們就須要兩個方法來完成(這裏有人會想:笨,這麼簡單的需求放到一個方法不就好了麼?由於真正的項目需求是不會這麼簡單的,呵呵)。
這兩件事都是針對Form3的,因此咱們把這兩個方法加到Form3裏面。
//更新文字方法 public void SetText(string text) { this.listBox1.Items.Add(text); } //更新背景顏色方法 public void SetColor(Color color) { this.BackColor = color; }
OK,方法加進去以後,咱們繼續走,單擊Open,打開模式窗體frmContent。
frmContent content = new frmContent(); content.ShowDialog();
三、在下拉框選擇完對應的的類型以後,點擊添加進行傳值+修改顏色,只需簡單幾步,而後就大功告成了!哈哈
1)聲明委託。(跟方法的聲明同樣,只不過多加一個delegate,還有不須要方法體)
public delegate void GetTextHandle(string text); //申明委託 public delegate void GetColorHandle(Color color); //申明委託
2)實例化。(緊接着,下一步就進行實例化,仍是同樣,方法怎麼實例化,委託就怎麼實例化,這裏給一個null值)
public GetTextHandle getTextHandle = null; public GetColorHandle getColorHandle = null;
3)使用。(使用前要作非空判斷,而後將textBox1中的值傳遞過去就哦了)
private void button1_Click(object sender, EventArgs e) { if (getTextHandle != null) { getTextHandle(this.textBox1.Text); } if (getColorHandle != null) { getColorHandle(Color.Green); } }
好了,是否是火燒眉毛想感覺下成果,運行試試看,咦?爲毛點了添加沒反應??
跟蹤代碼發現 getTextHandle 爲空!這是爲何呢?
仔細觀察一下,發現第二步和第三步在委託這塊基本沒半毛錢關係,難怪會點了沒反應。
因此咱們須要在第二步加入一行代碼:
frmContent content = new frmContent(); content.getTextHandle = SetText;
content.getColorHandle = SetColor; content.ShowDialog();
這段話的意思就是將SetText和SetColor方法當參數傳遞給frmContent的getTextHandle和getColorHandle。
OK,如今應該是沒什麼問題了。
爲了進一步加深理解,咱們還要增長一個功能,沒錯,在frmContent界面的類型後面還有一個添加按鈕,那麼這個按鈕的功能是什麼呢?
2、動態添加祝福類型
一、跟上面同樣,仍是先搞清楚需求,這裏很簡單,咱們須要給frmContent窗體的祝福類型下面加Item
那麼先寫方法吧。
public void AddCbo(string text) { this.comboBox1.Items.Add(text); }
二、添加事件
private void button2_Click(object sender, EventArgs e) { Form4 frm4 = new Form4(); frm4.setValue = AddCbo; //注意這裏 frm4.ShowDialog(); }
三、Form4窗體代碼
public delegate void SetValue(string text); public SetValue setValue = null; private void button1_Click(object sender, EventArgs e) { if (setValue!=null) { setValue(textBox1.Text); } }
OK,至此,委託就完了,固然這些只是皮毛,後續我會慢慢補充完整!
歡迎你們來個人博客參觀:http://www.cnblogs.com/xw-yanger/
demo下載地址:Demo