Giáo trình Lập trình Windows Forms - Trình độ: Cao đẳng - Trường Cao đẳng kỹ thuật công nghệ
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình Windows Forms - Trình độ: Cao đẳng - Trường Cao đẳng kỹ thuật công nghệ", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- giao_trinh_lap_trinh_windows_forms_trinh_do_cao_dang_truong.docx
Nội dung text: Giáo trình Lập trình Windows Forms - Trình độ: Cao đẳng - Trường Cao đẳng kỹ thuật công nghệ
- BM/QT10/P.ĐTSV/04/04 Ban hành lần: 3 UBND TỈNH BÀ RỊA – VŨNG TÀU TRƯỜNG CAO ĐẲNG KỸ THUẬT CÔNG NGHỆ GIÁO TRÌNH MÔ ĐUN: LẬP TRÌNH WINDOWS FORMS NGHỀ: CÔNG NGHỆ THÔNG TIN TRÌNH ĐỘ: CAO ĐẮNG (Ban hành kèm theo Quyết định số: /QĐ-CĐKTCN ngày .tháng .năm của Hiệu trưởng Trường Cao đẳng Kỹ thuật Công nghệ BR – VT) BÀ RỊA-VŨNG TÀU, NĂM 2020.
- TUYÊN BỐ BẢN QUYỀN Nhằm đáp ứng nhu cầu học tập và nghiên cứu cho giảng viên và sinh viên nghề Công nghệ Thông tin trong trường Cao đẳng Kỹ thuật Công nghệ Bà Rịa – Vũng Tàu, chúng tôi đã thực hiện biên soạn tài liệu Lập trình Windows Forms này. Tài liệu được biên soạn thuộc loại giáo trình phục vụ giảng dạy và học tập, lưu hành nội bộ trong Nhà trường nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo. Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu lành mạnh sẽ bị nghiêm cấm.
- LỜI GIỚI THIỆU Giáo trình Lập trình Windows Forms được biên soạn dựa trên khung chương trình đào tạo Cao đẳng nghề Công nghệ Thông tin đã được Trường Cao đẳng Kỹ thuật Công nghê Bà Rịa – Vũng Tàu phê duyệt. Bên cạnh đó nhằm giúp cho người học các kiến thức và kỹ năng cần thiết để thiết kế và lập trình được các ứng dụng nhỏ trong cuộc sống hằng ngày . Tác giả đã nghiên cứu một số tài liệu, trang web liên quan kết hợp với kinh nghiệm làm việc, giảng dạy thực tế để biên soạn giáo trình này. Trong giáo trình này bao gồm các bài sau: Bài 1: Giới thiệu tổng quan Bài 2: Các thành phần cơ bản Bài 3: Sử dụng câu lệnh nhập xuất cơ bản, cấu trúc điều khiển if Bài 4: Sử dụng cấu trúc lựa chọn switch case, for, for each Bài 5: Sử dụng cấu trúc vòng lặp while, do while Bài 6: Sử dụng câu lệnh break, continue, goto Bài 7: Hàm Bài 8: Thiết kế lớp đối tượng Bài 9: Định nghĩa các thuộc tính, phương thức hành động cho lớp đối tượng Bài 10: Sử dụng Form, MenuStrip Bài 11: Sử dụng Button, Label, TextBox Bài 12: Sử dụng Checkbox, RadioButton, GroupBox Bài 13: Sử dụng ComboBox, ListBox Bài 14: Sử dụng DateTimePicker, MonthCalendar Bài 15: Sử dụng ListView, TreeView 1
- Bài 16: Sử dụng PictureBox, ToolTip Bài 17: Sử dụng CheckListBox, NumericUpDown Bài 18: Sử dụng Panel, SplitContainer, TabControl Bài 19: Tạo kết nối, đóng kết nối cơ sở dữ liệu Bài 20: Truy xuất cơ sở dữ liệu bằng Dataset Bài 21: Hiển thị cơ sở dữ liệu bằng DataGridView Bài 22: Truy xuất cơ sở dữ liệu bằng BindingSource Bài 23: Hiển thị cơ sở dữ liệu bằng BindingNavigator Bài 24: Cập nhật cơ sở dữ liệu Với tiêu chí trình bày cô động, dễ hiểu áp dụng thực tế, kèm theo chi tiết các bước hướng dẫn thực hành cụ thể giúp cho người học dễ tiếp thu các kiến thức cần thiết và hình thành được kỹ năng thực hành và rèn luyện thao tác. Trong quá trình biên soạn, chắc chắn giáo trình còn nhiều thiếu sót. Tác giả rất mong nhận được ý kiến đóng góp của quý thầy/cô và các em sinh viên để tiếp tục hoàn thiện hơn. Xin chân thành cảm ơn quý đồng nghiệp, bạn bè đã có những ý kiến đóng góp trong quá trình xây dựng giáo trình này. Bà Rịa – Vũng Tàu, ngày tháng năm 2020 Tham gia biên soạn 1. Trần Thị Thanh Hương – Chủ biên 2
- MỤC LỤC LỜI GIỚI THIỆU 1 BÀI 1: GIỚI THIỆU TỔNG QUAN 10 1.1. Giới thiệu các ứng dụng thực tế 10 1.2. Khởi động, thoát chương trình 11 1.3. Sử dụng hệ thống trợ giúp 15 Câu hỏi ôn tập và bài tập 15 BÀI 2: CÁC THÀNH PHẦN CƠ BẢN 16 2.1. Hệ thống ký hiệu và từ khóa 16 2.2. Các kiểu dữ liệu cơ bản 17 2.3. Biến, hằng, biểu thức 19 2.4. Các phép toán 21 Câu hỏi ôn tập và bài tập 26 BÀI 3: SỬ DỤNG CÂU LỆNH NHẬP XUẤT CƠ BẢN, CẤU TRÚC ĐIỀU KHIỂN IF 28 3.1. Các câu lệnh nhập xuất cơ bản 28 2. Câu lệnh if else 32 Câu hỏi ôn tập và bài tập 36 BÀI 4: SỬ DỤNG CẤU TRÚC LỰA CHỌN SWITCH CASE, FOR, FOR EACH 38 2. Câu lệnh switch 38 2. Câu lệnh for 40 3. Câu lệnh for each 49 Câu hỏi ôn tập và bài tập 52 BÀI 5: SỬ DỤNG CẤU TRÚC LỰA VÒNG LẶP WHILE, DO WHILE 54 3. Sử dụng cấu trúc vòng lặp While 54 2. Sử dụng cấu trúc vòng lặp Do while 57 Câu hỏi ôn tập và bài tập 59 3
- BÀI 6: SỬ DỤNG CÂU LỆNH BREAK, CONTINUE, GOTO 60 4. Sử dụng câu lệnh break 60 2. Sử dụng câu lệnh continue 61 3. Sử dụng câu lệnh goto 62 Câu hỏi ôn tập và bài tập 64 BÀI 7: HÀM 65 5. Khái niệm 65 2. Quy tắc xây dựng hàm 65 3. Nguyên tắc hoạt động của hàm 66 4. Cách truyền tham số 68 5. Sử dụng hàm 69 Câu hỏi ôn tập và bài tập 72 BÀI 8: THIẾT KẾ LỚP ĐỐI TƯỢNG 73 7. Định nghĩa lớp đối tượng 73 2. Khai báo lớp đối tượng 74 Câu hỏi ôn tập và bài tập 77 BÀI 9 : ĐỊNH NGHĨA CÁC THUỘC TÍNH, PHƯƠNG THỨC HÀNH ĐỘNG CHO LỚP ĐỐI TƯỢNG 78 8. Định nghĩa các thuộc tính cho lớp đối tượng 78 2. Định nghĩa các phương thức hành động cho lớp đối tượng 80 Câu hỏi ôn tập và bài tập 83 BÀI 10: SỬ DỤNG FORM, MENUSTRIP 85 9. Form 85 2. Menustrip 96 Câu hỏi ôn tập và bài tập 99 BÀI 11: SỬ DỤNG LABEL, TEXTBOX, BUTTON 102 11. Label 102 2. TextBox 105 4
- 3. Button 108 Câu hỏi ôn tập và bài tập 110 BÀI 12: SỬ DỤNG CHECKBOX, RADIOBUTTON, GROUPBOX 113 13. Checkbox 113 2. RadioButton 115 3. GroupBox 118 Câu hỏi ôn tập và bài tập 121 BÀI 13: SỬ DỤNG COMBOBOX, LISTBOX 123 1. ComboBox 123 2. ListBox 125 Câu hỏi ôn tập và bài tập 128 BÀI 14: SỬ DỤNG DATETIMEPICKER, MONTHCALENDAR 129 1. DateTimePicker 129 2. MonthCalendar 130 Câu hỏi ôn tập và bài tập 132 BÀI 15: SỬ DỤNG LISTVIEW, TREEVIEW 133 1. ListView 133 2. TreeView 138 Câu hỏi ôn tập và bài tập 142 BÀI 16: SỬ DỤNG PICTUREBOX, TOOLTIP 144 1. PictureBox 144 2. ToolTip 145 Câu hỏi ôn tập và bài tập 148 BÀI 17: SỬ DỤNG CHECKLISTBOX, NUMERICUPDOWN 150 1. CheckListBox 150 2. NumericUpDown 152 Câu hỏi ôn tập và bài tập 154 BÀI 18: SỬ DỤNG PANEL, SPLITCONTAINER, TABCONTROL 156 5
- 1. Panel 156 2. SplitContainer 157 3. TabControl 161 Câu hỏi ôn tập và bài tập 166 BÀI 19: TẠO KẾT NỐI, ĐÓNG KẾT NỐI CƠ SỞ DỮ LIỆU 168 1. Các kiểu dữ liệu kết nối 168 2. Tạo kết nối dữ liệu 171 3. Đóng kết nối cơ sở dữ liệu 176 Câu hỏi ôn tập và bài tập 177 BÀI 20: TRUY XUẤT CƠ SỞ DỮ LIỆU BẰNG DATASET 178 1. Định nghĩa Dataset. 178 2. Thao tác truy xuất dữ liệu với Dataset. 179 Câu hỏi ôn tập và bài tập 181 BÀI 21: HIỂN THỊ CƠ SỞ DỮ LIỆU BẰNG DATAGRIDVIEW 183 1. Ý nghĩa DataGridView 183 2. Các thiết lập thuộc tính 185 3. Truy xuất và hiển thị dữ liệu trên control DataGridView 186 Câu hỏi ôn tập và bài tập 189 BÀI 22: TRUY XUẤT CƠ SỞ DỮ LIỆU BẰNG BINDINGSOURCE 191 1. Ý nghĩa BindingSource 191 2. Cách thiết lập các thành phần 192 3. Truy xuất và hiển thị dữ liệu trên BindingSource 192 Câu hỏi ôn tập và bài tập 193 BÀI 23: HIỂN THỊ CƠ SỞ DỮ LIỆU BẰNG BINDINGNAVIGATOR 194 1. Ý nghĩa BindingNavigator 194 2. Cách thiết lập các thành phần 195 3. Truy xuất và hiển thị dữ liệu trên BindingNavigator 196 Câu hỏi ôn tập và bài tập 197 6
- BÀI 24: THAO TÁC VỚI CƠ SỞ DỮ LIỆU 198 1. Các kiểu dữ liệu, cập nhật cơ sở dữ liệu 198 2. Truy xuất và cập nhật dữ liệu 200 Câu hỏi ôn tập và bài tập 202 TÀI LIỆU THAM KHẢO 204 7
- GIÁO TRÌNH MÔ ĐUN Tên mô đun: Lập trình Windows forms Mã mô đun: MĐ 20 Vị trí, tính chất, ý nghĩa và vai trò của mô đun: - Vị trí của mô đun: Mô đun được bố trí sau khi học sinh học xong các mô đun Cơ sở dữ liệu, Lập trình căn bản, Quản trị cơ sở dữ liệu SQL Server - Tính chất của mô đun: Là mô đun chuyên môn nghề. Đây là mô đun chứa đựng kiến thức nền tảng về ngôn ngữ lập trình ứng dụng và xây dưng các phần mềm ứng dụng quản lý. - Ý nghĩa và vai trò của môn học/mô đun: Môn học giúp thực hành được các giao diện lập trình ứng dụng nhỏ như: quản lý quán café, quản lý khách sạn, quản lý nhân viên, quản lý sinh viên . Mục tiêu của mô đun: - Về kiến thức: + Trình bày các kiểu dữ liệu cơ bản của C#. + Trình bày các câu lệnh, cấu trúc điều khiển, rẽ nhánh. + Trình bày các control xây dựng giao diện. - Về kỹ năng: + Xác định, phân tích chức năng yêu cầu để lên kế hoạch xây dựng chương trình ứng dụng. + Thiết kế giao diện chương trình ứng dụng. + Vận dụng các kiến thức xây dựng các chức năng của ứng dụng. + Kiểm tra và xử lý có hệ thống các lỗi và sự cố ứng dụng. + Đóng gói ứng dụng và triển khai. - Về năng lực tự chủ và trách nhiệm: + Chủ động trong việc thực tế hóa các ứng dụng phần mềm (Xây dựng các ứng dụng làm toán, ) + Phát triển các chương trình ứng dụng trong quá trình học tập thành các phần mềm quản lý (Nhà hàng, khách sạn, bán hàng, giáo dục ) trong thực tế. 8
- + Gia công các phần mềm theo yêu cầu khách hàng. + Tham gia các đội triển khai phần mềm trong các dự án phần mềm. Nội dung của mô đun: 9
- BÀI 1: GIỚI THIỆU TỔNG QUAN Mã bài: 19.01 Giới thiệu: C# hay Csharp là một trong những ngôn ngữ lập trình trong họ DotNet của Microsoft và khi lập trình C# người lập trình phải chuẩn bị và cài đặt .NET Framework. Mục tiêu: - Trình bày nhu cầu xây dựng các ứng dụng thực tế. - Cài đặt, thao tác chương trình ViSual Studio. - Thao tác hệ thống trợ giúp từ trình đơn Help. - Rèn luyện tính cẩn thận, sáng tạo, làm việc nhóm. Nội dung chính: 1.1. Giới thiệu các ứng dụng thực tế .NET Framework là gì ? .NET Framework là nền tảng phát triển hoàn hảo của Microsoft, cung cấp cho lập trình viên các thư viện dùng chung hỗ trợ cho việc phát triển các kiểu ứng dụng khác nhau bao gồm: - Ứng dụng ASP.NET - Ứng dụng Windows Form - Web Services - Windows Services - Ứng dụng mạng và các ứng dụng điều khiển truy cập từ xa Các ứng dụng thực tế: - Quản lý khách sạn - Quản lý bệnh viện - Quản lý đào tạo - Quản lý sinh viên - Quản lý thư viện . 10
- 1.2. Khởi động, thoát chương trình Để tải Visual Studio 2019, thực hiện vào link: Hình 1.1. Màn hình Download phần mềm cài đặt Visual Studio Ở trên có 3 phiên bản Visual Studio 2019. Đó là: Community, Professional và Enterprise. Với Sinh Viên thì tải bản Community là được. File sau khi tải được được lưu trữ như sau: Hình 1.2. Hiển thị file lưu trữ cài đặt Visual Studio Nhấp chọn vào file vs_enterprise_ exe để tiến hành cài đặt Hình 1.3. Màn hình download tiến hành cài đặt 11
- Tùy vào tốc độ của máy cũng như đường truyền mạng, sau khi tải xong ta sẽ có màn hình như dưới đây: Hình 1.4. Màn hình lựa chọn để cài đặt Chọn Desktop Application (Winform, WPF). Tương tự cho Universal Windows Platform development , Mobile (Xamarin) thì nhấp chọn vào. Chú ý chọn thêm ít nhất là 2 tính năng: Hiển thị mô hình lớp (class Diagram) và tăng tốc lập trình với LINQ: Hình 1.5. Lựa chọn cấu hình cài đặt Trong màn hình Đăng nhập để bấm Sign In. Dùng tài khoản Gmail hoặc tài khoản Microsoft để đăng nhập bản quyền dùng Visual Studio. 12
- Hình 1.6. Chọn đăng nhập tài khoản để tiến hành đăng ký Viusual Studio Chọn Personal account: Hình 1.7. Đăng nhập username và mật khẩu Cung cấp mật khẩu rồi Sign in bình thường. Khởi động chương trình Visual Studio 2019 Hình 1.8. Màn hình khởi động chương trình Visual Studio Màn hình sau khi khởi động thành công 13
- Hình 1.9. Lựa chọn chức năng làm việc Ở màn hình có 3 lựa chọn chính: - Open a project or solution: chọn mở những Project cũ (nếu đã tạo trước đó hoặc kể cả ở các Version cũ cũng tự động mở lại). - Continue without code: Chọn mục này sẽ mở Visual Studio mà không có Project nào cả - “Create a New Project”: Chương trình sẽ hiển thị màn hình tạo Project mới. Hình 1.10. Lựa chọn môi trường và ngôn ngữ làm việc Tìm kiếm, lọc theo: Ngôn ngữ lập trình (C#, VB ), lọc theo Platform(Android, IOS, Windows ), theo Project Type(Cloud, Console, Machine Learning ). 14
- Hình 1.11. Màn hình lựa chọn nơi lưu Project 1.3. Sử dụng hệ thống trợ giúp Nhấp vào mục Help và chọn View Help (Ctrl + F1) để tìm tài liệu khắc phúc các lỗi trong trang web: S&k=k(MSDNSTART)&rd=true Câu hỏi ôn tập và bài tập 1. Tiến hành cài đặt Visual Studio trên máy tính. 2. Tạo các ứng dụng project bằng Console và C#, lưu trữ trên máy tính gồm 2 bài tập Console với tên: BTCB1,BTCB2 và 2 bài tập Form với tên: LTWF1, LTWF2. 15
- BÀI 2: CÁC THÀNH PHẦN CƠ BẢN Mã bài: 19.02 Giới thiệu: Việc hiểu rõ các thành phần cơ bản và cách thức sử dụng của ngôn ngữ lập trình sẽ giúp chúng ta làm việc dễ dàng hơn khi thực hành, thao tác với ngôn ngữ. Hệ thống các từ khóa, các kiểu dữ liệu cơ bản, cách xây dựng biểu thức, biến, hằng khi xây dựng chương trình. Mục tiêu: - Trình bày và sử dụng hệ thống ký hiệu, từ khóa, kiểu dữ liệu cơ bản, biến, biểu thức. - Vận dụng các loại biến, hằng biểu thức vào các bài tập mẫu. - Vận dụng các loại biến, hằng biểu thức vào bài tập ứng dụng. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 2.1. Hệ thống ký hiệu và từ khóa C# là ngôn ngữ có ít từ khóa: là ngôn ngữ sử dụng giới hạn các từ khóa, chỉ khoảng 80 từ khóa và hơn 10 kiểu dữ liệu được xây dựng sẵn như bảng 1.1. Bảng 2.1: Bảng mô tả các từ khóa của C# abstract default foreach object sizeof unsafe as delegate goto operator stackalloc ushort base do if out static using bool double implicit override string virtual break else in params struct volatile byte enum int private switch void case event interface protected this while catch explicit internal public throw decimal char extern is readonly true for checked false lock ref try null class finally long return typeof short const fixed namespace sbyte uint unchecked 16
- continue float new sealed ulong 2.2. Các kiểu dữ liệu cơ bản Kiểu giá trị thường là các kiểu do C# định nghĩa sẵn bao gồm: double, char, int, float, enum, struct, . Biến của kiểu giá trị lưu trữ một giá trị thực, giá trị này được lưu trữ trong stack, không thể mang giá trị null và phải chứa giá trị xác định. Bảng 2.2: Bảng mô tả các kiểu dữ liệu giá trị trong C# Kiểu Số Kiểu Mô tả C# Byte .NET byte 1 Byte Số nguyên dương không dấu: 0 đến 255 char 2 Char Ký tự Unicode bool 1 Boolean Giá trị logic true/ false sbyte 1 Sbyte Số nguyên có dấu: -128 đến 127 short 2 Int16 Số nguyên có dấu: -32.768 đến 32.767 ushort 2 Uint16 Số nguyên không dấu: 0 đến 65.535 Số nguyên có dấu: -2.147.483.647 đến int 4 Int32 2.147.483.647 Số nguyên không dấu: 0 đến uint 4 Uint32 4.294.967.295 Kiểu dấu chấm động, giá trị xấp xỉ từ 3,4E- float 4 Single 38 đến 3,4E+38; với 7 chữ số có nghĩa Kiểu dấu chấm động, giá trị xấp xỉ từ 1,7E- double 8 Double 308 đến 1,7E+308; với 15, 16 chữ số có nghĩa Có độ chính xác đến 28 con số và giá trị thập phân, được dùng trong tính toán tài decimal 8 Decimal chính, kiểu này đòi hỏi phải có hậu tố “m” hay “M” theo sau giá trị 17
- Kiểu số nguyên có dấu có giá trị trong long 8 Int64 khoảng: -9.233.370.036.854.775.808 đến – 9.233.372.036.854.775.807 Số nguyên không dấu từ 0 đến ulong 8 Uint64 0xffffffffffffff Lưu ý: Kiểu số thực: Trình biên dịch luôn hiểu bất cứ một số thực nào cũng là một số kiểu double trừ khi khai báo rõ ràng, do đó để gán một số kiểu float thì số phải có ký tự theo sau. Ví dụ 1.5: float a=0.15f; Kiểu giá trị bool trong C# nhất thiết phải là true hoặc false. Chuyển kiểu dữ liệu: Chuyển đổi kiểu dữ liệu trong C# có thể thực hiện bằng các cách sau: Sử dụng lớp Convert: Đây là một lớp được C# xây dựng sẵn phục vụ cho việc chuyển đổi từ kiểu dữ liệu này sang kiểu dữ liệu khác. Các phương thức trong lớp Convert phần lớn đều là phương thức tĩnh: - ToInt32( ) - ToInt64( ) - ToString( ) - ToDouble( ) - ToBoolean( ) - ToByte( ) : có thể là chuỗi ký tự, hằng số, biến số nguyên, số thực hoặc kiểu bool. Nếu trong quá trình chuyển kiểu đặt tham số là null thì hàm Convert sẽ trả về giá trị mặc định. int a = Convert.ToInt32(“10”); //chuyển chuỗi 10 sang số nguyên bool b = Convert.ToBoolean(27); //chuyển số 27 sang kiểu boolean bool a = Convert.ToBoolean(“hello”); //Sai định dạng, không chuyển được 18
- int b = Convert.ToInt32(“123456787654”); //Tràn bộ nhớ, không chuyển được double d = Convert.ToDouble(null); //Trả về giá trị mặc định Sử dụng phương thức Parse: Phương thức Parse thường được sử dụng để chuyển đổi chuỗi sang một kiểu dữ liệu cụ thể nào đó. Mỗi kiểu dữ liệu xây dựng sẵn trong C# đều hỗ trợ phương thức Parse để chuyển đổi chuỗi sang kiểu dữ liệu tương ứng: - Double.Parse( ): Chuyển chuỗi về kiểu Double - Int32.Parse( ): Chuyển chuỗi về kiểu Int32 - Int64.Parse( ): Chuyển chuỗi về kiểu Int64 - Boolean.Parse( ): Chuyển chuỗi về kiểu Boolean - Single.Parse( ): Chuyển chuỗi về kiểu Single - Ví dụ int a = Int32.Parse(“123”); //a sẽ mang giá trị 123 float b = Float.Parse(“20.7”); //b sẽ mang giá trị 20.7 bool c = Boolean.Parse(“true”); //c sẽ mang giá trị true int a = Int32.Parse(“Hello”); //sai định dạng, không chuyển được byte b = Byte.Parse(“10000000000”); //quá giới hạn, không chuyển được bool c = Boolean.Parse(null); //tham số là null, không chuyển được 2.3. Biến, hằng, biểu thức 2.3.1. Biến Biến là nơi lưu trữ dữ liệu của chương trình. Dữ liệu của biến nằm trong bộ nhớ vật lý của Ram và có thể thay đổi được. Muốn sử dụng biến trước tiên lập trình phải chỉ định biến có một kiểu dữ liệu cụ thể nào đó. Cú pháp khai báo biến: Lưu ý: Tên biến phải được đặt phù hợp với quy tắc đặt tên Cú pháp khởi tạo giá trị cho biến: = Trong đó: 19
- = là phép toán gán giá trị Quy tắc đặt tên: Các tên biến, tên hằng, tên hàm, trong C# đề phải đặt tên đúng với quy tắc sau: Một tên biến có thể bắt đầu bằng chữ hoa hay chữ thường. Tên có thể chứa ký tự hay số và ký tự gạch dưới (_). Ký tự đầu tiên của biến phải là ký tự , không được là số. Trong C# phân biệt hoa thường. Các từ khóa không thể sử dụng để đặt tên cho biến. Nếu muốn dùng từ khóa đặt tên thì ta thêm ký tự @ phía trước. Ví dụ: Employee: Hợp lệ student: Hợp lệ _Name: Hợp lệ Emp_Name: Hợp lệ @goto: Hợp lệ static: Không hợp lệ, trùng từ khóa 4myclass: Không hợp lệ, không thể bắt đầu bằng ký tự số Student&Falculty: Không hợp lệ, không được chứa ký tự đặc biệt 2.3.2. Hằng Hằng cũng là một biến nhưng giá trị của hằng không thay đổi. Biến là công cụ rất mạnh, tuy nhiên khi làm việc với một giá trị được định nghĩa là không thay đổi, ta phải đảm bảo giá trị của nó không được thay đổi trong suốt chương trình. Ví dụ, khi lập một chương trình thí nghiệm hóa học liên quan đến nhiệt độ sôi, hay nhiệt độ đông của nước, chương trình cần khai báo hai biến là DoSoi và DoDong, nhưng không cho phép giá trị của hai biến này bị thay đổi hay bị gán. Để ngăn ngừa việc gán giá trị khác, ta phải sử dụng biến kiểu hằng. Hằng được phân thành ba loại: giá trị hằng (literal), biểu tượng hằng (symbolic constants), kiểu liệu kê (enumerations). Giá trị hằng: ta có một câu lệnh gán như sau: 20
- x = 100; Giá trị 100 là giá trị hằng. Giá trị của 100 luôn là 100. Ta không thể gán giá trị khác cho 100 được. Biểu tượng hằng: gán một tên cho một giá trị hằng, để tạo một biểu tượng hằng dùng từ khóa const và cú pháp sau: = ; Một biểu tượng hằng phải được khởi tạo khi khai báo, và chỉ khởi tạo duy nhất một lần trong suốt chương trình và không được thay đổi. const int DoSoi = 100; Trong khai báo trên, 100 là một hằng số và DoSoi là một biểu tượng hằng có kiểu nguyên. 2.4. Các phép toán 2.4.1. Toán tử (Operator) trong C# Các phép toán này không thể thiếu trong mọi ngôn ngữ lập trình nào và C# cũng vậy Bảng 2.3: Bảng mô tả các toán tử trong C# Toán tử Tên Ví dụ Kết quả + Cộng x+y Tổng của x và y - Trừ x-y Hiệu của x và y * Tích x*y Tích của x và y / Chia x/y Phần nguyên của thương x chia y % Chia dư x%y Phần dư của thương x chia y Ví dụ: 21
- 2.4.2. Toán tử gán Một số toán tử gán được sử dụng trong C#: Bảng 2.4: Bảng mô tả các toán tử phép gán trong C# Toán tử Ví dụ Kết quả = x=y Gán giá trị y cho x += x+=y Gán giá trị x = x+y -= x-=y Gán giá trị x = x-y *= x*=y Gán giá trị x = x*y /= x/=y Gán giá trị x = x/y %= x%=y Gán giá trị x = x%y >= x>>=3 Gán giá trị x = x>>3 &= x&=2 Gán giá trị x = x&2 (Phép AND bit) Gán giá trị x = x^2 (Phép OR loại trừ ^= x^=2 bit) |= x|=2 Gán giá trị x = x|2 (Phép OR bit) 22
- Ví dụ: Kết quả khi chạy chương trình trên 2.4.3. Toán tử tăng giảm tiền tố và hậu tố: Giả sử ta muốn tăng giá trị của một biến x rồi gán nó cho biến y, ta làm như sau: y = x++; hoặc y = ++x; Vậy đâu là điểm khác biệt giữa 2 cú pháp trên ? Giả sử cho giá trị của biến x = 9 ta cùng đi phân tích nhé. Khi lệnh y = x++; được thực hiện thì phép gán sẽ được thực hiện trước tiên và sau đó mới đến phép toán tăng. Ta gọi đây là tăng hậu tố, và giá trị của các biến bây giờ là x = 10 và y = 9. Còn đối với lệnh y = ++x; phép toán tăng sẽ được thực hiện trước rồi mới đến toán tử gán. Ta gọi đây là tăng tiền tố, các giá trị của x và y bây giờ là như nhau và đều bằng 10. 2.4.4. Toán tử logic 23
- Đôi lúc chúng ta muốn kết hợp nhiều điều kiện với nhau ví dụ như bắt buộc cả hai biểu thức điều kiện đều đúng hoặc chỉ cần một biểu thức đúng thì mới thực hiện một lệnh gì đó. Trong C# hỗ trợ 3 toán tử logic như sau: Bảng 2.5: Bảng mô tả các toán tử logic trong C# Ký Toán tử Cú pháp Miêu tả hiệu && AND && Trả về true nếu cả 2 đều đúng Trả về true nếu 1 trong 2 biểu OR || || thức đúng Trả về phủ định của biểu thức NOT ! !(BT) trong ngoặc 2.4.5. Toán tử quan hệ Các toán tử quan hệ thường được dùng để so sánh giữa hai giá trị, và sau đó trả về kết quả là một giá trị logic kiểu boolean (true hoặc false). Giả sử ta có biến x = 5 và y = 3. Các toán tử trong C# được trình bày như bản dưới đây: Bảng 2.6: Bảng mô tả các toán tử quan hệ trong C# Toán tử Ký hiệu Biểu thức so sánh Kết quả so sánh So sánh bằng == x==5 true Không bằng != x!=y true Lớn hơn > x>y true Lớn hơn hay bằng >= x>=y true Nhỏ hơn < x<y false Nhỏ hơn hay bằng <= x<=y false Lưu ý: toán tử so sánh bằng (==) được ký hiệu bởi hai dấu bằng dính liền nhau và không có bất kỳ khoảng cách nào giữa chúng. Trình biên dịch C# xem đây là một toán tử * Biểu thức 24
- Những câu lệnh mà thực hiện việc đánh giá một giá trị gọi là biểu thức. Một phép gán một giá trị cho một biến cũng là một biểu thức: var1 = 24; Trong câu lệnh trên phép đánh giá hay định lượng chính là phép gán có giá trị là 24 cho biến var1. Lưu ý là toán tử gán (‘=’) không phải là toán tử so sánh. Do vậy khi sử dụng toán tử này thì biến bên trái sẽ nhận giá trị của phần bên phải. Các toán tử của ngôn ngữ C# như phép so sánh hay phép gán sẽ được trình bày chi tiết trong mục toán tử của chương này. Do var1 = 24 là một biểu thức được định giá trị là 24 nên biểu thức này có thể được xem như phần bên phải của một biểu thức gán khác: var2 = var1 = 24; Lệnh này sẽ được thực hiện từ bên phải sang khi đó biến var1 sẽ nhận được giá trị là 24 và tiếp sau đó thì var2 cũng được nhận giá trị là 24. Do vậy cả hai biến đều cùng nhận một giá trị là 24. Có thể dùng lệnh trên để khởi tạo nhiều biến có cùng một giá trị như: a = b = c = d = 24; * Khoảng trắng (whitespace) Trong ngôn ngữ C#, những khoảng trắng, khoảng tab và các dòng được xem như là khoảng trắng (whitespace), giống như tên gọi vì chỉ xuất hiện những khoảng trắng để đại diện cho các ký tự đó. C# sẽ bỏ qua tất cả các khoảng trắng đó, do vậy chúng ta có thể viết như sau: var1=24; Hay var1 = 24; và trình biên dịch C# sẽ xem hai câu lệnh trên là hoàn toàn giống nhau. Tuy nhiên lưu ý là khoảng trắng trong một chuỗi sẽ không được bỏ qua. Nếu chúng ta viết: System.WriteLine(“Xin chao!”); mỗi khoảng trắng ở giữa hai chữ “Xin” và “chao” đều được đối xử bình thường như các ký tự khác trong chuỗi. Hầu hết việc sử dụng khoảng trắng như một sự tùy ý của người lập trình. Điều cốt yếu là việc sử dụng khoảng trắng sẽ làm cho chương trình dễ nhìn dễ đọc hơn 25
- Cũng như khi ta viết một văn bản trong MS Word nếu không trình bày tốt thì sẽ khó đọc và gây mất cảm tình cho người xem. Còn đối với trình biên dịch thì việc dùng hay không dùng khoảng trắng là không khác nhau. Tuy nhiên, cũng cần lưu ý khi sử dụng khoảng trắng như sau: int x = 24; t ương tự như: int x=24; nhưng không giống như: intx=24; Trình biên dịch nhận biết được các khoảng trắng ở hai bên của phép gán là phụ và có thể bỏ qua, nhưng khoảng trắng giữa khai báo kiểu và tên biến thì không phải phụ hay thêm mà bắt buộc phải có tối thiểu một khoảng trắng. Điều này không có gì bất hợp lý, vì khoảng trắng cho phép trình biên dịch nhận biết được từ khoá int và không thể nào nhận được intx.Tương tự như C/C++, trong C# câu lệnh được kết thúc với dấu chấm phẩy ‘;’. Do vậy có thể một câu lệnh trên nhiều dòng, và một dòng có thể nhiều câu lệnh nhưng nhất thiết là hai câu lệnh phải cách nhau một dấu chấm phẩy. 2.4.6. Câu lệnh (statement) Trong C# một chỉ dẫn lập trình đầy đủ được gọi là câu lệnh. Chương trình bao gồm nhiều câu lệnh tuần tự với nhau. Mỗi câu lệnh phải kết thúc với một dấu chấm phẩy, ví dụ như: int x; // một câu lệnh x = 32; // câu lệnh khác int y =x; // đây cũng là một câu lệnh Những câu lệnh này sẽ được xử lý theo thứ tự. Đầu tiên trình biên dịch bắt đầu ở vị trí đầu của danh sách các câu lệnh và lần lượt đi từng câu lệnh cho đến lệnh cuối cùng, tuy nhiên chỉ đúng cho trường hợp các câu lệnh tuần tự không phân nhánh. Có hai loại câu lệnh phân nhánh trong C# là : phân nhánh không có điều kiện (unconditional branching statement) và phân nhánh có điều kiện (conditional branching statement). 26
- Ngoài ra còn có các câu lệnh làm cho một số đoạn chương trình được thực hiện nhiều lần, các câu lệnh này được gọi là câu lệnh lặp hay vòng lặp. Bao gồm các lệnh lặp for, while, do, in, và each sẽ được đề cập tới trong mục tiếp theo. Câu hỏi ôn tập và bài tập 1. Tạo một project dưới dạng Console thực hiện khai báo các loại biến sau: Biến chieudai, chieurong, chuvi, dientich kiểu dữ liệu int Biến so1, so2, so3, min, max kiểu số thực (float) 2. Tạo một project dưới dạng Console thực hiện khai báo các loại hằng sau: Hằng số thực p = 3.14 Hằng số nguyên n = 100 phần tử mảng 27
- BÀI 3: SỬ DỤNG CÂU LỆNH NHẬP XUẤT CƠ BẢN, CẤU TRÚC ĐIỀU KHIỂN IF Mã bài: 19.03 Giới thiệu: Trong bài này, nội dung bài học sẽ giúp phân tích để hiểu về cú pháp của một chương trình C# nhé. Nội dung bài học sẽ hướng dẫn sử dụng lệnh xuất ra màn hình Console.WriteLine(); và lệnh nhập dữ liệu vào từ bàn phím lệnh Console.Read(). Đồng thời tìm hiểu về cấu trúc lệnh có điều kiện if else Mục tiêu: - Trình bày và biết sử dụng câu lệnh nhập xuất cơ bản. - Trình bày và biết sử dụng cấu trúc lệnh rẽ nhánh if else. - Vận dụng các câu lệnh nhập xuất để viết chương trình Console cơ bản. - Vận dụng cấu trúc rẽ nhánh if else để viết chương trình Console cơ bản. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 3.1. Các câu lệnh nhập xuất cơ bản 3.1.1. Console.Write(); Cú pháp: Console.Write( ); Ý nghĩa: In giá trị ra màn hình console. Giá trị này có thể là 1 ký tự, 1 chuỗi, một giá trị có thể chuyển về kiểu chuỗi. Ta sẽ dùng một lệnh nào đó là cho chương trình phải dừng lại đợi mình nhấn một phím bất kỳ mới kết thúc như vậy trước khi chúng ta nhấn một phím bất kỳ thì chúng ta có thể quan sát được kết quả trên màn hình console. Các lệnh có thể sử dụng Console.Read(); Console.ReadLine(); Console.ReadKey(); 3.1.2. Console.WriteLine(); Cú pháp: Console.WriteLine( ); 28
- Ý nghĩa: Lệnh này cũng tượng tự như Console.Write() Nhưng sẽ khác khi in giá trị ra màn hình xong nó sẽ tự động đưa con trỏ xuống dòng. Điều này giúp ta có thể giải quyết được vấn đề đã đặt ra ở phần trên. Ngoài ra, để xuống dòng ta còn có nhiều cách khác như: Sử dụng ký tự đặc biệt: chúng ta sử dụng ký tự “\n” trong chuỗi in ra màn hình thì trình biên dịch sẽ tự động đổi nó thành ký tự xuống dòng. Như vậy thay vì dùng Console.WriteLine(“K team”) ta có thể dùng Console.Write (“K team \n”) 3.1.3. Console.Read(); Cú pháp: Console.Read(); Ý nghĩa: Đọc 1 ký tự từ bàn phím và trả về kiểu số nguyên là mã ASCII (American Standard Code for Information Interchange – Chuẩn mã trao đổi thông tin Hoa Kì, là bộ kí tự và bộ mã kí tự dựa trên bảng chữ cái La Tinh được dùng trong tiếng Anh hiện đại và các ngôn ngữ Tây Âu khác) của ký tự đó. Chú ý: lệnh này không đọc được các phím chức năng như Ctrl, Shift, Alt, Caps Lock, Tab, . . . 3.1.4. Console.ReadLine(); Cú pháp: Console.ReadLine(); Ý nghĩa: Đọc dữ liệu từ bàn phím cho đến khi gặp ký tự xuống dòng thì dừng (Nói cách khác là đọc cho đến khi mình nhấn enter thì dừng) và giá trị đọc được luôn là một chuỗi. 3.1.5. Console.ReadKey(); Cú pháp: Console.ReadKey( ) Ý nghĩa: 29
- • Lệnh này cũng dùng để đọc một ký tự từ bàn phím nhưng trả về kiểu ConsoleKeyInfo (là một kiểu dữ liệu có cấu trúc được định nghĩa sẵn để chứa những ký tự của bàn phím bao gồm các phím chức năng). • Tham số kiểu bool bao gồm 2 giá trị: true hoặc false. Nếu truyền vào true thì phím được ấn sẽ không hiển thị lên màn hình console mà được đọc ngầm ngược lại thì phím được ấn sẽ hiển thị lên màn hình console. Nếu không truyền tham số vào thì mặc định sẽ là false. Ví dụ: Viết chương trình nhập vào thông tin sinh viên bao gồm: Họ tên, giới tính, ngày sinh, địa chỉ, tuổi. Để Bước 1: Mở Visual Studio Chọn File Chọn Project Hình 3.1: Màn hình tạo mới một Project Chọn Visual C# chọn Console App (.NET Framework) Nhập Name, chọn Location Chọn OK Hình 3.2: Màn hình đặt tên và chọn nơi lưu của Project 30
- Sau khi tạo xong Project cấu trúc thư mục được lưu vào trong Solution Project được chọn và chạy đầu tiên Danh sách các dự án project Hình 3.3: Màn hình quản lý Solution Một Solution gồm nhiều Project có cấu trúc như sau: Nhấp chuột phải vào Solution Chọn Add Thêm project mới Hình 3.4: Màn hình quản lý Project 31
- Gán cho Project được chạy đầu tiên Hình 3.5: Màn hình gán cho Project được chạy đầu tiên Project sau khi tạo Hình 3.6: Màn hình ban đầu của cửa sổ làm việc Program.cs Bước 2: Viết xử lý cho Program.cs 32
- Hình 3.7: Code để nhập xuất thông tin sinh viên Bước 3: Chạy chương trình Trước khi chạy chương trình cần biên dịch và kiểm tra lỗi của Solution vừa tạo. Khi kiểm tra còn lỗi thì chương trình sẽ chạy với lần biên dịch trước đó. Kiểm tra lỗi trước khi chạy chương trình Hình 3.8: Kiểm tra lỗi của Solution 33
- Màn hình thông báo lỗi của chương trình Hình 3.9: Màn hình thông báo lỗi của chương trình Chọn Start hoặc nhấp vào biểu tượng để chạy chương trình. Phím tắt (F5). Hình 3.10: Chọn biểu tượng để thực thi (chạy) chương trình Giao diện chương trình khi chạy sau khi nhập thông tin sinh viên Hình 3.11: Màn hình hiển thị kết quả chương trình 34
- 3.2. Câu lệnh if else Câu lệnh phân nhánh if else dựa trên một điều kiện. Điều kiện là một biểu thức sẽ được kiểm tra giá trị ngay khi bắt đầu gặp câu lệnh đó. Nếu điều kiện được kiểm tra là đúng, thì câu lệnh hay một khối các câu lệnh bên trong thân của câu lệnh if được thực hiện. Trong câu điều kiện if else thì else là phần tùy chọn. Các câu lệnh bên trong thân của else chỉ được thực hiện khi điều kiện của if là sai. Do vậy khi câu lệnh đầy đủ if else được dùng thì chỉ có một trong hai if hoặc else được thực hiện. Ta có cú pháp câu điều kiện if else sau: if (biểu thức điều kiện) [else ] Nếu các câu lệnh trong thân của if hay else mà lớn hơn một lệnh thì các lệnh này phải được bao trong một khối lệnh, tức là phải nằm trong dấu khối { }: if (biểu thức điều kiện) { } [else { }] Như trình bày bên trên do else là phần tùy chọn nên được đặt trong dấu ngoặc vuông Ví dụ: câu lệnh điều kiện if else. 35
- Kết quả chương trình: Hình 3.12. Màn hình kết quả câu lệnh if else Trong ví dụ trên, câu lệnh if đầu tiên sẽ kiểm tra xem giá trị của var1 có lớn hơn giá trị của var2 không. Biểu thức điều kiện này sử dụng toán tử quan hệ lớn hơn (>), các toán tử khác như nhỏ hơn (<), hay bằng (==). Các toán tử này thường xuyên được sử dụng trong lập trình và kết quả trả là giá trị đúng hay sai. Việc kiểm tra xác định giá trị var1 lớn hơn var2 là sai (vì var1 = 10 trong khi var2 = 20), khi đó các lệnh trong else sẽ được thực hiện, và các lệnh này in ra màn hình: Như trình bày bên trên do else là phần tùy chọn nên được đặt trong dấu ngoặc vuông. Ví dụ: câu lệnh điều kiện if else. 36
- Kết quả chương trình: Hình 3.13. Màn hình kết quả nhiều câu lệnh if else Trong ví dụ trên, câu lệnh if đầu tiên sẽ kiểm tra xem giá trị của var1 có lớn hơn giá trị của var2 không. Biểu thức điều kiện này sử dụng toán tử quan hệ lớn hơn (>), các toán tử khác như nhỏ hơn ( var1: 10 37
- Tiếp theo đến câu lệnh if thứ hai, sau khi thực hiện lệnh gán giá trị của var1 = 30, lúc này điều kiện if đúng nên các câu lệnh trong khối if sẽ được thực hiện và kết quả là in ra ba dòng sau: Gan gia tri var1 cho var2 Tang bien var1 len mot Var1 = 31, var2 = 30 * Câu lệnh if lồng nhau Các lệnh điều kiện if có thể lồng nhau để phục vụ cho việc xử lý các câu điều kiện phức tạp. Việc này cũng thường xuyên gặp khi lập trình. Giả sử chúng ta cần viết một chương trình có yêu cầu xác định tình trạng kết hôn của một công dân dựa vào các thông tin như tuổi, giới tính, và tình trạng hôn nhân, dựa trên một số thông tin như sau: • Nếu công dân là nam thì độ tuổi có thể kết hôn là 20 với điều kiện là chưa có gia đình. • Nếu công dân là nữ thì độ tuổi có thể kết hôn là 19 cũng với điều kiện là chưa có gia đình. • Tất cả các công dân có tuổi nhỏ hơn 19 điều không được kết hôn. 38
- Dựa trên các yêu cầu trên ta có thể dùng các lệnh if lồng nhau để thực hiện. Ví dụ sau sẽ minh họa cho việc thực hiện các yêu cầu trên. Kết quả chương trình: Hình 3.14. Màn hình kết quả if else lồng Câu hỏi ôn tập và bài tập 1. Viết chương trình cho phép người dùng nhập tên của mình và hiển thị câu: Môn học Lập trình Windows Form chào bạn + . 2. Viết chương trình nhập vào các thông tin: • Tên • Tuổi • Địa chỉ Xuất ra màn hình theo định dạng: Bạn tên , tuổi, ở 39
- BÀI 4: SỬ DỤNG CẤU TRÚC LỰA CHỌN SWITCH CASE, FOR, FOR EACH Mã bài: 19.04 Giới thiệu: Cũng giống như những ngôn ngữ khác các câu lệnh lặp và câu lệnh rẽ nhánh giúp chúng ta xử lý được các nhu cầu thực tế trong lập trình như việc chọn lựa nhiều giá trị tùy theo từng điều kiện khác nhau. Đồng thời, tiến hành lặp lại các công việc cụ thể nào đó trong một giới hạn lặp nhất định Mục tiêu: - Trình bày và thực hành sử dụng cấu trúc lệnh switch case. - Trình bày và thực hành sử dụng cấu trúc lệnh for, for each. - Vận dụng cấu trúc lệnh switch case để viết chương trình Console cơ bản - Vận dụng cấu trúc for, for each để viết chương trình Console cơ bản - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 4.1. Câu lệnh switch Khi có quá nhiều điều kiện để chọn thực hiện thì dùng câu lệnh if sẽ rất rối rắm và dài dòng, Các ngôn ngữ lập trình cấp cao đều cung cấp một dạng câu lệnh switch liệt kê các giá trị và chỉ thực hiện các giá trị thích hợp. C# cũng cung cấp câu lệnh nhảy switch có cú pháp sau: switch ( ) { case : ; break; case : ; break; . . . case : ; break; default: ; break; } 40
- Trong đó: • switch, case, default là từ khóa bắt buộc. • phải là biểu thức trả về kết quả kiểu: o Số nguyên (int, long, byte, . . .) o Ký tự hoặc chuỗi (char, string) Kiểu liệt kê • với i = 1 n là giá trị muốn so sánh với giá trị của . • với i = 1 n là câu lệnh muốn thực hiện khi tương ứng bằng với giá trị của . • là câu lệnh sẽ được thực hiện nếu giá trị không bằng với nào. Ý nghĩa: Duyệt lần lượt từ trên xuống dưới và kiểm tra xem giá trị của có bằng với đang xét hay không. Nếu bằng thì thực hiện tương ứng. Nếu không bằng tất cả các thì sẽ thực hiện . Cũng tương tự như câu lệnh if, biểu thức để so sánh được đặt sau từ khóa switch, tuy nhiên giá trị so sánh lại được đặt sau mỗi các từ khóa case. Giá trị sau từ khóa case là các giá trị hằng số nguyên như đã đề cập trong phần trước. Nếu một câu lệnh case được thích hợp tức là giá trị sau case bằng với giá trị của biểu thức sau switch thì các câu lệnh liên quan đến câu lệnh case này sẽ được thực thi. Tuy nhiên phải có một câu lệnh nhảy như break, goto để điều khiển nhảy qua các case khác.Vì nếu không có các lệnh nhảy này thì khi đó chương trình sẽ thực hiện tất cả các case theo sau. Để dễ hiểu hơn ta sẽ xem xét ví dụ dưới đây. Ví dụ: Nhập vào một số tự nhiên từ 0 6. Cài đặt màu mặc định cho các số thứ tự. Nhập vào một số bất kỳ in ra màu sắc đã chọn 41
- Kết quả thực hiện chương trình Hình 4.1. Kết quả chương trình lệnh switch case 4.2. Câu lệnh for Cú pháp: for ([Khởi tạo]; [Điều kiện lặp]; [Bước lặp lại]) { // Khối lệnh được lặp lại. Có thể bỏ trống } Trong đó: • Các phần [Khởi tạo]; [Điều kiện lặp]; [Bước lặp lại] hoàn toàn có thể để trống như ví dụ sau. • Mỗi đoạn [Khởi tạo]; hay [Điều kiện lặp]; hay [Bước lặp lại] là một câu lệnh riêng. Tiến trình: • Ban đầu trình biên dịch sẽ di vào phần khởi tạo chạy đoạn lệnh khởi tạo. 42
- • Tiếp theo kiểm tra điều kiện lặp. Rồi thực hiện khối code bên trong vòng lặp for. Khi đến ký hiệu } thì sẽ quay lên bước lặp lại. • Sau đó lại kiểm tra điều kiện lặp rồi tiếp tục thực hiện đoạn code trong khối lệnh. Đến khi điều kiện lặp không còn thõa mãn thì sẽ kết thúc vòng lặp for. • Trường hợp khác: • for (; ;) // lưu ý dấu ; •{ • // Khối lệnh được lặp lại. Có thể bỏ trống •} Trong đó: o Vòng lặp for này trở thành vòng lặp vô tận. o Lưu ý dấu ; vẫn phải có. Ý nghĩa và cách sử dụng các phần [Khởi tạo]; [Điều kiện lặp]; [Bước lặp lại]. Khởi tạo Khi bắt đầu vào đoạn code của vòng lặp for, đoạn lệnh này sẽ được chạy đầu tiên. Và chỉ được gọi duy nhất một lần trong vòng đời của vòng lặp for. Ví dụ: Tạo một lớp đối tượng mới có tên Class1 và lập trình như sau: Cách tạo Class: Hình 4.2. Màn hình để tạo mới một Class 43
- Lập trình đoạn code trong Class1 Cách gọi lớp Class1 trong Program.cs Ở trường hợp này i được gọi là biến đếm (thuật ngữ lập trình dùng cho một biến có tác dụng tăng giá trị lên mỗi lần lặp lại). Kết quả chương trình. Hình 4.3. Kết quả vòng lặp for khuyết 44
- Ví dụ: Chỉ có thể có duy nhất một câu lệnh khởi tạo trong vòng lặp (lưu ý dấu , và dấu ; ở hai ví dụ sau) for static void Main(string[] args) { int i; // lỗi vì chỉ được phép có duy nhất một dòng lệnh khởi tạo trong vòng lặp for for (i = 0, int j = 0; ; ) { Console.WriteLine(i); } Console.ReadKey(); } Hay: static void Main(string[] args) { int i; // lỗi vì chỉ được phép có duy nhất một dòng lệnh khởi tạo trong vòng lặp for for (i = 0; int j = 0; ; ) { Console.WriteLine(i); } Console.ReadKey(); } Điều kiện lặp Điều kiện lặp là một biểu thức logic với kết quả trả về bắt buộc là true hoặc false (có thể bỏ trống sẽ trả về kết quả là true). Điều kiện lặp là dòng lệnh thứ 2 vòng for sẽ chạy vào khi chạy lần đầu tiên (Khởi tạo chạy trước). Từ lần lặp thứ 2 của vòng for, Điều kiện lặp cũng là dòng lệnh thứ 2 được chạy (sau bước lặp lại). (Cứ nhớ là luôn đứng thứ 2) Khi câu điều kiện lặp không còn thỏa mãn (kết quả là false) thì vòng lặp for sẽ kết thúc. Static void Main(string[] args) { int i; // vòng lặp for này vẫn lặp vô tận vì không bao giờ thỏa mãn điều kiện dừng // i luôn == 0 // Điều kiện lặp luôn là true for (i = 0; i < 10;) { Console.WriteLine(i); } Console.ReadKey(); } 45
- Ta có thể thấy Điều kiện lặp của vòng lặp này luôn là true, nên vòng lặp sẽ lặp vô tận. Hình 4.4. Kết quả vòng lập for vô tận Để giải quyết vấn đề này và cho vòng lặp kết thúc khi thỏa mãn điều kiện lặp. Chúng ta thêm một đoạn code i++; ngay dưới đoạn code Console.WriteLine(i); static void Main(string[] args) { int i; for (i = 0; i < 10;) { Console.WriteLine(i); i++; } Console.ReadKey(); } Kết quả màn hình xuất ra các giá trị số nguyên từ 0 đến 9 (10 lần). Chứng tỏ vòng lặp đã kết thúc sau 10 lần lặp (không còn lặp vô tận). Lưu ý: Giá trị in ra từ 0 đến 9 chứ không phải đến 10. Vì Điều kiện lặp là i < 10 (10 == 10 nên câu điều kiện là false và kết thúc vòng lặp. Vẫn thỏa mãn lặp 10 lần). Sau mỗi lần lặp giá trị i lại tăng lên 1 đơn vị. Sau 11 lần thì giá trị i == 10, không còn thỏa mãn Điều kiện lặp nữa nên vòng lặp kết thúc. 46
- Xem bảng thử dưới đây để hiểu rõ về số lần lặp: Bảng 4.1. Mô tả số lần lặp của vòng lặp for Lần i i < 10 1 0 TRUE 2 1 TRUE 3 2 TRUE 4 3 TRUE 5 4 TRUE 6 5 TRUE 7 6 TRUE 8 7 TRUE 9 8 TRUE 10 9 TRUE 11 10 FALSE Hoàn toàn có thể để giá trị true hoặc false vào phần điều kiện lặp (bỏ trống mặc định là true). Hoặc một biểu thức logic phức tạp nhưng kết quả cuối cùng trả về là true hoặc false. Static void Main(string[] args) { int i; for (i = 0; (i % 3 == 0) && (i < 10);) { Console.WriteLine(i); i++; } Console.ReadKey(); } Hay static void Main(string[] args) { int i; for (i = 0; false;) { Console.WriteLine(i); i++; } Console.ReadKey(); } 47
- Hay static void Main(string[] args) { int i; for (i = 0; true;) { Console.WriteLine(i); i++; } Console.ReadKey(); } Bước lặp lại Như ví dụ trên ta thấy. Mỗi lần muốn tăng giá trị của i ta phải dùng môt đoạn lệnh i++ ; ở cuối khối lệnh. Vậy trường hợp bất cứ khi nào lặp lại ta cũng cần thực thi đoạn lệnh i++ ; thì sao? Để tiện hơn cho việc code. Chúng ta có một phần tiếp theo để tìm hiểu. Đó là bước lặp lại. Xét đoạn code sau: static void Main(string[] args) { int i; for (i = 0; i < 10;) { Console.WriteLine(i); i++; } Console.ReadKey(); } Kết quả chương trình Hình 4.5. Màn hình kết quả tăng biến i ngoài vòng lặp for 48
- Ta có thể viết gọn lại bằng cách đưa i++; vào phần bước lặp lại của khối for. Static void Main(string[] args) { int i; for (i = 0; i < 10; i++) { Console.WriteLine(i); } Console.ReadKey(); } Kết quả tương tự như bình thường Hình 4.6. Màn hình kết quả tăng biến i trong vòng lặp for Ví dụ. Một vòng lặp for tổng hợp static void Main(string[] args) { int n = 100; int j = 0; for (int i = 0; i * j < n; i++, j += 3,Console.WriteLine(“Kết quả For Loop {0}”, i)) { Console.WriteLine(“===”); Console.WriteLine(“i: {0} | j: {1} | i * j: {2}”, i, j, i * j); } Console.ReadKey(); } Kết quả chương trình: 49
- Hình 4.7. Màn hình kết quả vòng lặp for tổng hợp Cũng có thể vẽ một hình chữ nhật rỗng NxM với vòng lặp for: static void Main(string[] args) { int N = 10; int M = 20; char drawChar = ‘*’; char insideChar = ‘ ‘; // Vẽ từ trên xuống for (int i = 0; i < N; i++) { // Vẽ từ trái sang for (int j = 0; j < M; j++) { /* * Nếu đang ở tọa độ là cạnh trên hoặc dưới i % (N – 1) == 0 * hoặc đang ở cạnh trái hoặc phải (j % (M – 1) == 0) * mà không nằm ở cạnh trên hoặc dưới (i % (N – 1) != 0) * ((i % (N – 1) != 0) && (j % (M – 1) == 0)) * thì vẽ ra ký tự của hình chữ nhật * ngược lại vẽ ra ký tự không thuộc hình chữ nhật */ if (i % (N – 1) == 0 || ((i % (N – 1) != 0) && (j % (M – 1) == 0))) { Console.Write(drawChar); // lúc này là ký tự * } else { Console.Write(insideChar); // lúc này là ký tự rỗng ‘ ‘ } 50
- } //mỗi lần vẽ xong một hàng thì xuống dòng Console.WriteLine(); } Console.ReadKey(); } Kết quả chương trình Hình 4.8. Màn hình kết quả vòng lặp để vẽ hình vuông 4.3. Câu lệnh for each Cấu trúc lặp foreach cho phép chúng ta duyệt 1 mảng hoặc 1 tập hợp Một số đặc trưng của foreach: • foreach không duyệt mảng hoặc tập hợp thông qua chỉ số phần tử như cấu trúc lặp for. • foreach duyệt tuần tự các phần tử trong mảng hoặc tập hợp. • foreach chỉ dùng để duyệt mảng hoặc tập hợp ngoài ra không thể làm gì khác. Cú pháp foreach ( in ) { // Code xử lý } Trong đó: • Các từ khoá foreach, in là từ khoá bắt buộc. • là kiểu dữ liệu của các phần tử trong mảng hoặc tập hợp. • là tên 1 biến tạm đại diện cho phần tử đang xét khi duyệt mảng hoặc tập hợp. 51
- • là tên của mảng hoặc tập hợp cần duyệt. Nguyên tắc hoạt động Foreach cũng có nguyên tắc hoạt động tương tự như các cấu trúc lặp khác cụ thể như sau: •Ở vòng lặp đầu tiên sẽ gán giá trị của phần tử đầu tiên trong mảng vào biến tạm. • Thực hiện khối lệnh bên trong vòng lặp foreach. • Qua mỗi vòng lặp tiếp theo sẽ thực hiện kiểm tra xem đã duyệt hết mảng hoặc tập hợp chưa. Nếu chưa thì tiếp gán giá trị của phần tử hiện tại vào biến tạm và tiếp tục thực hiện khối lệnh bên trong. • Nếu đã duyệt qua hết các phần tử thì vòng lặp sẽ kết thúc. Qua nguyên tắc hoạt động trên ta có thể thấy: • Biến tạm trong vòng lặp foreach sẽ tương đương với phần tử i trong cách duyệt của vòng lặp for . • Qua mỗi bước lặp ta chỉ có thể thao tác với giá trị của phần tử đang xét mà không thể tương tác với các phần tử đứng trước nó hay đứng sau. • Bằng cách duyệt của foreach ta không thể thay đổi giá trị của các phần tử vì lúc này giá trị của nó đã được sao chép ra một 1 biến tạm và ta chỉ có thể thao tác với biến tạm. • Thậm chí việc thay đổi giá trị của biến tạm cũng không được phép. Nếu ta cố làm điều đó thì sẽ gặp lỗi sau: Ví dụ: Khởi tạo 1 mảng 1 chiều gồm các số nguyên, sau đó dùng lệnh foreach để tính tổng các phần tử 52
- Kết quả chương trình Hình 4.9. Màn hình kết quả vòng lặp foreach tính tổng phần tử mảng Ví dụ: Sử dụng vòng lặp foreach để in ra các mảng dữ liệu Kết quả khi chạy đoạn chương trình trên: Hình 4.10 Màn hình kết quả dùng vòng lặp foreach in ra giá trị mảng Ta có thể thấy cách duyệt foreach ngắn gọn hơn nhiều so với cách duyệt bằng vòng lặp for thông thường. So sánh for và foreach trong C# foreach mang trong mình một số ưu điểm như: • Câu lệnh ngắn gọn, sẽ sử dụng. • Rất có ích khi duyệt danh sách, tập hợp mà không thể truy xuất thông qua chỉ số phần tử. 53
- • Duyệt các danh sách, tập hợp có số phần tử không xác định hoặc số phần tử thay đổi liên tục. Mặc dù có nhiều ưu điểm nhưng không hẳn là foreach hơn hẵn for. Cùng điểm qua một vài tiêu chí giữa 2 vòng lặp. Bảng 4.2. So sánh tiêu chí của 2 vòng lặp for và foreach Tiêu chí for foreach Khả năng truy xuất Truy xuất ngẫu nhiên (có Truy xuất tuần tự (chỉ sử phần tử thể gọi bất kỳ phần tử nào dụng được giá trị phần tử trong mảng để sử dụng) đang xét) Thay đổi được giá trị Có Không của các phần tử Duyệt mảng, tập hợp Không Có khi không biết được số phần tử của mảng, tập hợp Hiệu suất (tốc độ xử Đối với mảng, danh sách Đối với mảng, danh sách lý) (*) hoặc tập hợp có khả năng hoặc tập hợp không có khả truy xuất ngẫu nhiên năng truy xuất ngẫu nhiên thì for sẽ chiếm ưu thế thì foreach chiếm ưu thế Câu hỏi ôn tập và bài tập 1. Áp dụng câu lệnh switch case để viết chương trình trên Console theo yêu cầu sau: khai báo biến kiểu int luachon. Nếu luachon = 1: Tính hình tam giác Nếu luachon = 2: Tính hình chữ nhật Nếu luachon = 3: Tính hình vuông 2. Áp dụng lệnh for hoặc lệnh foreach để thực hiện công việc sau: - Tính tổng các số từ 1 n với n là số nguyên được nhập vào từ bàn phím. 54
- - Tính tổng các số chẵn và số lẽ từ 1 n với n là số nguyên được nhập vào từ bàn phím. - Chương trình mảng nhập, xuất, sắp xếp mảng 1 chiều với n là số nguyên 55
- BÀI 5: SỬ DỤNG CẤU TRÚC LỰA VÒNG LẶP WHILE, DO WHILE Mã bài: 19.05 Giới thiệu: Trong C# vòng lặp while trong C# thực hiện lặp đi lặp lại một lệnh mục tiêu đến khi nào điều kiện đã cho còn là đúng, vòng lặp do while được sử dụng để lặp đi lặp lại một đoạn code nào đó. Nếu số lần lặp không cố định và phải thực hiện vòng lặp ít nhất một lần, thì nên sử dụng vòng lặp do while. Mục tiêu: - Trình bày và thực hành sử dụng cấu trúc lệnh while - Trình bày và thực hành sử dụng cấu trúc lệnh do while. - Vận dụng cấu trúc lệnh while để viết chương trình Console cơ bản, đồ án. - Vận dụng cấu trúc do while để viết chương trình Console cơ bản, và đồ án. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 5.1. Sử dụng cấu trúc vòng lặp While while ( ) { // khối lệnh lặp lại } Điều kiện lặp là một biểu thức logic bắt buộc phải có với kết quả trả về bắt buộc là true hoặc false. Từ khóa while biểu thị đây là một vòng lặp while. Các câu lệnh trong khối lệnh sẽ được lặp lại đến khi không còn thỏa mãn điều kiện lặp sẽ kết thúc vòng lặp while. Tiến trình: Đầu tiên trình biên dịch sẽ đi vào dòng while ( ). Kiểm tra điều kiện lặp có thỏa mãn hay không. Nếu kết quả là true thì sẽ đi vào bên trong thực hiện khối code. Khi gặp ký tự } sẽ quay lên kiểm tra điều kiện lặp và tiếp tục thực hiện khối code. Quá trình chỉ kết thúc khi điều kiện lặp là false. 56
- Điều kiện lặp luôn bằng true thì vòng lặp while sẽ trở thành vòng lặp vô tận. Điều kiện lặp luôn bằng false thì vòng lặp sẽ không được thực thi. Ví dụ 1: In ra dãy số từ 10 19 Kết quả chương trình: Hình 5.1. Kết quả thực hiện vòng lặp while in ra dãy số từ 10 19 Ví dụ 2: Dùng vòng lặp while để thực hiện vẽ một hình chữ nhật có chiều dài là 50 dấu “*” và chiều rộng là 20 dấu “*” liên tiếp nhau 57
- Kết quả chương trình Hình 5.1. Kết quả thực hiện vòng lặp while in hình chữ nhật dấu * 5.2. Sử dụng cấu trúc vòng lặp do while Cú pháp 58
- do { // khối lệnh lặp lai } while ( ); Điều kiện lặp là một biểu thức logic bắt buộc phải có với kết quả trả về bắt buộc là true hoặc false. Từ khóa do while biểu thị đây là một vòng lặp do while. Các câu lệnh trong khối lệnh sẽ được lặp lại đến khi không còn thỏa mãn điều kiện lặp sẽ kết thúc vòng lặp do while. Tiến trình: Đầu tiên trình biên dịch sẽ đi vào dòng do và thực hiện khối lệnh bên trong. Sau đó khi gặp ký tự } sẽ kiểm tra điều kiện lặp có thỏa mãn hay không. Nếu kết quả là true thì sẽ quay lại ký tự { thực hiện khối code. Quá trình chỉ kết thúc khi điều kiện lặp là false. Điều kiện lặp luôn bằng true thì vòng lặp do while sẽ trở thành vòng lặp vô tận. Điều kiện lặp luôn bằng false thì vòng lặp sẽ không được thực thi. Lưu ý: vòng lặp do while sẽ thực hiện câu lệnh trong khối code xong rồi mới kiểm tra điều kiện lặp. Cuối vòng lặp do while có dấu ; ở cuối. Ví dụ 1: Dùng vòng lặp do while để in ra dãy số từ 10 19 Đoạn code thực hiện chương trình 59
- Kết quả thực hiện chương trình: Hình 5.2. Kết quả thực hiện vòng lặp do while in ra dãy số từ 10 19 Ví dụ 2: In ra một ma trận số Đoạn code thực hiện chương trình 60
- Kết quả thực hiện chương trình: Hình 5.4. Kết quả thực hiện vòng lặp do while in ra ma trận Câu hỏi ôn tập và bài tập Áp dụng lệnh while, do while để thực hiện công việc sau: - Tính tổng các số từ 1 n với n là số nguyên được nhập vào từ bàn phím. - Tính tổng các số chẵn và số lẽ từ 1 n với n là số nguyên được nhập vào từ bàn phím. - Chương trình mảng nhập, xuất, sắp xếp mảng 1 chiều với n là số nguyên 61
- BÀI 6: SỬ DỤNG CÂU LỆNH BREAK, CONTINUE, GOTO Mã bài: 19.06 Giới thiệu: Các câu lệnh làm ngắt, tiếp tục ở vị trí bất kỳ, nhảy đến một vị trí bất kỳ. Các câu lệnh này tuy làm gãy bố cục chương trình nhưng giúp cho chương trình thực hiện được các yêu cầu trong một vài trường hợp cụ thể. Mục tiêu: - Trình bày và thực hành sử dụng các câu lệnh continue, goto, break. - Vận dụng các câu lệnh break, continue, goto để viết chương trình Console cơ bản, đồ án. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 6.1. Sử dụng câu lệnh break Lệnh break trong C# có hai cách sử dụng: Khi lệnh break được sử dụng trong vòng lặp, vòng lặp ngay lập tức kết thúc và điều khiển chương trình bắt đầu lệnh tiếp theo sau vòng lặp. Nó có thể được sử dụng trong lệnh switch (sẽ được nhắc đến trong chương tới). Nếu đang sử dụng các vòng lặp lồng nhau (ví dụ, một vòng lặp bên trong vòng lặp khác), lệnh break sẽ dừng thực thi một lệnh nào đó trong một vòng lặp và bắt đầu thực thi lệnh tiếp theo của đoạn code sau khối code đó. Cú pháp của lệnh break trong C# như sau: break; 62
- Ví dụ: Kết quả chương trình: Hình 6.1. Kết quả lệnh break 6.2. Sử dụng câu lệnh continue Lệnh continue trong C# làm việc hơi giống với lệnh break. Thay vì bắt buộc kết thúc, nó bắt buộc vòng lặp tiếp theo diễn ra, bỏ qua bất kỳ đoạn code nào ở giữa. Với vòng lặp for, lệnh continue làm cho bước kiểm tra điều kiện và phần increment của vòng lặp thực thi. Với while và do while, lệnh continue làm điều khiển chương trình chuyển tới các kiểm tra điều kiện. Cú pháp của lệnh continue trong C# như sau: continue; 63
- Ví dụ: Kết quả chương trình: Hình 6.2. Kết quả thực hiện lệnh continue 6.3. Sử dụng câu lệnh goto Lệnh nhảy goto là một lệnh nhảy đơn giản, cho phép chương trình nhảy vô điều kiện tới một vị trí trong chương trình thông qua tên nhãn. Tuy nhiên việc sử dụng lệnh goto thường làm mất đi tính cấu trúc thuật toán, việc lạm dụng sẽ dẫn đến một chương trình nguồn mà giới lập trình gọi là “mì ăn liền” rối như mớ bòng bong vậy. Hầu hết các người lập trình có kinh nghiệm đều tránh dùng lệnh goto. Sau đây là cách sử dụng lệnh nhảy goto: Cú pháp: goto ; • Trong đó label là một nhãn đích đến trong code. Nơi mà code sẽ tiếp tục được thực thi từ đó. Cấu trúc của một label: : 64
- • goto là từ khóa thông báo cho trình biên dịch biết sẽ đi đến nhãn ngay sau để tiếp tục thực thi code. Ví dụ Kết quả chương trình Hình 6.3. Kết quả thực hiện lệnh goto Ví dụ về vòng lặp vô tận: 65
- Kết quả chương trình Hình 6.4. Kết quả thực hiện vòng lặp vô tận Câu hỏi ôn tập và bài tập 1. Sử dụng câu lệnh break cho bài tập 5.1 2. Viết chương trình đặt một nhãn bất kỳ và thực hiện in ra câu lệnh “Chúc các bạn học tốt môn học”. 3. Từ bài tập 2 cho phép người dùng nhập vào tên học sinh và nhảy tới vị trí câu lệnh “Chúc các bạn học tốt môn học”. 66
- BÀI 7: HÀM Mã bài: 19.07 Giới thiệu: Hàm là chương trình con được sử dụng thường xuyên trong toàn bộ quá trình lập trình. Việc viết và sử dụng hàm một cách hiệu quả giúp cho quá trình thực hiện các công việc lập trình nhanh chóng, tái sử dụng, kế thừa tốt hơn. Mục tiêu: - Trình bày được khái niệm và công dụng của hàm trong xây dựng chương trình. - Quy tắc xây dựng hàm, sử dụng hàm trong xây dựng chương trình. - Trình bày và sử dụng tham số, tham trị của hàm. - Vận dụng hàm, thủ tục để xây dụng chương trình đồ án khoa học và hiệu quả. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 7.1. Khái niệm Khi mình muốn thực thi một đoạn code nào nó nhiều lần, thay vì phải copy đi copy lại đoạn code đó nhiều lần, dẫn đến chương trình chúng ta bị trùng lặp code rất nhiều, trong C# có function cho phép chúng ta thực thi đoạn code nào đó nhiều lần mà không cần phải copy lại code, mà chỉ cần gọi tên hàm. Việc viết và sử dụng hàm một cách hiệu quả sẽ hỗ trợ rất nhiều trong quá trình thực hành. 7.2. Quy tắc xây dựng hàm Cú pháp: Tên hàm ( ) { // Thân hàm // Giá trị trả về; } 67
- Trong đó: Tên hàm: o Là tên gọi của hàm. o Tên có thể đặt tùy ý nhưng nên đặt tên theo quy tắc đặt tên để có sự đồng bộ ngầm định giữa các lập trình viên và dễ tìm, dễ nhớ (. o Hãy xem cách khởi tạo hàm giống khởi tạo một biến ở chỗ. Đều cần kiểu dữ liệu và tên. Có thể có các từ khóa. Tên để tái sử dụng hàm ở nơi mong muốn. Kiểu trả về: từ khóa void, hay mọi kiểu dữ liệu như int, long, bool, SinhVien Thân hàm: Nó là khối lệnh sẽ được thực thi khi hàm được gọi. Quyền truy cập: Nó được sử dụng để xác định khả năng truy cập hàm trong ứng dụng bao gồm các quyền sau: public, private, protected Tham số: Nó là một danh sách các tham số mà chúng ta truyền vào khi gọi hàm Lưu ý: o Mọi hàm đều phải có cặp ngoặc nhọn { } biểu thị là một khối lệnh. Mọi dòng code xử lý của hàm đều được viết bên trong cặp ngoặc nhọn { } này. o Không thể khai báo một hàm trong một hàm khác theo cách thông thường. Một hàm cơ bản hay thấy với cấu trúc bắt buộc phải có trong lập trình C# console hàm Main 7.3. Nguyên tắc hoạt động của hàm Hàm void là hàm có kiểu trả về là void. Chúng ta cùng xem qua khai báo hàm sau: void Demo() { // some code return; } Vì hàm void (hàm có kiểu trả về là void) thì không cần viết return; nên chúng ta có thể bỏ return; đi. 68
- void Demo() { // some code } Một lưu ý về sau: do đang viết code trên nền console C#. Bắt buộc phải có hàm Main. Nhưng hàm Main lại có từ khóa static. Nên để trong hàm Main có thể sử dụng các hàm mà ta viết ra thì các hàm đó cũng phải có từ khóa static. Static void Main(string[] args) { // Gọi lại hàm để sử dụng Console.OutputEncoding = Encoding.UTF8; Demo(); Console.ReadKey(); } static void Demo() { Console.WriteLine(“Chào mừng đến với môn Lập trình Windows Forms”); } Kết quả vẫn xuất ra dòng chữ “Chào mừng đến với môn Lập trình Windows Forms” như được viết bên trong hàm Main. Nhưng thật sự nó đã được gọi từ hàm Demo. Khi sử dụng hàm ta sẽ gọi lại tên hàm kèm theo dấu () biểu thị đó là một hàm. Sau này nếu có parameter thì sẽ thêm giá trị vào bên trong dấu (). Chúng ta có thể gọi lại nhiều lần và có thể thấy code chúng ta viết rất rõ ràng và rất dễ tái sử dụng. static void Main(string[] args) { // Gọi lại hàm nhiều lần // dòng chữ Called from Demo! HowKteam.com cũng được in ra nhiều lần Console.OutputEncoding = Encoding.UTF8; Demo(); Demo(); Demo(); Demo(); Console.ReadKey(); } static void Demo() { Console.WriteLine(“Chào mừng đến với môn Lập trình Windows Forms”); } Nhiều dòng chữ “Chào mừng đến với môn Lập trình Windows Forms” được in ra màn hình. Hàm có kiểu trả về khác void 69
- Với hàm có kiểu trả về khác void. Trong thân hàm bắt buộc phải có dòng return ; Giá trị trả về phải có kiểu dữ liệu tương ứng với Kiểu dữ liệu trả về khi khai báo hàm. /// /// Hàm trả về giá trị số nguyên 5 thông qua tên hàm /// Lưu ý giá trị trả về phải cùng kiểu dữ liệu với kiểu trả về của hàm /// Ở đây là kiểu int /// /// static int ReturnANumber() { // bắt buộc phải có cấu trúc return trong thân hàm return 5; } Có thể sử dụng hàm này bình thường, và có thêm một lợi thế là có thể lấy giá trị trả về của hàm thông qua lời gọi tên hàm. Static void Main(string[] args) { Console.WriteLine(ReturnANumber()); Console.ReadKey(); } /// /// Hàm trả về giá trị số nguyên 5 thông qua tên hàm /// Lưu ý giá trị trả về phải cùng kiểu dữ liệu với kiểu trả về của hàm /// Ở đây là kiểu int /// /// static int ReturnANumber() { // bắt buộc phải có cấu trúc return trong thân hàm return 5; } Kết quả số 5 xuất hiện trên màn hình 7.4. Cách truyền tham số 7.4.1. Hàm có tham số nhưng không có kiểu trả về 70
- Kết quả chương trình Hình 7.1. Kết quả hàm không trả về giá trị 7.4.2. Hàm có tham số và có kiểu trả về 71
- Kết quả chương trình Hình 7.2. Kết quả hàm trả về giá trị 7.5. Sử dụng hàm Trong c# có 3 cách gọi hàm đó là gọi bằng giá trị (call by value), gọi bằng tham chiếu (call by Reference) và dùng tham số out. 7.5.1. Gọi bằng giá trị (call by value) Trong C#, gọi bằng giá trị tức là tham số truyền vào là bản sao của giá trị gốc, vì vậy dù cho bên trong thân hàm có thay đổi giá trị của tham số truyền vào thì sau khi kết thúc gọi hàm thì giá trị gốc vẫn không thay đổi. Ví dụ: Kết quả chương trình Hình 7.3. Kết quả gọi hàm bằng giá trị 7.5.2. Gọi bằng tham chiếu (call by Reference) C # cung cấp một từ khóa ref để truyền đối số dưới dạng tham chiếu. Tức là tham số truyền vào bằng địa chỉ ô nhớ của biến gốc vì vậy bên trong thân hàm thay đổi giá trị tham số truyền vào thì giá trị gốc cũng thay đổi theo 72
- Hình 7.4. Kết quả gọi hàm bằng tham chiếu 7.5.3. Tham số out Tham số out giống như kiểu tham chiếu, ngoại trừ việc nó không yêu cầu biến khởi tạo trước khi truyền. Ví dụ: 73
- Kết quả chương trình Hình 7.5. Kết quả gọi hàm bằng tham số out Như vậy mình chỉ cần phân biệt ref và out như sau: Bảng 7.1. Phân biệt giữ ref và out ref out Giá trị phải được khởi tạo trước Giá trị không được khởi tạo trước và bên trong thân hàm không đọc được nó cho đến khi nó được gán giá trị Bên trong thân hàm có thể đọc vào Hàm phải gán giá trị cho biến out trước thay đổi giá trị nó khi trả giá trị về Câu hỏi ôn tập và bài tập Thực hiện các bài tập từ bài 3 – bài 6 dưới dạng hàm 74
- BÀI 8: THIẾT KẾ LỚP ĐỐI TƯỢNG Mã bài: 19.08 Giới thiệu: Lớp đối tượng được dùng để lưu trữ danh sách những thuộc tính và phương thức của đối tượng phân biệt trong một dự án lập trình. Mục tiêu: - Lập danh sách các lớp đối tượng ứng với từng chương trình cụ thể. - Thiết kế các lớp đối tượng cho bài tập của nhóm. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 8.1. Định nghĩa lớp đối tượng Lập trình hướng đối tượng (Object-oriented programming – OOP), là kỹ thuật lập trình mà điều cốt yếu cần trừu tượng hóa các vấn đề thành các đối tượng (đối tượng có dữ liệu và các ứng xử). Kỹ thuật OOP có 4 tính chất • Tính trừu tượng (abstraction) mô tả một cách tổng quát hóa mà không chi tiết thông tin (triển khai với interface, abstract) • Tính đóng gói (encapsulation) dữ liệu đối tượng cố gắng như nằm trong một hộp đen, các thành phần khác bên ngoài đối tượng không trực tiếp tác động đến dữ liệu • Tính đa hình (polymorphism) đối tượng ứng xử khác nhau tùy trường hợp cụ thể • Tính kế thừa (inheritance) đặc tính của lớp được kế thừa từ một lớp khác Trong lập trình hướng đối tượng, lớp (class) là một kiểu dữ liệu nó định nghĩa một tập hợp các biến (thuộc tính) và phương thức (gọi chúng là các member – thành viên lớp). Từ lớp đó sinh ra các đối tượng (object), các đối tượng này còn gọi là instance of a class (bản triển khai của class), mỗi đối tượng có giá trị dữ liệu cụ thể (lưu trong thành viên biến). Các phương thức (method) – định nghĩa các ứng xử của đối tượng – dựa theo dữ liệu của chúng. Một lớp là một nhóm đối tượng có các thuộc tính chung. Nó là một mẫu hoặc thiết kế từ đó các đối tượng được tạo ra. 75
- Một thực thể có trạng thái và hành vi được gọi là đối tượng. Ví dụ như máy pha cà phê, xe đạp, xe máy, cái quạt Một đối tượng có ba đặc điểm: • Trạng thái: Đại diện cho dữ liệu (giá trị) của một đối tượng. • Hành vi: Đại diện cho hành vi (chức năng) của một đối tượng như gửi tiền, rút tiền, • Danh tính: Danh tính của một đối tượng thường được cài đặt thông qua một ID duy nhất. ID này được ẩn đối với user bên ngoài. Tuy nhiên nó được sử dụng trong nội bộ máy ảo JVM để định danh từng đối tượng. Ví dụ: Bút chì là một đối tượng. Tên của nó là A, màu trắng, được gọi là trạng thái. Nó được sử dụng để viết, viết được gọi là hành vi. Đối tượng(Object) là một thể hiện của một lớp(Class). Lớp là một mẫu hoặc thiết kế từ đó các đối tượng được tạo ra. Vì vậy, đối tượng là các thể hiện (kết quả) của một lớp. Ví dụ: Một lớp mô tả chung về nhân viên, đặt tên là nhanvien, thì bên trong nó có thể định nghĩa các thành viên dữ liệu (biến) như: manv, tennv, ngaysinh, gioitinh Cũng có thể định nghĩa các thành viên hàm (phương thức) để mô tả ứng xử của nó như: khoitao(), them() Khi có định nghĩa lớp nhanvien, có thể tạo ra đối tượng cụ thể của nó mà mỗi đối tượng có những dữ liệu khác nhau như Nhân viên A, Nhân viên B 8.2. Khai báo lớp đối tượng Để tạo được lớp đối tượng trong ngôn ngữ lập trình C# trên phần mềm ứng dụng lập trình Visual Studio chúng ta cần thực hiện các việc sau: 76
- Hình 8.1. Màn hình để chọn thêm một lớp mới vào Project Hình 8.2. Màn hình đặt tên cho lớp đối tượng Hình 8.3. Màn hình làm việc của cửa sổ lớp đối tượng được tạo 77
- Cú pháp, ví dụ khai báo lớp Khi giải quyết các vấn đề thực tiễn, các vấn đề cần giải quyết cần tìm cách trừu tượng hóa nó thành vấn đề tổng quát, như nó có các đặc tính gì, ứng xử của nó ra sao Từ đó mới có thể định nghĩa ra lớp để hiện thực hóa vấn đề trừu tượng được. Cú pháp cơ bản như sau: class Class_Name { // khai báo các thành viên dữ liệu (thuộc tính – biến) // khai báo các thành viên hàm (phương thức) } Trong đó Access Modifiers có thể là các từ khóa sau: Bảng 8.1. Bảng mô tả các từ khóa định nghĩa lớp Từ khóa Giải thích Public Truy xuất mọi nơi Protected Truy xuất trong nội bộ lớp hoặc trong các lớp con Internal Truy xuất trong nội bộ chương trình (Assembly) Truy xuất nội trong chương trình (assembly) và trong protected internal các lớp con private (mặc định) Chỉ được truy xuất trong nội bộ lớp Ví dụ: Khai báo một lớp có tên là Box gồm các thuộc tính: chiều dài, chiều rộng, chiều cao. 78
- Khai báo và khởi tạo thành viên thuộc tính (biến) tương tự cách khai báo biến thông thường nhưng có sử dụng thêm Access Modifiers để quy định cấp độ truy cập. Câu hỏi ôn tập và bài tập 1. Tạo lớp đối tượng sinh viên bao gồm các thông tin: masv (mã sinh viên), tennv (tên sinh viên), ngaysinh (ngày sinh), diachi (địa chỉ) 2. Tạo lớp đối tượng đồng hồ bao gồm các thông tin: thoigian, gio, phut, giay. 3. Tạo lớp đối tượng sản phẩm bao gồm các thông tin: masp (mã sản phẩm), tensp (tên sản phẩm), gia (giá), ngaynhap (ngày nhập), ngayxuat (ngày xuất). 79
- BÀI 9 : ĐỊNH NGHĨA CÁC THUỘC TÍNH, PHƯƠNG THỨC HÀNH ĐỘNG CHO LỚP ĐỐI TƯỢNG Mã bài: 19.09 Giới thiệu: Việc xác định thuộc tính của lớp đối tượng cũng như chuẩn bị sẵn các phương thức hoạt động cho lớp đối tượng giúp cho việc sử dụng và lập trình dễ dàng hơn rất nhiều. Mục tiêu: - Định nghĩa được các thuộc tính cho lớp đối tượng. - Định nghĩa được các phương thức hành động cho lớp đối tượng - Vận dụng các thuộc tính, phương thức của lớp đối tượng trong đồ án - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 9.1. Định nghĩa các thuộc tính cho lớp đối tượng Ví dụ: - Định nghĩa lớp đối tượng Box gồm các thuộc tính chieudai, chieurong, chieucao. - Kiểu dữ liệu cho mỗi thuộc tính tùy theo mục đích sử dụng mà chọn kiểu dữ liệu. 80
- Sau khi khai báo được Lớp đối tượng cách thức sử dụng lớp đối tượng như sau Trong màn hình lập trình trên để khai báo và sử dụng lớp đối tượng Box trong chương trình Main ta sử dụng câu lệnh sau: Từ khóa this Từ khóa this dùng trong các phương thức của lớp, nó tham chiếu đến đối tượng hiện tại sinh ra từ lớp. Sử dụng this để tường minh, tránh sự không rõ ràng khi truy cập thuộc tính, phương thức hoặc để lấy đối tượng lớp làm tham số cho các thành phần khác Ví dụ, hàm setchieucao, có thể viết: public void setchieucao(int chieucao) { this.chieucao = chieucao ; } 81
- Nếu viết thiếu this thì là chieucao = chieucao , làm cho khó hiểu không biết là gán chieucao từ tham số hàm cho chieucao là dữ liệu của lớp. 9.2. Định nghĩa các phương thức hành động cho lớp đối tượng Phương thức khởi tạo – Constructor Phương thức khởi tạo là phương thức của lớp, nó được thi hành ngay khi đối tượng được tạo (bởi toán tử new), phương thức khởi tạo có tên trùng với tên của lớp, không có kiểu trả về. Ví dụ bổ sung thêm phương thức khởi tạo vào lớp Box ở trên: Nếu khai báo vào khởi tạo giống như ở trên chương trình sẽ báo lỗi vì khi tạo đối tượng Box mới cần gán các giá trị ban đầu cho đối tượng: chiều dài, chiều rộng, chiều cao. Lúc này có thể sử như sau: Kết quả tương tự như ví dụ trên, việc sử dụng hàm khởi tạo đảm bảo dữ liệu của đối tượng bắt buộc phải khởi tạo ngay khi đối tượng đó được tạo – tránh việc sử dụng đối tượng mà dữ liệu không chính xác. Phương thức Destructor trong C# Một destructor trong C#, là một hàm thành viên đặc biệt của một lớp, được thực thi bất cứ khi nào một đối tượng của lớp đó thoát ra khởi phạm vi. 82
- Một destructor có tên giống tên lớp với một dẫu ngã (~) ở trước và nó có thể: không trả về một giá trị hoặc không nhận bất kỳ tham số nào. Destructor trong C# có thể rất hữu ích để giải phóng tài nguyên bộ nhớ trước khi thoát khỏi chương trình. Destructor không thể bị kế thừa hoặc nạp chồng. Ví dụ sau minh họa khái niệm về destructor trong C#: Chương trình được viết trong Program.cs Kết quả thực hiện chương trình 83
- Hình 9.1. Kết quả gọi class Box và truyền tham số Quá tải (Overloading) phương thức Kỹ thuật quá tải phương thức (Method Overloading) là cách thức triển khai khái niệm tính đa hình của lập trình hướng đối tượng. Quá tải phương thức là các phương thức có cùng tên nhưng tham số khác nhau (hàm có thể trả về kiểu dữ liệu khác nhau) Tính đa hình (polymorphism) là cách ứng xử của đối tượng - ứng xử này là khác nhau tùy thuộc vào tình huống cụ thể. Public static void WriteLine(); public static void WriteLine(bool value); public static void WriteLine(decimal value); public static void WriteLine(int value); Điều này giúp cho gọi Console.Writeline(a), tùy thuộc vào kiểu dữ liệu của a mà một hàm WriteLine tương ứng được thi hành. Ví dụ: public class OverloadingExample { public static int Sum(int a, int b) { return a + b; } public static double Sum(double a, double b) { return a + b; } } Lớp trên có hàm Sum quá tải, tùy thuộc vào kiểu tham số mà hàm Sum cụ thể được gọi. double a = 1; double b = 2; var c = OverloadingExample.Sum(a, b); // c = 3 có kiểu double int a = 1; int b = 2; 84
- var c = OverloadingExample.Sum(a, b); // c = 3 nhưng có kiểu int Chú ý: Khai báo hai hàm cùng tên, giống nhau hoàn toàn về tham số chỉ khác kiểu trả về sẽ gây lỗi. Tính đóng gói lập trình hướng đối tượng Tính đóng gói mục đích hạn chế tối đa việc can thiệp trực tiếp vào dữ liệu, hoặc thi hành các tác vụ nội bổ của đối tượng. Nói cách khác, một đối tượng là hộp đen đối với các thành phần bên ngoài, nó chỉ cho phép bên ngoài tương tác với nó ở một số phương thức, thuộc tính, trường dữ liệu nhất định – hạn chế. C# triển khai tính đóng gói này chính là sử dụng các Access Modifiers: public private protected internal khi khai báo lớp, phương thức, thuộc tính, trường dữ liệu (biến). Ví dụ: class Student { private string Name; } Khi sử dụng var s = new Student(); s.Name = “ABC”; Biên dịch sẽ lỗi error CS0122: ‘Student.Name’ is inaccessible due to its protection level. Vì trường Name là private không thể truy cập bằng code bên ngoài lớp như trên. Nhưng nếu thay bằng public thì không lỗi. Khi lập trình cố gắng tối đa ẩn thông tin ra bên ngoài lớp càng nhiều càng tốt để đảm bảo tính đóng gói của kỹ thuật lập trình OOP, nó giúp cho code dễ bảo trì và giám sát lỗi. Câu hỏi ôn tập và bài tập 1. Lớp đối tượng sinh viên bao gồm các thông tin: masv (mã sinh viên), tennv (tên sinh viên), ngaysinh (ngày sinh), diachi (địa chỉ), diemtoan (điểm toán), diemvan (điểm văn). Viết các phương thức phù hợp cho lớp để gán thông tin, tính điểm trung bình. 2. Lớp đối tượng đồng hồ bao gồm các thông tin: thoigian, gio, phut, giay. Viết phương thức đổi ra giây của dữ liệu được nhập vào 85
- 3. Lớp đối tượng sản phẩm bao gồm các thông tin: masp (mã sản phẩm), tensp (tên sản phẩm), gia (giá), ngaynhap (ngày nhập), ngayxuat (ngày xuất). Viết phương thức kiểm tra dữ liệu nhập: ngày xuất phải sau ngày nhập. 86
- BÀI 10: SỬ DỤNG FORM, MENUSTRIP Mã bài: 19.10 Giới thiệu: Form và Menustrip là 2 đối tượng cơ bản và cần thiết khi lập trình ứng dụng bằng Windows Forms. Bản thân Form được tạo đầu tiên khi chương trình được chạy, Menustrip là điều khiển có mặt ở hầu hết các chương trình ứng dụng thực tế. Mục tiêu: - Trình bày và vận dụng Form cho đồ án - Trình bày và vận dụng MenuStrip cho đồ án - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 10.1. Form Form : đối tượng cửa sổ của chương trình chứa các đối tượng khác Tạo mới một project Hình 10.1. Lựa chọn tạo mới 1 project 87
- Chọn ngôn ngữ Chọn ứng dụng Windows Forms Chọn nơi lưu Hình 10.2. Màn hình lựa chọn khi tạo mới project Quản lý dự án Form – biểu mẫu chính Các điều khiển Thuộc tích của điều khiển Hình 10.3. Màn hình quản lý các điều khiển trong Form 88
- Để ẩn/hiện các đối tượng trên màn hình làm việc vào View ToolBox/ Properties/ Hình 10.4. Lựa chọn hiển thị cho các cửa sổ con Danh mục các điều khiển Hình 10.5. Hiển thị các danh mục làm việc 89
- 10.2. Thuộc tính của Form Bảng 10.1. Bảng mô tả thuộc tính Form Thuộc tính Mô tả Name Đặt tên form Giá trị thuộc tính này nhận là tên của một button trên form. Khi đó thay vì nhấp chuột vào button AcceptButton để thực thi thì người dùng có thể ấn phím Enter trên bàn phím Backcolor Thiết lập màu nền của form BackgroundImage Thiết lập hình nền cho form Thiết lập việc hiển thị hình vừa thêm trong thuộc BackgroundImageLayout tính BackgroundImage sẽ hiển thị trên form ở dạng: bình thường (None), giữa (Center), Giá trị thuộc tính này nhận là tên của một button trên form. Khi đó thay vì nhấp chuột vào button CancelButton để thực thi thì người dùng có thể ấn phím Escape trên bàn phím Mang giá trị true hoặc false. Nếu thiết lập thuộc ControlBox tính là false thì sẽ loại bỏ các nút minimize và nút maximize trên form Thiết lập hình dạng con trỏ khi di chuyển Cusor con trỏ vào form Mang giá trị true hoặc false; Nếu thiết lập thuộc tính là false thì điều khiển trong Enable form sẽ không cho phép người dùng thao tác. Font Thiết lập văn bản hiển thị trên điều khiển Thiết lập màu mặc định cho chuỗi của các ForeColor điều khiển trên form Thiết lập đường viền của form và hành vi FormBorderStyle của form khi chạy chương trình Mang giá trị true hoặc false; Nếu thiết lập thuộc HelpButton tính là true thì trên thanh titlebar sẽ hiện 1 nút có dấu ? (nút này chỉ hiện khi hai thuộc tính 90
- MinimizeBox và MaximizeBox được thiết lập là false) Biểu tượng hiển thị bên trái trên thanh Icon titlebar của form Mang giá trị true hoặc false: nếu thiết lập KeyReview thuộc tính là true cho phép các sự kiện bàn phím của form có hiệu lực Khi thuộc tính StartPosition được thiết lập là Location Manual, thì thuộc tính Location có tác dụng thiết lập vị trí hiển thị của form trên màn hình Mang giá trị true hoặc false: nếu thiết lập thuộc MaximizeBox tính là false thì nút maximize form trên thanh titlebar sẽ mất đi Thiết lập kích thước lớn nhất của form MaximumSize (chiều rộng x chiều cao) Mang giá trị true hoặc false: nếu thiết lập thuộc MinimizeBox tính là false thì nút minimize form trên thanh titlebar sẽ mất đi Thiết lập kích thước nhỏ nhất của form MinimumSize (chiều rộng x chiều cao) Opacity Thiết lập độ trong suốt cho form Size Kích thước form StartPosition Vị trí hiển thị của form trên màn hình Chuỗi văn bản hiển thị trên Titlebar của Text Form Mang giá trị true hoặc false: nếu thiết lập thuộc Visible tính là True thì form sẽ được hiển thị trên màn hình, nếu là False sẽ không hiển thị trên màn hình Có 3 giá trị: Normal: hiển thị form bình thường; Minimized: khi chạy chương trình form sẽ bị thu WindowState nhỏ dưới thanh taskbar; Maximized: form hiển thị có kích thước đầy màn hình Mang giá trị True hoặc False. IsMDIContainer - Nếu là True: Form ở dạng MDI Form - Nếu là False: Form ở dạng bình thường 91
- Cài đặt giá trị là đối tượng MDI Form. Khi MdiParent thiết lập giá trị cho thuộc tính MdiParent thì form sẽ trở thành Child Form Bảng 10.2. Bảng mô tả các giá trị của FormStartPosition Giá trị Mô tả Nếu StartPosition mang giá trị Manual thì vị trí Manual form hiển thị sẽ là vị trí thiết lập tại thuộc tính Size. CenterScreen Form hiển giữa màn hình Form hiển thị tại vị trí mặc định với kích thước WindowsDefaultLocation form sẽ là kích thước form được thiết lập tại thuộc tính Size Form hiển thị tại vị trí mặc định với kích thước WindowsDefaultBounds form sẽ là kích thước mặc định CenterParent Form hiển thị ở vị trí giữa form cha Hiển thị Form1 ở vị trí giữa màn hình Form1.StartPosition = FormStartPosition.WindowsDefaultLocation; Lớp program mặc định để chạy chương trình Nhập tên Form để được chạy đầu tiên. Thay đổi tên form để chạy từng form Hình 10.6. Màn hình lập trình để cài đặt Form chạy đầu tiên Dòng lệnh trên chỉ ra rằng form đầu tiên sẽ hiển thị là form1. Do đó, lập trình viên chỉ cần sữa lại mã lệnh chỉ định một form khác muốn hiển thị bằng cách thay tên form đó cho form1 Ví dụ 1 : Hiển thị form có tên Form2 trong dự án 92
- Application.Run(new Form2()); Ví dụ 2: Viết chương trình hiển thị form cho trong sự kiện Form_load(): Nhấn Ctrl + Shift + B để biên dịch mã nguồn và nhấn F5 để thực thi chương trình sẽ được Mdi Form và Child Form. Kết quả chương trình Hình 10.7. Kết quả chương trình form cha – con 93
- Ví dụ 3: Thiết kế Form có hình dạng Kết quả chương trình Hình 10.8. Kết quả chương trình form dạng hình ellipse b. Sự kiện của Form Sự kiện của form hay có thể gọi là các hành động liên quan đến form. Ứng dụng Windows Forms được hỗ trợ nhiều sự kiện và các đoạn mã tạo ra các sự kiện đều được sinh ra một cách tự động. Để sử dụng các sự kiện của form cần thực hiện các thao tác sau: Bước 1: Nhấp chuột trái vào form Bước 2: Trên cửa sổ Properties tương ứng, nhấp chuột trái vào biểu tượng để mở hộp thoại các sự kiện. Bước 3: Hộp thoại chứa nhiều sự kiện liên quan đến form như: đóng form, mở form, di chuyển chuột vào form. 94
- Lựa chọn sự kiện cho điều khiển. Danh sách các sự kiện lệnh. Hình 10.9. Danh sách các sự kiện của form 95
- Bảng 10.3. Bảng mô tả các sự kiện của form Sự kiện Mô tả Xảy ra khi thuộc tính Autosize của Form chuyển từ AutoSizeChanged True sang False hay ngược lại là False sang True BackColorChanged Xảy ra khi thuộc tính BackColor của Form thay đổi Xảy ra khi người dùng Click chuột vào vùng làm Click việc thuộc Form ControlAdded Xảy ra khi một điều khiển được Add vào Form ControlRemoved Xảy ra khi một điều khiển bị xóa khỏi Form CursorChanged Xảy ra khi thuộc tính Cursor của Form thay đổi Xảy ra khi người dùng DoubleClick vào vùng làm DoubleClick việc của Form FontChanged Xảy ra khi thuộc tính Font của Form có sự thay đổi Xảy ra khi thuộc tính ForeColor của Form có sự thay ForeColorChanged đổi Xảy ra khi Form đã đóng (Nhấn vào nút X màu đỏ FormClosed trên titlebar) Xảy ra khi Form đang đóng (2 sự kiện FormClosed FormClosing và FormClosing thường dùng trong lập trình CSDL: khi xảy ra sự kiện này thì đóng kết nối CSDL) Xảy ra khi người dùng nhấn một phím hay một tố KeyDown hợp phím KeyPress Xảy ra khi người dùng nhấn một phím KeyUp Xảy ra khi người dùng nhả một phím Xảy ra khi người dùng nhấn chuột (một trong 3 lựa MouseClick chọn: Trái, giữa, phải) Xảy ra khi người dùng nhấp đúp chuột vào một MouseDoubleClick vùng làm việc của Form (một trong 3 lựa chọn: Trái, giữa, phải) MouseDown Xảy ra khi người dùng nhấn chuột Xảy ra khi người dùng di chuyển vào các vùng làm MouseHover việc Form Xảy ra khi di chuyển chuột ra khỏi vùng làm việc MouseLeave của Form 96
- Xảy ra khi di chuyển chuột trên một vùng làm việc thuộc Form (nếu Form có chứa một điều khiển nào MouseMove đó, khi di chuyển chuột trên điều khiển này thì không xảy ra sự kiện MouseMove của Form) Xảy ra khi người dùng nhả nhấn chuột (có thể là MouseUp chuột trái, chuột phải, chuột giữa – chuột cuộn) Xảy ra khi di chuyển Form (có sự thay đổi vị trí Move của Form) Xảy ra khi thuộc tính FormBorderStyle của Form StyleChanged thay đổi TextChanged Xảy ra khi thuộc tính Text của Form thay đổi. Sự kiện FormClosed: Sự kiện này được gọi khi Form đã đóng Sự kiện FormClosing: Sự kiện này được gọi khi Form đang đóng Sự kiện KeyPress: Xảy ra khi ấn phím, nếu không chỉ rõ phím nào được nhấn thì khi nhấn bất cứ phím nào của sự kiện KeyPress của form đều xảy ra. Sự kiện KeyDown: 97
- Sự kiện MouseClick: Xảy ra khi nhấn một trong 3 nút: chuột trái, giữa hoặc chuột phải 10.2. Menustrip Điều khiển MenuStrip cho phép lập trình viên xây dựng hệ thống menu trên form. Menu có thể xây dựng ở dạng một cấp hoặc nhiều cấp. Ví dụ menu của Notepad như hình 10.10. MenuStrip cho phép xây dụng menu với các điều khiển: ToolStripSeparator ToolStripMenuItem (Menu con) ToolStripCombobox (Combobox) ToolStripTextbox (Textbox) Danh sách các Menu của Notepad. Hình 10.10. Màn hình menu của Notepad 98
- MenuStrip được đặt trong nhóm Menus & Toolbars của cửa sổ Toolbox Hình 10.11. Hiển thị điều khiển MenuStrip trên ToolBox Một số thuộc tính thường dùng của MenuStrip: Bảng 10.4. Bảng mô tả các thuộc tính của MenuStrip Thuộc tính Mô tả TextDirection Chọn hình thức trình bày menu. - Hình thức Horizontal: TextDirection - Hình thức Vertical 90: - Hình thức Vertical 270: Thêm các menu con. Kiểu menu có thể chọn một trong 4 dạng: MenuItem, ComboBox, Separator, TextBox. Dạng MenuItem (menu con): Items Dạng Combobox: Dạng TextBox: Separator (Gạch phân cách): Mang giá trị Yes hoặc No. RightToLeft Nếu là Yes thì sẽ trình bày menu từ phải qua trái: Bảng 10.5. Bảng mô tả các thuộc tính thường dùng của MenuItem Thuộc tính Mô tả Mang giá trị True hoặc False. - Nếu là True: Hiện biểu tượng CheckBox bên cạnh chuỗi Checked Text Nếu là False: Không biểu tượng CheckBox Mang giá trị True hoặc False. - Nếu là True: Biểu tượng CheckBox sẽ xuất hiện bên CheckOnClick cạnh chuỗi Text của menu con khi người dùng nhấp chuột chọn. 99
- - Nếu là False: Thao tác nhấp chuột của người dùng sẽ không ảnh hưởng gì đến việc hiển thị hay không hiển thị của biểu tượng CheckBox Cho biết trạng thái của CheckBox trên menu con. Có 3 trạng thái: UnChecked, Checked, Indeteminate. CheckState Lưu ý: Trạng thái Indeterminate chỉ có hiệu lực khi thuộc tính Checked là True. Hình thức trình bày của menu con. Có 4 kiểu hiển thị: - None: Không hiển thị gì trên menu con - Text: Cho phép hiển thị chuỗi mô tả DisplayStyle - Image: Cho phép hiển thị hình hoặc biểu tượng bên cạnh Text. - ImageAndText: Cho phép hiển thị hình (biểu tượng) và chuỗi mô tả. Image Hình ảnh xuất hiện bên cạnh chuỗi Text Kiểu trình bày của hình trong thuộc tính Image. Có thể thiết lập một trong hai giá trị: ImageScaling - None: Hiển thị bình thường - SizeToFit: Hiển thị đúng kích cỡ của hình hoặc biểu tượng ShorcutKeys Tổ hợp phím tắt ứng với menu Mang giá trị True hoặc False: - Nếu là True: Cho phép hiễn thị giá trị trong thuộc tính ShowShortcutKeys ShortcutKeyDisplayString. - Nếu là False: giá trị trong thuộc tính ShortcutKeyDisplayString sẽ không hiển thị. Text Chuỗi ký tự hiển thị trên menu TooltipText Chuỗi ký tự hiển thị khi rê chuột vào menu Bảng 10.6. Bảng mô tả các sự kiện thường dùng của MenuItem Phát sinh khi trạng thái (CheckState) CheckedChange của CheckBox thay đổi Phát sinh khi người dùng nhấp chuột Click vào menu 100
- Menu con dạng Separator: Menu dạng này đơn thuần chỉ là một đường kẻ ngang giúp ngăn cách các menu với nhau, giúp hệ thống menu hiển thị một cách rõ ràng hơn. - Menu con dạng ComboBox: Các thuộc tính, phương thức và sự kiện giống với điều khiển ComboxBox. - Menu con dạng TextBox: Các thuộc tính, phương thức và sự kiện giống với điều khiển TextBox. Câu hỏi ôn tập và bài tập 1. Trong các dòng mã lệnh sau đây, mã lệnh nào cho phép tạo và hiển thị một đối tượng Windows Form mới có tên là Form1 a) Form1 frm = new Form1; frm.Show(); b) Form Form1 = new Form(); Form1.Show(); c) Form1 frm ; frm.Show(); d) Form frm; frm.Show(); e) Form Form1 = new Form(); Form1.ShowDialog(); 2. Trong các thuộc tính sau, thuộc tính nào dùng để thiết lập nội dung hiển thị trên thanh title bar và thuộc tính nào dùng để thiết lập màu nền của form. a) Thuộc tính Text và ForeColor b) Thuộc tính Display và BackColor c) Thuộc tính Text và BackColor private void Form1_Click(object sender, EventArgs e) { //Tạo đối tượng lớp Form Form Form2 = new Form();//Thiết lập tiêu đề trên titlebar của form 101
- Form2.Text = “Giao diện Form 2”; //Thiết lập vị trí hiển thị form Form2.StartPosition = FormStartPosition.CenterScreen; //Thiết lập màu nền cho form Form2.BackColor = Color.CadetBlue; //Kiểm tra giá trị trả về của phương thức ShowDialog() //nếu giá trị trả về là DialogResult.Cancel thì Form2 //đã đóng, tiến hành đóng Form1 bằng phương thức //Close() if (Form2.ShowDialog() == DialogResult.Cancel) { this.Close(); } } d) Thuộc tính Display và ForeColor 3. Các thuộc tính sau, thuộc tính nào cho phép thiết lập form trở thành MdiForm a) IsMdiContainer b) MdiParent c) MdiContainer d) ParentForm 4. Các thuộc tính sau, thuộc tính nào cho phép thiết lập form trở thành Child Form a) IsMdiContainer b) MdiParent c) MdiContainer d) ParentForm 5. Trong các sự kiện sau, sự kiện nào sẽ phát sinh khi form đã đóng a) FormClosed b) FormClosing c) ClosedForm d) ClosingForm 102
- e) Load f) Click 6. Xây dựng form có dạng hình tam giác như hình 2.21 Hình 10.12. Thiết kế form dạng tam giác 7. Thiết kế giao diện chương trình hiển thị thời gian như sau: Hình 10.12. Thiết kế form hiển thị MenuStrip Yêu cầu: Menu Chức năng: Gồm có chức năng mục Thoát dạng MenuItem. Khi người dùng nhấn chuột trái vào Thoát hoặc nhấn tổ hợp phím Ctrl + T sẽ thoát chương trình. Menu Nội dung hiển thị: Dạng ComboBox. ComboBox chứa hai mục chọn: Hiển thị thời gian: Giúp hiển thị giờ phút giây trên label lblHienThi Hiển thị ngày tháng: Giúp hiển thị ngày tháng năm trên label lblHienThi 8. Thiết kế Menu chức năng giống như sau: 103
- BÀI 11: SỬ DỤNG LABEL, TEXTBOX, BUTTON Mã bài: 19.11 Giới thiệu: Các điều khiển cơ bản để hiển thị văn bản (Label), cho phép nhập dữ liệu (Textbox) và sử dụng nút lệnh để thực hiện thao tác là không thể thiếu trong quá trình thiết kế một Form. Mục tiêu: - Trình bày và vận dụng Button cho đồ án - Trình bày và vận dụng Label cho đồ án - Trình bày và vận dụng TextBox cho đồ án - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 11.1. Label Label thường dùng hiển thị thông tin chỉ đọc và thường sử dụng kèm với các điều khiển khác để mô tả chức năng. Labelđược đặt trong nhóm Common Controls của cửa số Toolbox. Hình 11.1. Hiển thị điều khiển Label 104
- Một số thuộc tính thường dùng của Label: Bảng 11.1. Bảng mô tả thuộc tính Label Thuộc tính Mô tả BorderStyle Thiết lập đường viền Font Kích thước và kiểu chữ hiển thị trên Label Text Nội dung hiển thị trên Label Backcolor Màu nền của Label Name Tên của Label Locked Khóa không cho di chuyển Enabled Đánh dấu tích là đối tượng sẽ ở trạng thái hoạt động Cursor Đổi hình trỏ chuột khi đưa vào Label ForeColor Thiết lập màu chữ hiển thị trên Label TextAlign Căn lề chữ hiển thị trên Label Visible Ẩn hoặc hiện Label 105
- Ví dụ: Thiết kế form hiển thị thông tin sinh viên Hình 11.2. Form hiển thị thông tin sinh viên Thực hiện chương trình: Bước 1: Tạo Form có thuộc tính Text = “Giao diện Form 1”. Bước 2: Kéo tất cả 6 Label vào Bước 3: Áp dụng các thuộc tính Text, Font, FontColor để thực hiện yêu cầu. Trong đó chú ý hộp thoại sau để chọn chữ gạch dưới Hình 11.3. Hộp thoại điều chỉnh Font cho Label 106
- 11.2. TextBox TextBox là điều khiển dùng để nhập chuỗi làm dữ liệu đầu vào cho ứng dụng hoặc hiển thị chuỗi.Người dùng có thể nhập nhiều dòng, hoặc tạo mặt nạ để nhập mật khẩu. TextBox được đặt trong nhóm Common Controls của cửa số Toolbox. Hình 11.4. Hiển thị điều khiển Textbox Bảng 11.2. Bảng mô tả các thuộc tính của TextBox Thuộc tính Mô tả Name Tên của TextBox để gọi viết lệnh Text Nội dung hiển thị ban đầu khi chương trình chạy Font Chọn kiểu chữ, kích thước chữ cho TextBox ForeColor Chọn màu chữ cho TextBox BackColor Chọn màu nền cho TextBox Enable Cho phép/Không cho phép thao tác trên TextBox Mutiline Cho phép TextBox có nhiều dòng hay không PasswordChar Ký tự thay thế khi nhập vào TextBox ReadOnly Cho phép/Không cho phép sửa dữ liệu trên TextBox Visible Ẩn/ hiện TextBox TextAlign Canh lề dữ liệu trong TextBox MaxLength Quy định chuỗi Max sẽ nhập vào TextBox, mặc định là 32767 ScrollBars Các loại thanh cuộn (dọc, ngang, cả hai) Cho phép văn bản tự động xuống dòng khi độ dài vượt quá WordWrap chiều ngang của TextBox 107
- BorderStyle Định kiểu đường viền cho TextBox TabIndex TabIndex Chỉ định thứ tự tab của các TextBox trên form Focus TextBox sẵn sàng được tương tác bởi người sử dụng Mang giá trị True hoặc False, nếu là True thì cho phép thực CanUndo hiện phương thứcUndo(), mang giá trị True khi TextBox đã thực hiện thao tác thêm, sửa hay xóa nội dung. SelectedText Lấy ra phần nội dung chuỗi được bôi đen SelectionStart Vị trí bắt đầu chọn nội dung của chuỗi SelectionLength Chiều dài chuỗi sẽ chọn trong TextBox Mang giá trị True hoặc False, nếu là True thì không cho phép HideSelection sử dụng thuộc tính SelectionStart, nếu là giá trị False thì cho phép sử dụng SelectionStart Bảng 11.3. Bảng mô tả các sự kiện của TextBox Sự kiện Mô tả KeyDown Thực hiện công việc nào đó khi một phím được nhấn xuống KeyUp Thực hiện công việc nào đó khi một phím được nhả ra Xảy ra khi người sử dụng nhấn một phím và nhả ra, ta dùng sự kiện này để lọc các phím không muốn nhận như cho nhập KeyPress số (0 đến 9) không cho nhập chuỗi. Mỗi sự kiện KeyPress cho ta một cặp sự kiện KeyDown và KeyUp Click Click Nhấp chuột vào TextBox DoubleClick Nhấp đúp chuột vào TextBox MouseEnter Chuột nằm trong vùng thấy được của TextBox MouseHover Chuột nằm trong vùng hiển thị một quãng thời gian MouseLeave Chuột ra khỏi vùng nhập liệu của TextBox MouseMove Chuột được di chuyển trên TextBox TextChanged Giá trị của thuộc tính Text bị thay đổi Thực hiện công việc nào đó khi một phím được KeyDown nhấn xuống Thực hiện công việc nào đó khi một phím được KeyUp nhả ra 108
- Xảy ra khi người sử dụng nhấn một phím và nhả ra, ta dùng sự kiện này để lọc các phím không muốn nhận như cho nhập KeyPress số (0 đến 9) không cho nhập chuỗi. Mỗi sự kiện KeyPress cho ta một cặp sự kiện KeyDown và KeyUp Click Nhấp chuột vào TextBox DoubleClick Nhấp đúp chuột vào TextBox MouseEnter Chuột nằm trong vùng thấy được của TextBox Chuột nằm trong vùng hiển thị một quãng thời MouseHover gian MouseLeave Chuột ra khỏi vùng nhập liệu của TextBox MouseMove Chuột được di chuyển trên TextBox TextChanged Giá trị của thuộc tính Text bị thay đổi MouseEnter Chuột nằm trong vùng thấy được của TextBox 109
- Ví dụ: Thiết kế form và thực hiện các yêu cầu Hình 11.5. Form tìm kiếm chuỗi trong văn bản Thực hiện chương trình: Bước 1: Tạo Form có thuộc tính Text = “Giao diện Form 1”. Bước 2: Đưa vào form các điều khiển sau: 2 Label, 2 Textbox, 2 Button Bước 3: Thực hiện lập trình cho các Button Lập trình sự kiện Click cho nút Thoát: Lập trình sự kiện Click cho nút Tìm kiếm: 11.3. Button Button là điều khiển tạo giao diện nút lệnh trên form, khi người dùng nhấn chuột vào nút lệnh thì chương trình sẽ thực hiện một hành động nào đó. Button được đặt trong nhóm Common Controls 110
- Hình 11.6. Hiển thị điều khiển Button Bảng 11.4. Bảng mô tả thuộc tính Button Thuộc tính Mô tả Name Đặt tên cho nút lệnh Text Nội dung hiển thị trên nút nhấn Visible Ẩn/ hiện nút nhấn Enable Cho phép/ không cho phép tương tác với nút lệnh Font Chỉ định kiểu chữ, kích cỡ chữ hiển thị ForeColor Màu chữ hiện thị trên nút lệnh Image Hình ảnh hiển thị trên nút lệnh BackColor Màu của nút lệnh TabIndex Chỉ định thứ tự tab của các Button trên form Ví dụ: Thiết kế form xử lý nút lệnh như sau. Yêu cầu: Khi nhấp chuột vào nút lệnh “Hiểnthị” thì in sẽ hiển thị chữ “Xin chào” tại vị trí “ nội dung hiển thị ”, khi nhấp chuột vào nút lệnh “Thoát” sẽ đóng chương trình. 111
- Hình 11.7. Form thực hiện thay đổi nội dung Label Thực hiện chương trình: Bước 1: Tạo Form có thuộc tính Text = “Giao diện Form 1”. Bước 2: Đưa vào form các điều khiển sau: 2 Label, 2 Button Bước 3: Thực hiện lập trình cho các Button Sự kiện Click của nút lệnh btnHienThi: Sự kiện Click của nút lệnh btnThoat: Câu hỏi ôn tập và bài tập 1. Viết chương trình tạo form tính tổng có giao diện: Hình 11.8. Form tính tổng số n Yêu cầu: - Nhập vào số n, kiểm tra dữ liệu khi nhập n, dữ liệu phải là số - Khi nhấn vào nút Tính kết quả tổng từ 1 n sẽ được tính và lưu vào Textbox “Tổng là”. - Nút Thoát dùng để đóng chương trình, hỏi trước khi thoát. 2. Viết chương trình tạo form tìm số lớn nhất, nhỏ nhất trong 2 số có giao diện: 112
- Hình 11.9. Form tìm số nhỏ nhất, lớn nhất trong 2 số Yêu cầu: - Nhập vào 2 số, kiểm tra dữ liệu khi nhập, dữ liệu phải là số - Khi nhấn vào nút Tìm kết quả số lớn nhất, nhỏ nhất sẽ được lưu vào ô phù hợp. - Nút Thoát dùng để đóng chương trình, hỏi trước khi thoát. 3. Viết chương trình tạo form đến số lần cho mỗi lần nhấp chuột trái: Hình 11.10. Form đếm số lần nhấp chuột Yêu cầu: - Khi nhấn vào nút “Click here” sẽ xuất ra kết quả số lần nhấp chuột trái đã thực hiện trên nút đó. - Nút dùng để đóng chương trình, hỏi trước khi thoát. 4. Viết chương trình tạo form thực hiện các phép tính có giao diện: 113
- Hình 11.11. Thực hiện các phép tính của 2 số Yêu cầu: - Nhập vào 2 số, kiểm tra dữ liệu khi nhập, dữ liệu phải là số - Khi đã nhập số nhấp vào nút “+/-/*/:” sẽ thực hiện các phép tính phù hợp và đưa kết quả vào Textbox. - Nút Xóa dùng để xóa trắng lại dữ liệu đưa Form về trạng thái ban đầu. - Nút Thoát dùng để đóng chương trình, hỏi trước khi thoát. 5. Viết chương trình tạo form có giao diện: Hình 11.12. Thiết kế Form đăng nhập 114
- BÀI 12: SỬ DỤNG CHECKBOX, RADIOBUTTON, GROUPBOX Mã bài: 19.12 Giới thiệu: Điều khiển dùng để gom nhóm các đối tượng (GroupBox) giúp việc thiết kế và tổng hợp các điều khiển trên Form dễ quan sát và sử dụng. Ngoài ra điều khiển lựa chọn CheckBox và RadioButton cho phép người dùng được phép lựa chọn trên giao diện lập trình. Mục tiêu: - Trình bày và vận dụng Checkbox cho đồ án - Trình bày và vận dụng RadioButton cho đồ án - Trình bày và vận dụng GroupBox cho đồ án - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 12.1. Checkbox CheckBox là điều khiển cho phép trình bày các giá trị để lựa chọn trên form, người dùng có thể chọn một hoặc nhiều giá trị cùng lúc. Điều khiển CheckBox được đặt trong nhóm Common Controls của cửa sổ Toolbox Hình 12.1. Màn hình hiển thị điều khiển CheckBox 115
- Bảng 12.1. Bảng mô tả các thuộc tính của CheckBox Thuộc tính Mô tả Mang giá trị True hoặc False, nếu là giá trị True thì cho phép AutoCheck người dùng nhấp chuột để chọn, nếu là False thì không cho phép người dùng nhấp chuột chọn. Thiết lập cho điều khiển CheckBox được lựa chọn hoặc Checked không. Thiết lập giá trị True là điều khiển được chọn, nếu thiết lập False là điều khiển không được chọn. Thường dùng để kiểm tra tình trạng CheckBox có được chọn hay không. Mang 3 giá trị Unchecked, Checked, và Indeterminate. CheckState Checked: Điều khiển đang được chọn UnChecked: Điều khiển không được chọn Indeterminate: Điều khiển ở trạng thái không hoạt động Text Chuỗi văn bản hiển thị bên cạnh CheckBox Mang giá trị True hoặc False; Nếu là True thì cho phép ThreeState CheckBox có 3 trạng thái: Checked, UnChecked, Indeterminate. Mang giá trị Yes hoặc No; Cho biết chuỗi văn bản hiển thị RightToLeft (thuộc tính Text) nằm bên trái hay bên phải của CheckBox Sự kiện thường sử dụng của CheckBox: Sự kiện quan trọng và thường xuyên sử dụng của CheckBox là sự kiện Clickvà CheckedChange. Hai sự kiện này của CheckBox cho biết khi nhấp chuột chọn thì CheckBox sẽ ở trạng thái chọn (Checked) hay ở trạng thái không chọn (UnChecked). Hình 12.2. Form lựa chọn danh sách môn học của sinh viên 116
- Yêu cầu: - Khi nhấn nút “Lưu” sẽ xuất hiện MessageBox hiển thị thông tin gồm: Họ tên sinh viên, lớp, và các môn học sinh viên chọn. - Khi nhấn nút “Thoát” sẽ đóng chương trình. Sự kiện Click của nút lệnh btnThoat Sự kiện Click nút lệnh btnLuu 12.2. RadioButton RadioButton là điều khiển cho phép trình bày các giá trị để lựa chọn trên form. Điểm khác biệt của RadioButtonvới CheckBox là người dùng chỉ có thể có một sự lựa chọn với các RadioButton cùng nhóm, nghĩa là RadioButton có thể phân vào những nhóm khác nhau. Với những RadioButton cùng nhóm, khi người dùng nhấp chọn một RadioButton thì đồng thời các RadioButton khác trong nhóm 117
- sẽ lập tức bỏ chọn. Điều khiển RadioButton được đặt trong nhóm Common Controls của cửa sổ Toolbox Hình 12.3. Hiển thị điều khiển RadioButton Bảng 12.2. Bảng mô tả các thuộc tính của RadioButton Thuộc tính Mô tả Thiết lập cho điều khiển RadioButton được lựa chọn Checked hoặc không. Thiết lập giá trị True là điều khiển được chọn, nếu thiết lập False là điều khiển không được chọn Text Chuỗi văn bản hiển thị bên cạnh RadioButton Mang giá trị Yes hoặc No; Cho biết chuỗi văn bản hiển RightToLeft thị thuộc tính Text) nằm bên trái hay bên phải của RadioButton Ngoài viêc thiết lập thuộc tính Checked để thay đổi tình trạng của RadioButton, lập trình viên cũng có thể sử dụng để kiểm tra tình trạng của RadioButton. Nếu RadioButton được chọn thì thuộc tính Checked sẽ là True, nếu RadioButton không được chọn sẽ là False. Tất cả RadioButton được chứa trong điều khiển thuộc nhóm Containers để tạo thành một nhóm, thông thường sử dụng điều khiển Panel hay GroupBox. 118
- Điều này cho phép người dùng chỉ có thể chọn duy nhất một RadioButton trong nhóm. Hình 12.4. Các điều khiển để chứa các điều khiển khác Panel, GroupBox Sự kiện thường sử dụng của RadioButton: Tương tự như CheckBox, sự kiện thường dùng của RadioButton cũng là hai sự kiện Click và CheckedChange. Sự kiện Click thực hiện khi người dùng nhấp chuột vào RadioButton, còn sự kiện CheckedChang thực hiện khi tình trạng của 119
- RadioButton bị thay đổi từ trạng thái chọn (Checked) sang trạng thái không chọn UnChecked) và ngược lại. Ví dụ: Thiết kế chương trình sau: Hình 12.5. Form lựa chọn danh sách môn học của sinh viên Thực hiện chương trình Bước 1: Tạo Form có thuộc tính Text = “Form 1”. Bước 2: Đưa vào form các điều khiển Bước 3: Thực hiện lập trình cho các Button Sự kiện Click của nút lệnh btnDangKy: 120
- Sự kiện Click của nút lệnh btnThoat 12.3. GroupBox GroupBox là dạng điều khiển chứa, có thể chứa các điều khiển khác hiển thị trên form, giúp cho việc thiết kế giao diện của form dễ nhìn và khoa học hơn. GroupBox không hỗ trợ thanh trượt (ScrollBar). GroupBox có thể có tiêu đề hiển thị, tiêu đề này được thiết lập trong thuộc tính Text. Nếu không muốn hiển thị tiêu đề, có thể thiết lập chuỗi rỗng trong thuộc tính Text. Hình 12.6. Hiển thị điều khiển GroupBox Thông thường GroupBox sử dụng để nhóm điều khiển RadioButton Bảng 12.4. Bảng mô tả các thuộc tính của GroupBox Thuộc tính Mô tả 121
- Name Đặt tên cho GroupBox Text Chuỗi hiển thị Font Thiết lập kiểu chữ, kích thước chữ, ForeColor Thiết lập màu chữ hiển thị BackColor Thiết lập màu nền của GroupBox Mang giá trị True hoặc False. Visible - Nếu là True: Hiển thị GroupBox - Nếu là False: Không hiển thị GroupBox Mang giá trị True hoặc False. - Nếu là True: GroupBox tự động thay đổi kích thước để có AutoSize thể hiển thị hết các điều khiển chứa bên trong - Nếu là False: GroupBox có kích thước như lập trình viên thiết lập. Quy định cách thức điều khiển thay đổi kích thước. AutoSizeMode - GrowAndShrink: GroupBox có thể co và giãn - GrowOnly: Mặc định, chỉ giãn lớn Ví dụ: Hình 12.7. Form định dạng chuỗi dữ liệu Yêu cầu: Khi người dùng nhập chuỗi văn bản trong TextBox thì Label “Chuỗi định dạng” sẽ hiển thị chuỗi văn bản vừa nhập. Khi nhấp chuột chọn các Radio trong GroupBox “Màu” và GroupBox “Kiểu hiển thị” thì chuỗi định dạng sẽ thay đổi định dạng tương ứng với lựa chọn của người dùng. Thực hiện chương trình: 122