Tài liệu Kĩ thuật lập trình - User control: GVHD: Đặng Bình Phương 
USER CONTROL 
1. TẠO USER CONTROL 
Giả sử ứng dụng của các bạn chứa nhiều form, mỗi form có một nhóm các control cho 
phép người sử dụng nhập vào địa chỉ nhà (textbox số nhà, textbox đường, textbox 
phường, textbox quận, textbox thành phố). Nếu mỗi form ta phải tạo lại hàng loạt các 
control đó để thể hiện địa chỉ nhà thì sẽ mất rất nhiều thời gian nếu ta phải thể hiện nhiều 
địa chỉ nhà, chưa kể việc ta phải viết code cho các control đó (nếu có). Giải pháp đặt ra là 
ta sẽ nhóm các control đó vào một lớp (class) thành một control duy nhất có thể tái sử 
dụng. Tức là, chúng ta sẽ chỉ phải viết code một lần và mỗi khi form nào có liên quan đến 
địa chỉ nhà, ta chỉ việc kéo nó vào form. 
Ví dụ sau nhằm mô tả ý tưởng trên. 
1. Mở Microsoft Visual Studio .NET 2003 
2. Tạo một ứng dụng Windows Application (thuộc danh sách Visual C# Projects) 
với tên tùy ý (ví dụ: VD1) 
3. Thêm User Control vào project bằng cách chọn Project > User Control. Đặt tên ...
                
              
                                            
                                
            
 
            
                 6 trang
6 trang | 
Chia sẻ: Khủng Long | Lượt xem: 1347 | Lượt tải: 0 
              
            Bạn đang xem nội dung tài liệu Kĩ thuật lập trình - User control, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
GVHD: Đặng Bình Phương 
USER CONTROL 
1. TẠO USER CONTROL 
Giả sử ứng dụng của các bạn chứa nhiều form, mỗi form có một nhóm các control cho 
phép người sử dụng nhập vào địa chỉ nhà (textbox số nhà, textbox đường, textbox 
phường, textbox quận, textbox thành phố). Nếu mỗi form ta phải tạo lại hàng loạt các 
control đó để thể hiện địa chỉ nhà thì sẽ mất rất nhiều thời gian nếu ta phải thể hiện nhiều 
địa chỉ nhà, chưa kể việc ta phải viết code cho các control đó (nếu có). Giải pháp đặt ra là 
ta sẽ nhóm các control đó vào một lớp (class) thành một control duy nhất có thể tái sử 
dụng. Tức là, chúng ta sẽ chỉ phải viết code một lần và mỗi khi form nào có liên quan đến 
địa chỉ nhà, ta chỉ việc kéo nó vào form. 
Ví dụ sau nhằm mô tả ý tưởng trên. 
1. Mở Microsoft Visual Studio .NET 2003 
2. Tạo một ứng dụng Windows Application (thuộc danh sách Visual C# Projects) 
với tên tùy ý (ví dụ: VD1) 
3. Thêm User Control vào project bằng cách chọn Project > User Control. Đặt tên 
User Control đó (ví dụ: Diachi.cs) 
4. Thêm các control (textbox và label) thể hiện số nhà, đường, phường, quận, thành 
phố như sau: 
5. Dịch project (Ctrl + Shift + B) và chọn lại Form1. 
6. Ở cuối của toolbox trong tab Windows Form sẽ có 1 control mới được thêm vào 
có tên là Diachi. Kéo Control đó vào form và chạy ứng dụng. (Hoặc kéo file 
Diachi.cs có trong cây Solution Explorer vào form) 
Control Diachi được thêm vào form Cây Solution Explorer 
1 
GVHD: Đặng Bình Phương 
7. Chạy thử ứng dụng. 
2. THÊM CÁC PROPERTY 
Để ý, trong cửa số Properties của control Diachi vừa mới thêm vào form, trừ các chỗ 
cho ta đặt lại các property cho control như những control thông thường (Name, Location, 
Size), không có chỗ nào cho ta đặt giá trị cho số nhà, đường, phường, quận và thành 
phố. Để làm điều này, ta thực hiện thêm các property cho control Diachi như sau: 
1. Trong lớp Diachi (mở file Diachi.cs), thêm vào các dòng code sau: 
 [Category ("Data"), Description("So nha cua dia chi")] 
 public string Sonha 
 { 
 get {return this.txtSonha.Text;} 
 set {this.txtSonha.Text = value;} 
 } 
(Thêm tương tự cho property đường, phường, quận, thành phố) 
Giải thích: 
- Dòng đầu tiên là tùy chọn (có hoặc không có cũng được). Tuy nhiên, nếu có 
thì property có tên Sonha (dùng để ánh xạ vào textbox txtSonha) sẽ được đưa 
vào nhóm có tên Data trong cửa sổ Properties, và có mô tả là "So nha cua 
dia chi" mỗi khi ta chọn property này. Nếu không có dòng đầu tiên, property 
trên sẽ được đưa và nhóm có tên Misc (linh tinh) 
- get / set: thực hiện các thao tác được mô tả mỗi khi người sử dụng lấy thông 
tin (get) hoặc gán (set) cho biến Sonha. 
2. Trong cửa sổ Properties của control, đặt các giá trị tương tự như sau thì lập tức 
bên form cũng được cập nhật. 
Control Diachi được thêm vào form Cây Properties 
2 
GVHD: Đặng Bình Phương 
3. THÊM CÁC HÀM (PHƯƠNG THỨC) VÀ HÀM XỬ LÝ SỰ KIỆN 
Việc bổ sung các hàm bình thường và hàm xử lý sự kiện tương tự như đối với một lớp 
bình thường. Giả sử ta thêm hàm có tên Lay_Diachi để lấy địa chỉ đầy đủ, ta thêm các 
dòng sau vào lớp Diachi: 
 public string Lay_Diachi() 
 { 
 string strDiachi = Sonha; 
 strDiachi += " duong " + Duong; 
 strDiachi += " phuong " + Phuong; 
 strDiachi += " quan " + Quan; 
 strDiachi += " thanh pho " + Thanhpho; 
 return strDiachi; 
 } 
hoặc ta thêm hàm xử lý sự kiện cho textbox txtDuong để mỗi khi người sử dụng nhập 
chuỗi “NCV” vào tên đường thì lập tức tên đường chuyển thành “Nguyễn Cửu Vân” 
hoặc “DBP” thành “Điện Biên Phủ”. Để thực hiện điều này, ta bổ sung hàm xử lý sự 
kiện TextChanged cho textbox txtDuong. 
Bước 1: Chọn cửa sổ thiết kế (Design) của control Diachi. 
Bước 2: Chọn textbox txtDuong 
Bước 3: Trong cửa sổ Properties (của textbox này), mục Events, ta nhấp đúp vào chỗ sự 
kiện TextChange để bổ sung hàm xử lý cho sự kiện này (hoặc gõ một tên hàm theo ý của 
mình). 
3 
GVHD: Đặng Bình Phương 
Bước 4: Viết code cho sự kiện như sau: 
private void txtDuong_TextChanged(object sender, System.EventArgs e) 
{ 
if (txtDuong.Text=="NCV") 
 txtDuong.Text = "Nguyen Cuu Van"; 
 else if (txtDuong.Text=="DBP") 
 txtDuong.Text = "Dien Bien Phu"; 
} 
Trong phần trên, ta dã tìm hiểu cách tạo và sử dụng một User Control. Bên cạnh đó ta 
cũng biết cách bổ sung các Property để ta có thể dễ dàng thay đổi thông tin liên quan 
đến User Control ngay trong cửa sổ thiết kế (Design). Ngoài ra, ta cũng biết cách bổ sung 
cách hàm đơn thuần và hàm xử lý sự kiện cho User Control. 
4. TÌM HIỂU VÀ SỬ DỤNG DELEGATE VÀ EVENT 
Giả sử ta bổ sung thêm 1 hay nhiều User Control Diachi nữa. Vấn đề đặt ra là làm sao để 
khi ta gõ nội dung vào User Control diachi đầu tiên thì tất cả các User Control diachi còn 
lại cũng đồng loạt thay đổi theo. Để thực hiện điều này, ta cùng nhau tìm hiểu về khái 
niệm và cách sử dụng Delegate và Event qua ví dụ. 
1. Khái niệm: 
Delegate có nghĩa là ủy quyền hay ủy thác. Trong lập trình, đôi lúc ta gặp tình huống phải 
thực thi một hành động nào đó, nhưng lại không biết sẽ gọi phương thức nào của đối 
tượng nào. Chằng hạn, với vấn đề đặt ra ở trên thì khi người sử dụng nhập liệu vào các 
textbox của UserControl Diachi thì lập tức các đối tượng User Control Diachi khác cũng 
sẽ cập nhật theo, nhưng các đối tượng này không thể được tiên đoán trong lúc cài đặt lớp 
Diachi. Vì vậy ta sẽ kết nối lớp Diachi với một đối tượng ủy thác và ủy thác (hay thông 
báo) cho đối tượng này trách nhiệm thực thi khi Diachi được cập nhật. Đối tượng ủy thác 
sẽ được gán (đăng ký ủy thác) vào thời điểm khác thích hợp. 
Event có nghĩa là sự kiện. Ngày nay mô hình lập trình giao diện người dùng đồ họa 
(Graphical User Interface - GUI) đòi hỏi cách tiếp cận theo hướng sự kiện. Đối với ví dụ 
trên, khi người sử dụng cập nhật thông tin trên User Control Diachi thứ nhất, sẽ có một 
sự kiện xảy ra trong chương trình và chương trình có nhiệm vụ xử lý sự kiện đó bằng 
cách cập nhật các User Control Diachi khác. Một sự kiện có nghĩa là có điều gì đó đã xảy 
ra và chương trình phải đáp trả. 
Delegate và event là hai khái niệm có liên quan chặt chẽ với nhau. Bởi vì để quản lý các 
sự kiện một cách mềm dẻo đòi hỏi các đáp trả phải được phân phối đến các trình giải 
quyết sự kiện. Trình giải quyết sự kiện trong C# được cài đặt bằng delegate. 
2. Cách sử dụng: 
Bước 1: Thêm vào form 2 User Control Diachi vào form. 
4 
GVHD: Đặng Bình Phương 
Bước 2: Trong lớp Form1, ta bổ sung thêm 2 hàm có kiểu trả về là void, 1 tham số đầu 
vào kiểu string để cập nhật Duong cho diachi2 và diachi3: 
 void Duong2Changed(string strDuong) 
 { 
// Gán giá trị của Duong trong diachi2 bằng strDuong 
 diachi2.Duong = strDuong; 
 } 
 void Duong3Changed(string strDuong) 
 { 
// Gán giá trị của Duong trong diachi3 bằng strDuong 
 diachi3.Duong = strDuong; 
 } 
Bước 3: Tại thời điểm viết code cho User Control Diachi, ta chưa xác định được hàm 
nào và có bao nhiêu hàm (có kiểu trả về là void, 1 tham số đầu vào kiểu string) sẽ được 
gọi (để cập nhật các textbox txtDuong của User Control Diachi khác) mỗi khi textbox 
txtDuong của User Control này thay đổi. Tuy nhiên, một điều chắc chắn là ta biết hàm sẽ 
được gọi có kiểu trả về là kiểu void, 1 tham số đầu vào kiểu string. Do đó ta sử dụng từ 
khóa delegate để khai báo một hàm ủy thác (ủy quyền) cùng kiểu trả về (void) và tham số 
đầu vào (string) với hàm sẽ gọi. Lúc này, User Control sẽ chỉ làm việc với hàm ủy thác 
này. Bên cạnh đó, ta dùng từ khóa event để khai báo một sự kiện để mỗi khi người sử 
dụng cập nhật textbox txtDuong của User Control này, ta sẽ “phát” sự kiện này đi và lúc 
đó, các hàm giống với hàm ủy thác có gắn với sự kiện này sẽ được thực hiện: 
 public delegate void Diachi_DuongChangedHandler(string strDuong); 
 public event Diachi_DuongChangedHandler Diachi_DuongChanged; 
Ý nghĩa: 
- Dòng 1 khai báo một hàm đại diện có kiểu trả về là void, có một tham số đầu 
vào kiểu string (giống với 2 hàm ta đã viết ở Form1) 
- Dòng 2 khai báo một sự kiện có tên Diachi_DuongChanged và kiểu là 
Diachi_DuongChangedHandler. 
Bước 4: Mục đích của ta là khi người sử dụng cập nhật textbox txtDuong thì sự kiện này 
phát sinh. Do đó trong hàm xử lý cho sự kiện TextChanged của textbox txtDuong ở 
trên, ta bổ sung các dòng lệnh sau: 
private void txtDuong_TextChanged(object sender, System.EventArgs e) 
{ 
 if (txtDuong.Text=="NCV") 
 txtDuong.Text = "Nguyen Cuu Van"; 
 else if (txtDuong.Text=="DBP") 
 txtDuong.Text = "Dien Bien Phu"; 
5 
GVHD: Đặng Bình Phương 
 if (Diachi_DuongChanged!=null) 
 Diachi_DuongChanged(txtDuong.Text); 
} 
Ý nghĩa: Nếu biến sự kiện Diachi_DuongChanged khác null, tức là người sử dụng đã 
gán hàm giống hàm đại diện cho sự kiện này, lúc đó ta sẽ thực thi các hàm được gán vào 
biến sự kiện đó (Xem cách gán thêm hàm sự kiện ở phần sau) 
Bước 5: Trong hàm tạo của Form1, ta thêm các khai báo sau: 
public Form1() 
{ 
 // 
 // Required for Windows Form Designer support 
 // 
 InitializeComponent(); 
 // 
 // TODO: Add any constructor code after InitializeComponent call 
 // 
 diachi1.Diachi_DuongChanged += 
new Diachi.Diachi_DuongChangedHandler(Duong2Changed); 
 diachi1.Diachi_DuongChanged += 
new Diachi.Diachi_DuongChangedHandler(Duong3Changed); 
} 
Ý nghĩa: Thêm 2 hàm ủy thác có tên Duong2Changed và Duong3Changed (trong lớp 
Form1) vào sự kiện Diachi_DuongChanged của User Control diachi1. Tức là mỗi khi sự 
kiện Diachi_DuongChanged phát sinh, hàm Duong2Changed và Duong3Changed sẽ 
được thực hiện theo thứ tự đó. 
Muốn loại bỏ một hàm nào khỏi sự kiện, ta cũng làm như trên nhưng thay += bằng -= 
Bước 6: Chạy thử chương trình và kiểm tra kết quả. (Mỗi khi người sử dụng nhập thông 
tin mới vào textbox txtDuong của diachi1 thì lập tức 2 User Control diachi2 và diachi3 
cũng lập tức được cập nhật theo 
6 
            Các file đính kèm theo tài liệu này:
 tailieu.pdf tailieu.pdf