Giáo trình Ngôn ngữ lập trình C#

Mở đầu

•Biến, toán tử, biểu thức

•Viết phương thức vàáp dụng phạm

vi

•Cáccâulệnh lựa chọn

•Phátbiểu lặp

•Quản lý lỗi và ngoại lệ

pdf409 trang | Chia sẻ: Mr Hưng | Lượt xem: 849 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Giáo trình Ngôn ngữ lập trình C#, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
báo cài đặt bộ chỉ mục là ảo. class RawInt: IRawInt{ ...... public virtual bool this[int index] { get{......} set{......} } } 16 • Có thể chọn cài đặt một bộ chỉ mục dùng cú pháp cài đặt giao diện tường minh: struct RawInt: IRawInt{ ...... bool IRawInt.this[int index] { get{......} set{......} } } 1Chương 16 Ủy nhiệm hàm và sự kiện Nguyễn Hồng Phương Khoa CNTT, ĐHBKHN 2Sử dụng khai báo ủy nhiệm hàm và các thể hiện • Một ủy nhiệm hàm là một kiểu trông và hành xử như 1 phương thức. • Ủy nhiệm hàm là 1 sự trừu tượng của 1 phương thức. • Ta có thể coi nó là 1 phương thức thông minh. 3Ví dụ không dùng ủy nhiệm hàm • Viết 1 chương trình cứ mỗi giây thực hiện 1 tác vụ class Ticker{ public void Attach(Subscriber newSub){subscribers.Add(newSub);} public void Detach(Subscriber newSub){subscribers.Remove(newSub);} private void Notify(){ foreach(Subscriber s in subscribers){s.Tick();} } ...... private ArrayList subscribers = new ArrayList(); } 4Ví dụ không dùng ủy nhiệm hàm class Subscriber{ public void Tick(){......} } class ExampleUse{ static void Main(){ Ticker pulsed = new Ticker(); Subscriber worker = new Subscriber(); pulsed.Attach(worker); ....... } } 5Nâng cấp interface Tickable{ void Tick(); } class Ticker{ public void Attach(Subscriber newSub){subscribers.Add(newSub);} public void Detach(Subscriber newSub){subscribers.Remove(newSub);} private void Notify(){ foreach(Tickable t in subscribers){ t.Tick(); } } ...... private ArrayList subscribers = new ArrayList(); } 6Nâng cấp class Clock: Tickable{ ...... public void Tick(){......} } class ExampleUse{ static void Main(){ Ticker pulsed = new Ticker(); Clock wall = new Clock(); pulsed.Attach(wall); ....... } } 7Ví dụ dùng ủy nhiệm hàm • Khai báo 1 ủy nhiệm hàm – Có thể khai báo 1 ủy nhiệm hàm phù hợp với chữ ký của phương thức Tick() ở trên: delegate void Tick(); – Ví dụ này khai báo 1 kiểu mới: Tick là tên kiểu. Có thể dùng tên kiểu để khai báo trong 1 trường hay 1 tham số: void Example(Tick param){......} • Kiểu ủy nhiệm hàm hoàn toàn được nhận từ lớp System.Delegate. Kiểu ủy nhiệm hàm có thể chứa phương thức, toán tử, thuộc tính nên bạn có thể truyền chúng như là tham số tới các phương thức khác. 8Gọi một ủy nhiệm hàm Ví dụ trước: void Example(Tick param){......} • Nếu param là số int thì ta có thể sử dụng giá trị của nó và áp dụng các phép toán +,-,+=,... • Tuy nhiên ở đây, param là 1 ủy nhiệm hàm. Ta dùng ủy nhiệm hàm như là 1 phương thức, gọi ủy nhiệm hàm bằng các dấu ngoặc: void Example(Tick param){ param(); } 9Gọi một ủy nhiệm hàm • Một ủy nhiệm hàm là 1 kiểu tham chiếu nên nó có thể là null. Nếu param là null trong ví dụ trên thì trình biên dịch sẽ đưa ra thông báo NullReferenceException • Phải gọi ủy nhiệm hàm 1 cách chính xác. Trong ví dụ này, param có kiểu là Tick, và Tick được khai báo như sau: delegate void Tick(); 10 Gọi một ủy nhiệm hàm • Việc khai báo này cho biết khi gọi 1 ủy nhiệm hàm Tick (vd: param), ta không được phép truyền bất kỳ đối số nào và lời gọi không trả về điều gì: void Example(Tick param){ param(42); // lỗi biên dịch int result = param(); // lỗi biên dịch Console.WriteLine(param()); // lỗi biên dịch } • Có thể khai báo 1 ủy nhiệm hàm với bất kỳ chữ ký nào bạn muốn. delegate void Tick(int hh, int mm, int ss); 11 Gọi một ủy nhiệm hàm • Dùng ủy nhiệm hàm có tham số: void Example(Tick method){ method(12, 29, 50); } 12 Tạo 1 thể hiện của 1 ủy nhiệm hàm • Dùng cú pháp như với lớp hay cấu trúc: viết từ khóa new, theo sau là tên kiểu(tên ủy nhiệm hàm), và theo sau là tên đối số trong dấu ngoặc. Đối số phải là phương thức có chữ ký phù hợp chính xác với chữ ký của ủy nhiệm hàm. Ví dụ: class Example{ private void Method(){......} ...... private void Create(){ Tick m = new Tick(this.Method); } } 13 Khai báo 1 sự kiện • Viết từ khóa event, theo sau là tên của kiểu (kiểu này phải là 1 kiểu ủy nhiệm hàm) và sau nữa là tên của sự kiện. Ví dụ: delegate void TickHandler(); class Ticker{ public event TickHandler Tick; } 14 Gắn 1 ủy nhiệm hàm với 1 sự kiện • Tạo 1 thể hiện ủy nhiệm hàm (cùng kiểu như sự kiện) và đính kèm thể hiện ủy nhiệm hàm này tới sự kiện dùng toán tử +=. Ví dụ: class Clock{ ...... public void Start(){ ticker.Tick += new TickHandler(this.RefreshTime); } private void RefreshTime(){......} private Ticker ticker = new Ticker(); } 15 Tách 1 ủy nhiệm hàm ra khỏi 1 sự kiện • Tạo 1 thể hiện ủy nhiệm hàm cùng kiểu như sự kiện và tách thể hiện ủy nhiệm hàm này ra khỏi sự kiện dùng toán tử -=. Ví dụ: class Clock{ ...... public void Stop(){ ticker.Tick -= new TickHandler(this.RefreshTime); } private void RefreshTime(){......} private Ticker ticker = new Ticker(); } 16 Cài đặt 1 sự kiện • Dùng dấu ngoặc chính xác như sự kiện là 1 phương thức, cung cấp đối số phù hợp kiểu. Nhớ kiểm tra sự kiện có là null hay không. Ví dụ: class Ticker{ public event TickHandler Tick; ...... private void Raise(){ if(Tick != null){ Tick(); } } } 1Chương 17 Toán tử nạp chồng Nguyễn Hồng Phương Khoa CNTT, ĐHBKHN 2Làm việc với các toán tử • Bạn dùng các kí hiệu toán tử chuẩn (vd: +, -) để thực thi các thao tác chuẩn (vd: cộng, trừ) trên các kiểu (vd: int, double) • Các kiểu số được xây dựng sẵn đi cùng với các hành vị được định nghĩa trước của chúng cho mỗi toán tử nhưng các kiểu định nghĩa người dùng thì không. • C# cho phép các kiểu định nghĩa người dùng thực thi hành vi quen thuộc. 3Toán tử • Mỗi kí hiệu toán tử có 1 quyền ưu tiên. Vd: * có quyền cao hơn + • Sự kết hợp từ trái qua phải hay từ phải qua trái. • Toán tử 1 ngôi là toán tử chỉ có 1 toán hạng,vd: ++ • Toán tử 2 ngôi là toán tử có 2 toán hạng, vd: * 4Thực thi các ràng buộc toán tử • C# cho phép bạn thực thi hầu hết các kí hiệu toán tử đang tồn tại cho các kiểu của chính bạn • Các quy tắc: – Không thể thay đổi độ ưu tiên và sự kết hợp của 1 toán tử. VD: a+b*c thì luôn là a+(b*c). – Không thể thay thế số toán hạng của 1 toán tử.VD: Toán tử * luôn là 2 ngôi. – Không thể phát minh ra kí hiệu toán tử mới. VD: phép ** cho lũy thừa!!! – Không thể thay đổi ý nghĩa của các toán tử khi áp dụng cho những kiểu có sẵn. – Có vài kí hiệu toán tử mà bạn không thể nạp chồng.VD: toán tử chấm (truy cập thành phần) 5Các toán tử nạp chồng • Để định nghĩa hành vi toán tử của chính bạn, bạn phải nạp chồng 1 toán tử được chọn. • Bạn dùng cú pháp như phương thức với kiểu trả về các tham số nhưng tên của phương thức là từ khóa operator cùng kí hiệu toán tử bạn đang khai báo. • Ví dụ: cấu trúc Hour định nghĩa toán tử 2 ngôi để cộng 2 thể hiện của Hour lại: 6Các toán tử nạp chồng struct Hour{ public Hour(int initialValue){ value = initialValue; } public static Hour operator+(Hour lhs, Hour rhs){ return new Hour(lhs.value + rhs.value); } private int value; } •Tất cả các toán tử là toàn cục •Toán tử là tĩnh. Các toán tử không bao giờ là đa hình, vì vậy chúng không thể dùng ảo, trừu tượng, ghi đè, niêm phong. •Toán tử không bao giờ có 1 tham số ẩn this như trong C++ 7Tạo các toán tử đối xứng void Direct(Hour a, int b){ Hour sum = a+b; } void Indirect(Hour a, int b){ Hour sum = a+new Hour(b); } struct Hour{ public Hour(int initialValue){ value = initialValue; } public static Hour operator+(Hour lhs, Hour rhs){ return new Hour(lhs.value + rhs.value); } public static Hour operator+(Hour lhs, int rhs){ return lhs + new Hour(rhs); } public static Hour operator+(int lhs, Hour rhs){ return new Hour(lhs + rhs.value); } private int value; } 8Tìm hiểu phép gán kết hợp • C# không cho phép khai báo bất kì toán tử gán định nghĩa người dùng. Tuy nhiên, một toán tử gán kết hợp (vd: +=) luôn được thực thi: a+=b luôn được thực thi a=a+b. void Example(Hour a, int b){ a+=a; // tương tự a=a+a a+=b; // tương tự a=a+b b+=a; //không hợp lệ } 9Khai báo các toán tử tăng giảm • C# cho phép khai báo phiên bản của các toán tử tăng(++) và giảm(--) của chính bạn. struct Hour{ ...... public static Hour operator++(Hour arg){ arg.value++; return arg; } } 10 Các toán tử tăng giảm Hour now = new Hour(9); Hour postfix = now++; Hour now = new Hour(9); Hour prefix = ++now; Hour now = new Hour(9); Hour postfix = now; now = Hour.operator++(now); Hour now = new Hour(9); now = Hour.operator++(now); Hour postfix = now; 11 Sử dụng toán tử đôi • Nếu đã khai báo phải khai báo != và == theo cặp. • Quy tắc này không áp dụng cho , =. struct Hour{ public Hour(int initialValue){......} public static bool operator==(Hour lhs, Hour rhs){ return lhs.value==rhs.value; } public static bool operator!=(Hour lhs, Hour rhs){ return lhs.value!=rhs.value; } private int value; } 12 Cấu trúc và lớp • Việc thực thi toán tử tăng trong cấu trúc Hour là chính xác, nhưng nếu đổi Hour thành lớp thì không còn chính xác nữa. 13 Khai báo các toán tử chuyển đổi kiểu • Giá trị của 1 kiểu được chuyển sang giá trị của 1 kiểu khác. class Example{ public static void Method(double param){......} } Example.Method(42);// chuyển int sang double • Không chuyển từ double sang int. Muốn chuyển phải ép kiểu 14 Toán tử chuyển đổi định nghĩa người dùng • Cú pháp: toán tử chuyển đổi là toàn cục và tĩnh struct Hour{ public static implicit operator int(Hour from){ return from.value; } private int value; } • Toán tử chuyển đổi không tường minh (implicit) hay tường minh (explicit). • Nếu toán tử chuyển đổi là tường minh thì nó yêu cầu sự ép kiểu tường minh. 1Chương 18 Windows Forms Nguyễn Hồng Phương Khoa CNTT, ĐHBKHN 2Giới thiệu • Một form đơn giản là lớp kế thừa từ System.Windows.Forms.Form. • Mã nguồn chứa các phương thức: Main, Dispose, phương thức khởi tạo,... • Phương thức Main là điểm vào của ứng dụng. • Phương thức Dispose giải phóng các tài nguyên mà form giữ. 3Các thuộc tính chung của Windows Forms Thuộc tính Mô tả (Name) Tên form. hai form trong cùng dự án không được trùng tên. BackColor Màu nền của văn bản hay hình ảnh trên form BackgroundI mage Hình nền của form. Nếu nhỏ hơn form, nó sẽ được làm đầy form Font Font dùng cho các thành phần nhúng trên form, hiển thị văn bản. Nó bao gồm: tên, kích thước, nghiêng,... ForeColor Màu nổi bật của văn bản hay hình ảnh trên form 4Các thuộc tính chung của Windows Forms Thuộc tính Mô tả FormBorderSt yle Diện mạo và kiểu đường viền form. Mặc định là Sizable Icon Icon xuất hiện trên thanh tác vụ MaximizeBox Lệnh maximize trên trình đơn hay thanh tiêu đề có tác dụng? MaximumSize Kích thước lớn nhất của form. Mặc định (0,0) chỉ ra rằng không có kích thước lớn nhất và user có thể thay đổi kích thước của form MinimizeBox Đối ngẫu MaximizeBox MinimumSize Đối ngẫu với MaximumBox 5Các thuộc tính chung của Windows Forms Thuộc tính Mô tả Size Kích thước của form khi lần đầu hiển thị Text Văn bản xuất hiện trên thanh tiêu đề WindowState Trạng thái khởi đầu của form khi nó xuất hiện lần đầu ControlBox Gỡ bỏ trình đơn hệ thống khỏi thanh tiêu đề khi nó = False Opacity Độ trong suốt của form 6Thay đổi thuộc tính ở thời gian chạy • Có thể viết mã chương trình để thay đổi động các thuộc tính ở thời gian chạy. • Ví dụ: thay đổi kích thước form. • Thực hiện ví dụ BellRingers chương 18. 7Tạo ứng dụng Windows Forms • Tạo ứng dụng Middleshire Bell Ringers Association bằng cách tạo một dự án mới, thiết kế giao diện, thêm các thành phần điều khiển lên form. • Các bước tiến hành: – Khởi động VS.NET – Từ trình đơn File, chọn New, chọn Project – Trong khung Project Types, chọn Visual C# Projects – Trong khung Templates, chọn Windows Application – Nhập vào hộp Name tên “BellRingers” – Định vị dự án dùng Location. 8Tạo ứng dụng Windows Forms – Bấm OK, một dự án mới được tạo ra, chứa một form trống có tên là Form1 • Thiết lập các thuộc tính của form: – Hiển thị cửa sổ Properties từ trình đơn view – Dùng thuộc tính Name, đổi tên form thành “MemberForm” – Chọn thuộc tính Text, nhập “Middleshire Bell Ringers Association – Members” để thay đổi tiêu đề form – Chọn thuộc tính BackgroundImage, bấm nút tỉnh lược (...) mở hộp thoại, chọn file ảnh Bell.gif 9Tạo ứng dụng Windows Forms • Chọn thuộc tính BackColor, nhấn mũi tên xuống, chọn thẻ System, bấm chọn Windows để thiết lập màu nền cho tất cả thành phần điều khiển thả trên form. • Chọn thuộc tính đa hợp Font, thiết lập Size của font là 12, thuộc tính Bold là True. • Thay đổi thuộc tính đa hợp Size: thuộc tính Width là 600, Height là 450 10 Tạo ứng dụng Windows Forms • Biên dịch thử, thấy có lỗi vì ta đã thay đổi tên form thành MemberForm • Sửa chữa: –Hiển thị mã nguồn Form1.cs bằng cách ấn F7. –Tìm phương thức Main, sửa lại đoạn mã thành: Application.Run(new MemberForm()); • Tạo dựng và chạy lại ứng dụng thành công. 11 Tạo ứng dụng Windows Forms • Thêm các thành phần điều khiển lên form: 12 Thiết lập giá trị cho các thuộc tính của các điều khiển Điều khiển Thuộc tính Giá trị label1 Text Location First Name 10, 20 textBox1 (Name) Location Size Text firstName 120, 20 170, 26 để trống label2 Text Location Last Name 300, 20 textBox2 (Name) Location Size Text lastName 400, 20 170, 26 để trống 13 Thiết lập giá trị cho các thuộc tính của các điều khiển Điều khiển Thuộc tính Giá trị label3 Text Location Tower 10, 72 comboBox1 (Name) DropDownStyle Location Size tower DropDownList 120, 72 260, 28 checkBox1 (Name) Location Size Text CheckAlign captain 400, 72 100, 26 Captain MiddleLeft label4 Text Location Size Member Since 10, 128 120, 23 14 Thiết lập giá trị cho các thuộc tính của các điều khiển Điều khiển Thuộc tính Giá trị DateTimePicker (Name) Location Size memberSince 140, 128 200, 26 groupBox1 (Name) Location Size Text experience 10, 184 260, 160 Experience radioButton1 (Name) Location Size Text novice 16, 32 220, 24 Up to 1 year radioButton2 (Name) Location Size Text intermediate 16, 64 220, 24 1 to 4 years 15 Thiết lập giá trị cho các thuộc tính của các điều khiển Điều khiển Thuộc tính Giá trị radioButton3 (Name) Location Size Text experienced 16, 96 220, 24 5 to 9 years radioButton4 (Name) Location Size Text accomplished 16, 128 220, 24 10 or more years checkedListBox1 (Name) Location Size Sorted methods 300, 192 270, 160 True 16 Thiết lập giá trị cho các thuộc tính của các điều khiển Điều khiển Thuộc tính Giá trị button1 (Name) Location Size Text add 190, 368 75, 40 Add button2 (Name) Location Size Text clear 335, 368 75, 40 Clear 17 Thay đổi thuộc tính bằng mã lệnh • Bạn đã học cách thiết lập giá trị các thuộc tính lúc design. • Bạn cũng có thể thiết lập và lấy giá trị thuộc tính bằng mã chương trình, và đặc biệt, có 1 số thuộc tính chỉ có thể thiết lập ở thời gian chạy. • Chúng ta tiếp tục thực hành ví dụ trên bằng cách tạo phương thức Reset: – Từ trình đơn View, bấm chọn Class View – Trong cửa sổ Class View, mở rộng dự án BellRingers, bấm phải chuột lên lớp MemberForm 18 Thay đổi thuộc tính bằng mã lệnh –Trỏ chuột đến Add, chọn Add Method –Nhập Reset vào hộp Method name, bấm Finish –Trong cửa sổ soạn thảo, thêm dòng mã: firstName.Text = “”; lastName.Text = “”; • Đưa dữ liệu vào ComboBox: – thêm các phát biểu sau: tower.Items.Clear(); tower.Items.Add(“Great Shevington”); tower.Items.Add(“Little Mudford”); tower.Items.Add(“Upper Gumtree”); tower.Items.Add(“Downley Hatch”); 19 Thay đổi thuộc tính bằng mã lệnh • Thiết lập ngày hiện thời: khởi tạo thành phần DateTimePicker memberSince tới ngày hiện thời memberSince.Value = DateTime.Today; • Khởi tạo CheckBox: CheckBox captain mặc định là False captain.Checked = false; • Khởi tạo nhóm nút radio: sức mạnh của radio tăng lên khi bạn đặt chúng vào trong GroupBox. Thêm dòng sau: novice.Checked = true; 20 Thay đổi thuộc tính bằng mã lệnh • Điền giá trị vào ListBox: hoàn tất phương thức Reset với các dòng: methods.Items.Clear(); methods.ITems.Add(“Andover Bob Minor”); methods.ITems.Add(“Antelope Place Doubles”); methods.ITems.Add(“Hayfield Royal”); methods.ITems.Add(“West Chiltington Doubles”); methods.ITems.Add(“Brandon Parva Maximus”); methods.ITems.Add(“Buckfast Abbey Triples”); methods.ITems.Add(“Skelwith Bridge Minor”); methods.ITems.Add(“Acton Trussel Bob Royal”); 21 Gọi phương thức Reset Đặt Reset() tại đây 22 Xử lý sự kiện trong Windows Forms • Xử lý sự kiện cho nút Clear: –Ở chế độ Design View, chọn nút Clear trên form. –Trong cửa sổ Properties, chọn Events. –Chọn sự kiện Click. –Nhập clearClicked vào và nhấn Enter. –Viết mã: private void clearClicked(object sender, System.EventArgs e) { Reset(); } 23 Xử lý sự kiện trong Windows Forms • Xử lý sự kiện cho nút Add: – Ở chế độ Design View, chọn nút Add. – Trong cửa sổ Properties, chọn Events. – Chọn sự kiện Click. – Nhập addClicked vào và nhấn Enter. – Viết mã: private void addClick(object sender, System.EventArgs e) { string details; details = "Member name " + firstName.Text + " " + lastName.Text + " from the tower at " + tower.Text; MessageBox.Show(details, "Member Information"); } 24 Sự kiện Closing của form • Được phát sinh khi user cố đóng form trước khi form thực sự được đóng lại. • Có thể dùng sự kiện này để nhắc user lưu dữ liệu hoặc hỏi họ có chắc chắn không. • Thực hành: – Trở về chế độ Design View, chọn form – Chọn Events, nhập “memberFormClosing” trong sự kiện Closing rồi nhấn Enter 25 Sự kiện Closing của form • Thêm lệnh sau vào: private void memberFormClosing(object sender, System.ComponentModel.CancelEventArgs e) { DialogResult key = MessageBox.Show("Are you sure you want to quit", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question); e.Cancel = (key == DialogResult.No); } 1Chương 19 Trình đơn Nguyễn Hồng Phương Khoa CNTT, ĐHBKHN 2Trình đơn và kiểu trình đơn • Mục đầu tiên là trình đơn File, thường có các lệnh: tạo mới, mở tài liệu, lưu tài liệu, in tài liệu, thoát ứng dụng. • Trình đơn Edit có: Cut, Paste, Clear, Find,... • Trình đơn Help ở cuối cùng chứa lệnh giúp đỡ và thông tin “about” • Tham khảo hướng dẫn trên web 3Tạo và xử lý các sự kiện trình đơn • Có 2 cách để tạo trình đơn: –Hướng đồ họa: dùng môi trường IDE –Viết mã lệnh: tạo đối tượng MainMenu, sau đó thêm đối tượng MenuItem • Thực hành tạo trình đơn theo hướng tiếp cận đồ họa cho ứng dụng Middleshire Bell Ringers Association trong chương 18. 4Tạo trình đơn File • Mở dự án BellRingers • Hiển thị MemberForm trong cửa sổ Design View. • Kéo thả thành phần MainMenu từ Toolbox lên form. • Bấm chọn nhãn Type Here, nhập vào &File rồi nhấn Enter. • Tiếp tục thêm &New, &Open, &Save Member, dấu gạch ngang, &Print, dấu gạch ngang, E&xit 5Tạo trình đơn File 6Thiết lập các thuộc tính của mục trình đơn • Bấm chọn thành phần điều khiển mainMenu1 bên dưới form. trong cửa sổ Properties, thay đổi tên thành mainMenu. • Bấm chuột phải lên mục trình đơn File trên thanh trình đơn của form, chọn Edit Names. 7Thiết lập các thuộc tính của mục trình đơn • Bấm chọn mục menuItem1, nhập fileItem, nhấn Enter. • Đổi tên các mục trình đơn còn lại: Mục Tên mới [menuItem2] newItem [menuItem3] openItem [menuItem4] saveItem [menuItem6] printItem [menuItem8] exitItem • Khi hoàn tất, bấm phải chuột lên trình đơn filemenu, bỏ chọn dòng lệnh Edit Names 8Thiết lập các thuộc tính của mục trình đơn • Thêm phím tắt vào một mục trình đơn bằng cửa sổ Properties: – Chọn mục trình đơn Save Member trong trình đơn File trên form. Bấm chọn Shortcut trong cửa sổ Properties. Chọn CtrlS. – Chọn thuộc tính ShowShortcut bên dưới, đặt nó là true.(phím tắt được hiển thị) – Làm tương tự với các mục khác: NewItem(CtrlN), openItem(CtrlO), printItem(CtrlP), exitItem(AltF4). • Nếu muốn mục nào đó không thể chọn, thiết lập thuộc tính Enabled trong cửa sổ Properties là False. Ví dụ menuPrint không thể chọn nếu chưa có dữ liệu. 9Các thuộc tính của mục trình đơn Thuộc tính Mô tả (Name) Tên của mục trình đơn Checked Các mục hành động như hộp kiểm và hiện ra dấu kiểm khi được chọn. Giá trị True/False DefaultItem Mục trình đơn là mặc định hay không Enabled Mục trình đơn rõ hay mờ đi RadioCheck Liên kết với thuộc tính Checked Shortcut Phím tắt ShowShortcut Hiển thị phím tắt nếu là True Text Dòng văn bản hiển thị Visible Một mục có hiển thị hay không 10 Các sự kiện trình đơn • Có 5 sự kiện trình đơn khác nhau khi user truy xuất tới một mục trình đơn: Sự kiện Mô tả Click Xảy ra khi user bấm lên mục trình đơn DrawItem Xảy ra khi mục trình đơn được vẽ lại MeasureItem Xảy ra khi trình thực thi đang quyết định độ cao của mục trình đơn. Popup Xảy ra khi trình đơn được hiển thị Select Xảy ra khi user chọn mục trình đơn 11 Xử lý các sự kiện mục trình đơn • Sự kiện bấm chọn mục New trên File: –Bấm chọn File và chọn New –Trong cửa sổ Properties, nhấn Events, chọn sự kiện Click, nhập newClick, ấn Enter –Một phương thức sự kiện mới ra đời, nhập vào đoạn mã dòng lệnh: Reset(); • Enabled của Print thành True: printItem.Enabled = true; • Phương thức sự kiện Click cho Exit: nhập vào Close(); 12 • Ép buộc tất cả các form đóng lại: Application.Exit(); 13 Trình đơn Popup • Tạo trình đơn Popup: –Tạo 1 trình đơn Popup gắn vào 2 textbox firstName và lastName cho phép user xóa các thành phần này. –Tạo 1 trình đơn Popup gắn vào form và chứa các lệnh lưu thông tin của thành viên hiện thời và xóa form. 14 Tạo trình đơn Popup • Trong cửa sổ Design View đang hiển thị MemberForm, kéo thả điều khiển ContextMenu vào form • Chọn thành phần điều khiển contextMenu1, đổi tên (Name) thành textBoxMenu • Bấm chọn văn bản Context Menu, nhãn Type Here xuất hiện. • Bấm chọn Type Here, nhập vào Clear Text, ấn Enter. • Chọn thành phần điều khiển Clear Text, nhập textBoxClearItem trong hộp Name của cửa sổ Properties rồi nhấn Enter. 15 Tạo trình đơn Popup • Bấm chọn hộp văn bản firstName, đổi thuộc tính ContextMenu thành textBoxMenu. • Tương tự với hộp văn bản lastName. • Nhấp phải chuột lên thành phần textBoxMenu ở cuối form, chọn Edit Menu. Một trình đơn xuất hiện bên dưới nhãn Context Menu • Từ trình đơn, chọn Clear Text • Trong cửa sổ Properties, chọn Events, nhập “textBoxClearClick” vào hộp văn bản sự kiện Click rồi nhấn Enter 16 Tạo trình đơn Popup • Thêm phát biểu sau vào phương thức sự kiện: private void textBoxClearClick(object sender, System.EventArgs e) { if (textBoxMenu.SourceControl.Equals(firstName)) { firstName.Clear(); } else { lastName.Clear(); } } Nếu thuộc tính SourceControl của trình đơn Popup tham chiếu tới hộp văn bản firstName thì firstName.Clear() sẽ làm rỗng nó 17 Tạo trình đơn Popup động sử dụng mã chương trình • Chuyển qua Code View của MemberForm, xác định phương thức khởi dựng cho MemberForm. • Trình đơn Popup này sẽ chứa 2 mục là Save member và Clear. • Thêm dòng sau vào dưới Reset() trong phương thức khởi dựng: 18 Tạo trình đơn Popup động sử dụng mã chương trình MenuItem[] formMenuItemList = new MenuItem[2]; formMenuItemList[0] = saveItem.CloneMenu(); MenuItem clearItem = new MenuItem("&Clear", new System.EventHandler(clearClicked)); formMenuItemList[1] = clearItem; ContextMenu formMenu = new ContextMenu(formMenuItemList); this.ContextMenu = formMenu; 1Chương 20 Thực thi hiệu lực Nguyễn Hồng Phương Khoa CNTT, ĐHBKHN 2Hiệu lực dữ liệu • Thuộc tính Cause Validation: đều có ở các điều khiển và form. Mặc định là True. • Nếu là true, thì khi điều khiển đó nhận focus và điều khiển trước mất focus sẽ được hiệu lực. • Nếu hiệu lực này thất bại thì focus sẽ trả lại điều khiển trước. • Nhận xét: thuộc tính Cause Validation không áp dụng đối với bản thân điều khiển đó nhưng có tác dụng với tất cả các điều khiển khác trên form 3Các sự kiện hiệu lực • Để hiệu lực dữ liệu trong một điều khiển, bạn phải sử dụng 2 sự kiện: Validating và Validated. • Sự kiện Validating xuất hiện khi focus ra khỏi 1 điều khiển và cố nhảy qua 1 điều khiển có thuộc tính CauseValidation là true. Dùng sự kiện này để kiểm tra giá trị của 1 điều khiển đang mất focus. • Sự kiện Validated xuất hiện sau sự kiện Validating(nếu nó không bị hủy bỏ) nhưng trước khi điều khiển đó mất focus. Bạn không thể hủy bỏ sự kiện này. 4Thực hành Tước vị: Mr, Mrs, Miss, Ms 5Các bước • Mở dự án CustomerDetails trong chương 20. • Nhấp đúp vào CustomerForm.cs để hiển thị form trong vùng thiết kế. • Nhập các giá trị tước vị vào mục ITems của hộp comboBox Title. • Quy tắc: Tước vị là Mr thì giới tính là Male, ngược lại là Female. 6Phương thức titleValidating và

Các file đính kèm theo tài liệu này:

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