Kĩ thuật lập trình - User control

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 ...

pdf6 trang | Chia sẻ: Khủng Long | Lượt xem: 1040 | Lượt tải: 0download
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:

  • pdftailieu.pdf
Tài liệu liên quan