Blog chia sẽ kinh nghiệm lập trình và Technical VN. Nơi mà các bạn có thể học tập và tham khảo về những công nghệ mới nhất hiện nay về .NET
Chủ Nhật, 21 tháng 12, 2014
On 09:39 by Tuan Pham in Action, C#.NET, Chuyên Đề Lập Trình .NET, delegates, Func, Kinh Nghiệm Lập Trình, Predicate, truyền dữ liệu, tuanphamdg No comments
Delegate là một kiến thức căn bản cần nắm vững khi bạn làm việc với C#, .NET. Mặc dù bạn có thể tránh việc sử dụng delegate nhưng cuối cùng bạn vẫn phải công nhận rằng lập trình viên không thể không dùng delegate được. Delegate nói về mặt nào đó nó tương tự như con trỏ hàm trong C++, không khó hiểu cũng như không khó để áp dụng, nếu bạn dành một chút thời gian tìm hiểu.
Một delegate giống như một “người đại diện” hay “đại sứ”. Một delegate có thể được dùng để tạo một bao đóng (encapsulation) cho bất kì phương thức nào, miễn là nó phù hợp (kiểu trả về, tham số). Là một “đại sứ”, delegate có thể triệu gọi phương thức bất kì nơi nào: từ đối tượng này đến đối tượng kia, từ thread này sang thread kia,… Đây là đặc điểm chính của delegate, bạn sẽ cần nhớ lại điều này khi giải quyết các vấn đề thường gặp như truyền dữ liệu giữa hai Form, xử lý lỗi “Cross-thread operation not valid”, tạo event, …
Cách khai báo và sử dụng:
[code language="csharp"]
public delegate void Del(string message);
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
// Instantiate the delegate.
Del handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
[/code]
Bây giờ chúng ta sẽ sử dụng delegate để truyền dữ lệu giữa hai Form. Tôi có FormMain được xem là chính, chính form này sẽ mở FormChild, vấn đề làm sao để khi Click vào button trên formChild thì dữ liệu sẽ được gửi sang formMain và hiển thị lên textBox.
Cách làm là tại formChild ta định nghĩa một kiểu delegate với các kiểu dữ liệu phù hợp, trong class formChild khai báo thêm một biến(*) với kiểu delegate đã định nghĩa ở trên:
[code language="csharp"]
//Định nghĩa delegate
public delegate void DelSendMsg(string msg);
//khạ báo biến kiểu delegate
public DelSendMsg SendMsg;
public FormChild()
{
InitializeComponent();
}
private void BtnButton_OnClick(object sender, RoutedEventArgs e)
{
if (SendMsg != null)
{
// Thực thi hàm 'ShowMsg(string msg)' ở formMain
SendMsg.Invoke(TxTextBox.Text);
}
}
[/code]
Ở formMain khi new formChild() xong, tôi sẽ truyền vào cho formChild một phương thức của formMain thông qua biến (*) delegate ở formChild. Lưu ý tôi có hai Button dùng để Show formChild với cùng mục đích nhưng cách truyền con trỏ hàm khác nhau(tường minh và Lambda Expressions).
[code language="csharp"]
public FormMain()
{
InitializeComponent();
}
//Truyền con trỏ hàm tường minh
private void BtnButton_OnClick(object sender, RoutedEventArgs e)
{
FormChild child = new FormChild();
child.SendMsg = ShowMsg; //void ShowMsg(string msg)
child.Show();
}
//Hàm ủy nhiệm cho formChild
private void ShowMsg(string msg)
{
TxTextBox.Text = msg;
}
//Truyền con trỏ hàm với Lambda Expressions
private void BtnButton2_OnClick(object sender, RoutedEventArgs e)
{
FormChild child = new FormChild();
child.SendMsg = (msg) => TxTextBox.Text = msg;
child.Show();
}
[/code]
Vậy là khi "Show formChild", tại form này tôi nhập thông tin vào textBox và nhấn "Send to" thì lập tức textBox ở formMain sẽ thay đổi giá trị tương ứng. Kết quả:
[caption id="attachment_193" align="aligncenter" width="288"]
Phạm Tuân[/caption]Mời các bạn tham khảo SourceCode tại đây
Chúc các bạn thành công!
Phạm Tuân
Đăng ký:
Đăng Nhận xét (Atom)
Search
Popular Posts
-
Phong cách thiết kế Material Design nhắm đến những đường nét đơn giản, sử dụng nhiều mảng màu đậm nổi bật, các đối tượng đồ họa trong giao ...
-
Hôm nay tôi sẽ giới thiệu với các bạn một Framework đến từ Microsoft - framework này không quá lớn nhưng là khá mạnh khi các bạn làm việc vớ...
-
WPF vượt trội hơn Winform về khoản Drawing , trong đó đặc biệt WPF hỗ trợ đồ họa rất tốt vì nó tương tác trực tiếp đến GPU. Hôm nay chúng t...
-
Hôm nay chúng ta sẽ tìm hiểu cách tạo ra các menu chuột phải trên ứng dụng WPF của mình. Ở bài này chúng ta xoay quanh việc tìm hiểu cách tạ...
-
Để dễ hiểu, các bạn hãy hình dung rằng: cùng một tập tin thực thi *.EXE nhưng bạn DoubleClick 10 lần cách quãng vào nó thì chuyện gì sẽ sảy ...
-
Trong bài viết trước tôi có giới thiệu về Extension Methods trong nguôn ngữ lập trình C#; hôm nay tôi sẽ nói về một vấn đề có ý nghĩa tương...
-
Hôm nay chúng ta sẽ thử đo xem thời gian query Data của "Foreach vs LinQ vs LinQasParallel" như thế nào. Tôi tạo một tool nhỏ để l...
-
Data Binding là kĩ thuật dùng để tạo gắn kết giữa phần giao diện ( UI ) và dữ liệu thông qua phần business logic hoặc giữa các đối tượng UI...
-
LOG4NET là một thư viện mã nguồn mở cho phép chúng ta tạo ra một hoặc nhiều tập tin log, kiểu log cũng như nội dung log một cách linh hoạt v...
-
Sau hai bài giới thiệu về Caliburn.Micro framework, hôm nay chúng ta sẽ cùng bắt tay vào làm một dự án nhỏ - HelloWorld. Step 1: Add referen...
Recent Posts
Blog Archive
-
▼
2014
(18)
-
▼
tháng 12
(18)
- WPF - Các Vấn Đề Về Multi-Thread Trong WPF (Đa Luồng)
- Modern UI For WPF Thiết Kế Giao diện Modern Win8 V...
- WPF - Thiết Kế Giao Diện METRO Win8 Với Thư Viện M...
- WPF - Validation ValidationRule và Vấn Đề Về Thông...
- WPF - Validation ValidationRule và Vấn Đề Về Thông...
- Parallel Class Trong C# và Vấn Đề Xử lý Song Song
- Tìm Hiểu Về Delegate Trong C# và Cách Truyền Dữ Li...
- Extension Methods - Thêm Một Phương Thức Ngoài Vào...
- Indexer trong C# - Kỹ Thuật Duyệt Qua Phần Tử Tron...
- SourceCode - DataBinding và ValueConverter
- WPF - DataBinding và chuyển đổi kiểu dữ liệu IValu...
- SourceCode - DataBinding và UpdateSourceTrigger
- WPF - DataBinding và cở chế tự động update dữ liệu
- SourceCode - DataBinding
- WPF – Cơ Bản về Data Binding
- WPF - Bộ Công Cụ Đắc Lực Cho Thiết Kế Expression S...
- WPF - Các Thành Phần Của WPF
- WPF - Tổng quan về Windows Presentation Foundation
-
▼
tháng 12
(18)
0 nhận xét:
Đăng nhận xét