標籤:
實現一個樣本,封裝一個登入控制項,當使用者名稱是admin密碼是8888的時候提示登入成功背景色變成紅色,然後使用者可以自訂自己的操作(如記錄登入時間,可以存放到記事本,可以存放到資料庫,這裡要看使用者的需求),如果登入失敗,背景色變紅,提示登入失敗。
首先我們用委託來實現,現在封裝一個使用者自訂控制項(兩個文字框,一個label,一個按鈕),代碼如下,eg:
internal MyDelegate myDelegate;public UserControl1(){ InitializeComponent();}private void button1_Click(object sender, EventArgs e){ if (textBox1.Text.Trim() == "admin" && textBox2.Text.Trim() == "8888") { if (myDelegate != null) { myDelegate();//在此調用委託記錄事件、記錄時間等都可以,可以存放記事本,可以存放資料庫 this.BackColor = Color.Green; label1.Text = "登入成功!"; } } else { this.BackColor = Color.Red; label1.Text = "登入失敗!"; }}
委託,代碼如下,eg:
internal delegate void MyDelegate();
主表單調用,代碼如下,eg:
private void Form1_Load(object sender, EventArgs e){ userControl11.myDelegate = Record;}public void Record(){ Console.WriteLine(DateTime.Now +"登入成功!");}
上面就是用委託實現的,但是如果我們這個時候可以添加一個按鈕來假裝調用上面的登入成功的事件/或者給按鈕去掉登入事件,把上面主表單(再增加兩個按鈕)的事件換成如下代碼,我們來實驗一下,代碼如下,eg:
private void Form1_Load(object sender, EventArgs e){ userControl11.myDelegate = Record;}public void Record(){ Console.WriteLine(DateTime.Now +"登入成功!");}private void button1_Click(object sender, EventArgs e){ userControl11.myDelegate = null;//讓成功登入這個事件失效,因為此時委託為null,不會去執行裡面的登入成功碼}private void button2_Click(object sender, EventArgs e){ Record();//此方法可以被手動調用了}
如果我們把上面的委託換成事件呢?讓我們來實驗一下。
委託還是以前的代碼,事件只不過是在聲明委託的時候在前面添加了一個event關鍵字,使用者自訂控制項代碼如下,eg:
internal event MyDelegate myDelegate;//在委託前面填加一個event關鍵字public UserControl1(){ InitializeComponent();}private void button1_Click(object sender, EventArgs e){ if (textBox1.Text.Trim() == "admin" && textBox2.Text.Trim() == "8888") { if (myDelegate != null) { myDelegate();//記錄事件、記錄時間等都可以,可以存放記事本,可以存放資料庫 this.BackColor = Color.Green; label1.Text = "登入成功!"; } } else { this.BackColor = Color.Red; label1.Text = "登入失敗!"; }}
主表單調用代碼如下,eg:
private void Form1_Load(object sender, EventArgs e){ userControl11.myDelegate += Record;}public void Record(){ Console.WriteLine(DateTime.Now +"登入成功!");}private void button1_Click(object sender, EventArgs e){ userControl11.myDelegate -= Record;//只能通過+=、-=來操作事件綁定,可以防止使用者手誤操作賦值為null。}private void button2_Click(object sender, EventArgs e){ Record();//此方法還可以被手動調用了}
通過上面我們可以看出來事件也就是對委託的一個封裝(封裝成了一個private委託,一個+=方法一個-=方法),雖然我們聲明的event是public的,但是編譯器編譯之後就會變成private的,所以只能在聲明event的內部直接調用,而其他地方只能通過+=和-=進行操作。
下面我們對事件再次進行封裝使它看起來更像系統的事件.
委託代碼如下,eg:
internal delegate void MyDelegate(object sender,MyEventArgs args);
時間參數類代碼如下,eg:
class MyEventArgs : EventArgs{ private bool _isSuccess; private string _name; private string _pwd; public string Name { get; set; } public string Pwd { get; set; } public bool IsSuccess { get; set; }}
使用者自訂控制項代碼如下,eg:
public partial class UserControl1 : UserControl{ internal event MyDelegate myDelegate; public UserControl1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MyEventArgs myEventArgs = new MyEventArgs(); myEventArgs.IsSuccess = false; myEventArgs.Pwd = textBox2.Text; myEventArgs.Name = textBox1.Text; myDelegate(this, myEventArgs); if (myEventArgs.IsSuccess == true) { this.BackColor = Color.Green; label1.Text = "登入成功!"; } else { this.BackColor = Color.Red; label1.Text = "登入失敗!"; } }}
主表單代碼如下,eg:
private void Form1_Load(object sender, EventArgs e){ userControl11.myDelegate += userControl11_myDelegate;}private void userControl11_myDelegate(object sender, MyEventArgs args){ if (args.Name == "admin" && args.Pwd == "8888") { args.IsSuccess = true; } else { args.IsSuccess = false; }}
上面的事件、委託和最後一個貌似不太搭邊,等有時間再舉一個好一點的例子。
C#委託和事件