Đây là hội thi làm trái cây mau chín do bác B.F lần đầu tiên tổ chức
)
Đùa chơi một chút với các em trái cây để tìm hiểu sơ sơ về cái CustomEvent và UserControl trong C#.
Giả định em có 2 trái cây Chanh chua với Chùm Nho ở dưới, cả 2 trái này đều thuộc một loại gọi là loại … Trái cây ^^.
Mỗi trái cây thì có những thuộc tính thế này :
- Tên trái cây
- Màu sắc khi non
- Màu sắc khi chín
- Thời gian non -> chín

Bên cạnh đó khi em nó chín thì em nó cũng tạo ra một Event gọi là Event “Quả đã chín” để các anh biết mà hái.

Em mà chín thì em đổi màu
)
Tạo một đối tượng trái cây kiểu UserControl, đưa các thuộc tính cần thiết cho “Trái” :
public partial class UcFruit : UserControl{private string _fruitName;private Color _colorUnMature;private Color _colorMature;private int _timeToMature;
public UcFruit(){InitializeComponent();}
...}
Xây dựng Delegate để tạo Event
// Khái niệm Delegate có nhiều điểm tương đồng với con trỏ hàm trong C++// Định nghĩa một delegate là định nghĩa một "câu móc" móc các sự kiện và các// hàm thụ lý sự kiện với nhau.
public delegate void FruitMatureHandler(object sender, FruitMatureArgs fruit);
/// /// Đây là Entities/// public class FruitMatureArgs:EventArgs{private string _fruitName;private Color _colorUnMature;private Color _colorMature;private int _timeToMature;
public FruitMatureArgs(){}
public FruitMatureArgs(string fruitName, Color colorUnMature, Color colorMature, int timeToMature){_fruitName = fruitName;_colorUnMature = colorUnMature;_colorMature = colorMature;_timeToMature = timeToMature;}
public string FruitName{get { return _fruitName; }set { _fruitName = value; }}
public Color ColorUnMature{get { return _colorUnMature; }set { _colorUnMature = value; }}
public Color ColorMature{get { return _colorMature; }set { _colorMature = value; }}
public int TimeToMature{get { return _timeToMature; }set { _timeToMature = value; }}}
Xây dựng Event và hàm RaiseEvent
Event quả chín sẽ được quẳng ra khi quả đến thời gian “chín”, tức là Click đủ _timeToMature lần, xử lý sự kiện Nút_Click để mỗi lần Click giảm thời gian chờ đi 1 đơn vị.
// Khai báo sự kiện Trái cây chín, còn Raise ra khi nào là tùy mình// Nhớ là phải để Delegate và Event Public thì bên ngoài mới dùng được.public event FruitMatureHandler FruitMature;
// Hàm RaiseEvent - quăng sự kiện Quả chín ra để bên ngoài bắt lấy.// Hàm này chỉ cần bấm chuột vào event FruitMature ở trên là Resharper nó tự Generate,// ko thì chịu khó chép lại
)private void InvokeFruitMature(FruitMatureArgs fruit){FruitMatureHandler mature = FruitMature;if (mature != null) mature(this, fruit);}
// Click vô để giảm thời gian chờ quả chínprivate void btnFruitClick_Click(object sender, EventArgs e){// Nếu hết thời gian chờ TimeToMature thì rung cây "Invoke" cho "văng" ra sự kiện quả chínif (_timeToMature <= 0) { // Thông báo sự kiện được sinh ra InvokeFruitMature(new FruitMatureArgs(_fruitName, _colorUnMature, _colorMature, _timeToMature)); // Đổi màu cho quả btnFruitClick.BackColor = _colorMature; } // Ngược lại giảm thời gian chờ đi 1 đơn vị. _timeToMature -= 1; }
Xong UserControl, giờ qua Form
public partial class Form1 : Form{public Form1(){InitializeComponent();}
private void Form1_Load(object sender, EventArgs e){// Qủa chanh khi còn non thì màu Green, chín màu Yellow - Đồng ý ko ^^var quaChanh = new UcFruit();quaChanh.FruitName = "Chanh chua";quaChanh.ColorUnMature = Color.Green;quaChanh.ColorMature = Color.Yellow;quaChanh.TimeToMature = 5;
// Quả nho non màu xanh, chín màu đỏ :">var quaNho = new UcFruit();quaNho.FruitName = "Chùm nho";quaNho.ColorUnMature = Color.Green;quaNho.ColorMature = Color.Red;quaNho.TimeToMature = 10;
//Treo quả chanh với quả nho lên Form , gọi là lên "Cành" cho nó văn vẻthis.flowLayoutPanel1.Controls.Add(quaChanh);this.flowLayoutPanel1.Controls.Add(quaNho);
//Đặt hàng khi nào Chanh Chín thì gọi hàm Hái để hái chanhquaChanh.FruitMature += Picker;
//Đặt hàng khi nào Nhon chín thì gọi hàm Hái để hái nhoquaNho.FruitMature += Picker;
}
void Picker(object sender, FruitMatureArgs fruit){MessageBox.Show("Em " + fruit.FruitName + " chín rồi mấy anh ơi !");// Hái hái hái}
}
Comment đầy đủ trong code ở trên, có thể tham khảo bằng sourcecode của Form tại đây : http://www.mediafire.com/?hkhwmiz2ziz