Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (5.23 MB, 214 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
UBND TỈNH BÀ RỊA – VŨNG TÀU
<b>TRƯỜNG CAO ĐẲNG KỸ THUẬT CƠNG NGHỆ</b>
<b>MƠ ĐUN: LẬP TRÌNH WINDOWS FORMS</b>
<b>NGHỀ: CƠNG NGHỆ THƠNG TIN</b>
<b>TRÌNH ĐỘ: CAO ĐẮNG</b>
<i>(Ban hành kèm theo Quyết định số: /QĐ-CĐKTCN</i>
<b>TUYÊN BỐ BẢN QUYỀN</b>
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 ngun bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo.
<b>LỜI GIỚI THIỆU</b>
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
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 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 q 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 q 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
<b>MỤC LỤC</b>
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, thố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 tố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
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
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
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...upload.123doc.net
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
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
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
<b>GIÁO TRÌNH MƠ ĐUN</b>
<b>Tên mơ đun: Lập trình Windows forms</b>
<b>Mã mơ đun: MĐ 20</b>
<b>Vị trí, tính chất, ý nghĩa và vai trị của mơ đun:</b>
- 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….
<b>Mục tiêu của mơ đun:</b>
- 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,..)
+ Gia công các phần mềm theo yêu cầu khách hàng.
<b>BÀI 1: GIỚI THIỆU TỔNG QUAN </b>
<b>Mã bài: 19.01</b>
<b>Giới thiệu:</b>
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.
<b>Mục tiêu:</b>
- Trình bày nhu cầu xây dựng các ứng dụng thực tế.
<b>1.1. Giới thiệu các ứng dụng thực tế</b>
<b>.NET Framework là gì ?</b>
.NET Framework là nền tảng phát triển hồ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ế:
<b>1.2. Khởi động, thốt chương trình</b>
Để tải Visual Studio 2019, thực hiện vào
link: />
<i>Hình 1.1. Màn hình Download phần mềm cài đặt Visual Studio</i>
Ở 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:
<i>Hình 1.3. Màn hình download tiến hành cài đặt</i>
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:
<i>Hình 1.4. Màn hình lựa chọn để cài đặt</i>
Chọn Desktop Application (Winform, WPF). Tương tự cho Universal Windows
Platform development , Mobile (Xamarin) thì nhấp chọn vào.
<i>Hình 1.5. Lựa chọn cấu hình cài đặt</i>
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.
<i>Hình 1.7. Đăng nhập username và mật khẩu</i>
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
<i>Hình 1.8. Màn hình khởi động chương trình Visual Studio</i>
Màn hình sau khi khởi động thành cơng
<i>Hình 1.9. Lựa chọn chức năng làm việc</i>
Ở màn hình có 3 lựa chọn chính:
- 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.
<i>Hình 1.10. Lựa chọn mơi trường và ngơn ngữ làm việc</i>
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…).
<i>Hình 1.11. Màn hình lựa chọn nơi lưu Project</i>
<b>1.3. Sử dụng hệ thống trợ giúp</b>
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:
<b>Câu hỏi ôn tập và bài tập</b>
1. Tiến hành cài đặt Visual Studio trên máy tính.
<b>BÀI 2: CÁC THÀNH PHẦN CƠ BẢN</b>
<b>Mã bài: 19.02</b>
<b>Giới thiệu:</b>
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.
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>2.1. Hệ thống ký hiệu và từ khóa</b>
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.
<i>Bảng 2.1: Bảng mơ tả các từ khóa của C#</i>
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
char extern is readonly true for
checked false lock ref try null
class finally long return typeof short
const fixed namespace sbyte uint unchecked
continue float new sealed ulong
<b>2.2. Các kiểu dữ liệu cơ bản</b>
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.
<i>Bảng 2.2: Bảng mô tả các kiểu dữ liệu giá trị trong C#</i>
<b>Kiểu</b>
<b>C#</b>
<b>Số</b>
<b>Byte</b>
<b>Kiểu</b>
<b>.NET</b> <b>Mô tả</b>
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
int 4 Int32 Số nguyên có dấu: -2.147.483.647 đến
2.147.483.647
uint 4 Uint32 Số nguyên không dấu: 0 đến
4.294.967.295
float 4 Single
Kiểu dấu chấm động, giá trị xấp xỉ từ
3,4E-38 đến 3,4E+38; với 7 chữ số có
nghĩa
double 8 Double
Kiểu dấu chấm động, giá trị xấp xỉ từ
1,7E-308 đến 1,7E+308; với 15, 16 chữ
số có nghĩa
decimal 8 Decimal
Có độ chính xác đến 28 con số và giá trị
long 8 Int64
Kiểu số nguyên có dấu có giá trị trong
khoảng: -9.233.370.036.854.775.808 đến
– 9.233.372.036.854.775.807
ulong 8 Uint64 Số nguyên không dấu từ 0 đến
0xffffffffffffff
<i>Lưu ý:</i>
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.
<b>Chuyển kiểu dữ liệu:</b>
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(<Tham số>)
- ToInt64(<Tham số>)
<Tham số>: 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
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:
- Boolean.Parse(<chuoi>): Chuyển chuỗi về kiểu Boolean
- Single.Parse(<chuoi>): 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
<b>2.3. Biến, hằng, biểu thức</b>
<b>2.3.1. Biến</b>
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:
<b><Kiểu dữ liệu> <Tên biến> </b>
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:
<b><Tên biến> = <giá trị> </b>
= là phép tốn gán giá trị
<b>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</b>
đú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 (_).
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:
student:
_Name:
Emp_Name:
@goto:
static:
4myclass:
Student&Falculty:
Hợp lệ
Hợp lệ
Hợp lệ
Hợp lệ
Hợp lệ
Khơng hợp lệ, trùng từ khóa
Khơng hợp lệ, khơng thể bắt đầu bằng ký tự số
Không hợp lệ, không được chứa ký tự đặc biệt
<b>2.3.2. Hằng</b>
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:
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:
<const> <type> <tên hằng> = <giá trị>;
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.
<b>2.4. Các phép toán</b>
<b>2.4.1. Toán tử (Operator) trong C#</b>
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
<i>Bảng 2.3: Bảng mơ tả các tốn tử trong C#</i>
<b>Tốn tử</b> <b>Tên</b> <b>Ví dụ</b> <b>Kết quả</b>
+ 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ụ:
Một số toán tử gán được sử dụng trong C#:
<i>Bảng 2.4: Bảng mơ tả các tốn tử phép gán trong C#</i>
<b>Tốn tử</b> <b>Ví dụ</b> <b>Kết quả</b>
= 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>>=3 Gán giá trị x = x>>3
&= x&=2 Gán giá trị x = x&2 (Phép AND bit)
^= x^=2 Gán giá trị x = x^2 (Phép OR loại trừ<sub>bit)</sub>
|= x|=2 Gán giá trị x = x|2 (Phép OR bit)
Kết quả khi chạy chương trình trên
<b>2.4.3. Tốn tử tăng giảm tiền tố và hậu tố:</b>
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 <sub>y = ++x;</sub>
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 tố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.
Đô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 tốn tử logic như sau:
<i>Bảng 2.5: Bảng mơ tả các tốn tử logic trong C#</i>
<b>Toán</b>
<b>tử</b>
<b>Ký</b>
<b>hiệu</b> <b>Cú pháp</b> <b>Miêu tả</b>
AND && <BT1> &&
<BT2> Trả về true nếu cả 2 đều đúng
OR || <BT1>||<BT2> Trả về true nếu 1 trong 2 biểu
thức đúng
NOT ! !(BT) Trả về phủ định của biểu thức
trong ngoặc
<b>2.4.5. Toán tử quan hệ</b>
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:
<i>Bảng 2.6: Bảng mơ tả các toán tử quan hệ trong C#</i>
<b>Toán tử</b> <b>Ký hiệu</b> <b>Biểu thức so</b>
<b>sánh</b> <b>Kết quả so sánh</b>
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à
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à tốn tử gán (‘=’) khơng phải là tốn tử so sánh. Do
vậy khi sử dụng tố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 tố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;
<b>* Khoảng trắng (whitespace)</b>
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
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ơn 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ừ khố 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.
<b>2.4.6. Câu lệnh (statement)</b>
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.
Ngồ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.
<b>Câu hỏi ôn tập và bài tập</b>
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
<b>BÀI 3: SỬ DỤNG CÂU LỆNH NHẬP XUẤT CƠ BẢN, CẤU TRÚC</b>
<b>ĐIỀU KHIỂN IF</b>
<b>Mã bài: 19.03</b>
<b>Giới thiệu:</b>
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
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>3.1. Các câu lệnh nhập xuất cơ bản</b>
<b>3.1.1. Console.Write();</b>
<b>Cú pháp:</b>
Console.Write(<i><giá trị cần in ra màn hình></i>);
<b>Ý nghĩa: In giá trị ra màn hình console. Giá trị này có thể là 1 ký tự, 1 chuỗi,</b>
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();
<b>3.1.2. Console.WriteLine();</b>
<b>Cú pháp:</b>
<b>Ý nghĩa:</b>
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.
Ngồ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”)
<b>3.1.3. Console.Read();</b>
<b>Cú pháp:</b>
Console.Read();
<b>Ý nghĩa:</b>
Đọ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ự đó.
<b>Chú ý: lệnh này không đọc được các phím chức năng</b>
như Ctrl, Shift, Alt, Caps Lock, Tab, . . .
<b>3.1.4. Console.ReadLine();</b>
<b>Cú pháp:</b>
Console.ReadLine();
<b>Ý 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</b>
(Nói cách khác là đọc cho đến khi mình nhấn enter thì dừng) và giá trị đọc được
ln là một chuỗi.
<b>3.1.5. Console.ReadKey();</b>
<b>Cú pháp:</b>
Console.ReadKey(<tham số kiểu bool>)
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).
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>Bước 1: Mở Visual Studio </b> Chọn File Chọn Project…
<i>Hình 3.1: Màn hình tạo mới một Project</i>
Chọn Visual C# chọn Console App (.NET Framework) Nhập Name, chọn
Location Chọn OK
Sau khi tạo xong Project cấu trúc thư mục được lưu vào trong Solution
<i>Hình 3.3: Màn hình quản lý Solution</i>
Một Solution gồm nhiều Project có cấu trúc như sau:
<i>Hình 3.4: Màn hình quản lý Project</i>
Nhấp chuột phải
vào Solution
Chọn Add Thêm
project mới
Danh sách các dự án project
<i>Hình 3.5: Màn hình gán cho Project được chạy đầu tiên</i>
Project sau khi tạo
<i>Hình 3.6: Màn hình ban đầu của cửa sổ làm việc Program.cs</i>
<b>Bước 2: Viết xử lý cho Program.cs</b>
<i>Hình 3.7: Code để nhập xuất thơng tin sinh viên</i>
<b>Bước 3: Chạy chương trình</b>
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 đó.
<i>Hình 3.8: Kiểm tra lỗi của Solution</i>
Kiểm tra lỗi trước khi chạy
<i>Hình 3.9: Màn hình thơng báo lỗi của chương trình</i>
Chọn Start hoặc nhấp vào biểu tượng để chạy chương trình. Phím
tắt (F5).
<i>Hình 3.10: Chọn biểu tượng để thực thi (chạy) chương trình</i>
Giao diện chương trình khi chạy sau khi nhập thơng tin sinh viên
<i>Hình 3.11: Màn hình hiển thị kết quả chương trình</i>
<b>3.2. Câu lệnh if...else</b>
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)
<Khối lệnh thực hiện khi điều kiện đúng>
[else
<Khối lệnh thực hiện khi điều kiện sai>]
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)
{
<Lệnh 1> <Lệnh 2> ... }
[else
{
<lệnh 1> <lệnh 2> .... }]
Kết quả chương trình:
<i>Hình 3.12. Màn hình kết quả câu lệnh if…else</i>
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 tố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:
Kết quả chương trình:
<i>Hình 3.13. Màn hình kết quả nhiều câu lệnh if…else</i>
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 tố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:
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
<b>* Câu lệnh if lồng nhau</b>
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ó 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.
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:
<i>Hình 3.14. Màn hình kết quả if…else lồng</i>
<b>Câu hỏi ơn tập và bài tập</b>
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:
2. Viết chương trình nhập vào các thơng tin:
Tên
<b>BÀI 4: SỬ DỤNG CẤU TRÚC LỰA CHỌN SWITCH..CASE, FOR,</b>
<b>FOR EACH</b>
<b>Mã bài: 19.04</b>
<b>Giới thiệu:</b>
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
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>4.1. Câu lệnh switch</b>
Khi có q 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 (<biểu thức>)
{
case <giá trị thứ 1>: <câu lệnh thứ 1>;
break;
case <giá trị thứ 2>: <câu lệnh thứ 2>;
break;
. . .
case <giá trị thứ n>: <câu lệnh thứ n>;
break;
default: <câu lệnh mặc định>;
break;
}
switch, case, default là từ khóa bắt buộc.
<biểu thứ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ê
<giá trị thứ i> với i = 1..n là giá trị muốn so sánh với giá trị của <biểu
thức>.
<câu lệnh thứ i> với i = 1..n là câu lệnh muốn thực hiện khi <giá trị thứ i>
tương ứng bằng với giá trị của <biểu thức>.
<câu lệnh mặc định> là câu lệnh sẽ được thực hiện nếu giá trị <biểu thức>
không bằng với <giá trị thứ i> nào.
<b>Ý nghĩa: Duyệt lần lượt từ trên xuống dưới và kiểm tra xem giá trị của <biểu</b>
thức> có bằng với <giá trị thứ i> đang xét hay không. Nếu bằng thì thực
hiện <câu lệnh thứ i> tương ứng. Nếu không bằng tất cả các <giá trị thứ i> thì sẽ
thực hiện <câu lệnh mặc định>.
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ứ
Kết quả thực hiện chương trình
<i>Hình 4.1. Kết quả chương trình lệnh switch…case</i>
<b>4.2. Câu lệnh for</b>
Cú pháp:
<b>for ([Khởi tạo]; [Điều kiện lặp]; [Bước</b>
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.
<b>Tiến trình:</b>
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:
<b>for (; ;) // lưu ý dấu ;</b>
{
// 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].
<b>Khởi tạo</b>
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.
<i>Hình 4.2. Màn hình để tạo mới một Class</i>
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).
<i>Hình 4.3. Kết quả vịng lặp for khuyết</i>
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 ,
<b>for</b> <b>static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> 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
<b>for</b> (i = 0, <b>int</b> j = 0; ; )
{
Console.WriteLine(i);
}
Console.ReadKey();
}
Hay:
<b>static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> 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
<b>for</b> (i = 0; <b>int</b> j = 0; ; )
{
Console.WriteLine(i);
Console.ReadKey();
}
<b>Điều kiện lặp</b>
<b>Đ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</b>
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.
<b>Static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> i;
// vòng lặp for này vấỗn lặp vỗ tận vì khỗng bao giờ thoỉa mãn điềều
kiện dừng
// i luỗn == 0
// Điềều kiện lặp luỗn là true
<b>for</b> (i = 0; i < 10;)
{
Console.WriteLine(i);
}
}
Ta có thể thấy Điều kiện lặp của vịng lặp này ln là true, nên vịng lặp sẽ lặp
vơ tận.
<i>Hình 4.4. Kết quả vịng lập for vơ tận</i>
Để 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);
<b>static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> i;
<b>for</b> (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 ý:
Xem bảng thử dưới đây để hiểu rõ về số lần lặp:
<i>Bảng 4.1. Mô tả số lần lặp của vòng lặp for</i>
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
<b>11</b> <b>10</b> <b>FALSE</b>
Hồn tồ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.
<b>Static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> i;
<b>for</b> (i = 0; (i % 3 == 0) && (i < 10);)
{
Console.WriteLine(i);
i++;
}
Console.ReadKey();
}
Hay
<b>static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> i;
Hay
<b>static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> i;
<b>for</b> (i = 0; <b>true</b>;)
{
Console.WriteLine(i);
i++;
}
Console.ReadKey();
}
<b>Bước lặp lại</b>
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:
<b>static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> i;
<b>for</b> (i = 0; i < 10;)
{
<i>Hình 4.5. Màn hình kết quả tăng biến i ngồi vịng lặp for</i>
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.
<b>Static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> i;
<b>for</b> (i = 0; i < 10; <b>i++)</b>
{
Console.WriteLine(i);
}
Console.ReadKey();
}
Kết quả tương tự như bình thường
<i>Hình 4.6. Màn hình kết quả tăng biến i trong vịng lặp for</i>
Ví dụ. Một vịng lặp for tổng hợp
<b>static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> n = 100;
<b>int</b> j = 0;
<b>for</b> (<b>int</b> i = 0; i * j < n; i++, j += 3,Console.WriteLine(“Kềất
quaỉ For Loop {0}”, i))
{
Console.WriteLine(“=======================================”);
Console.WriteLine(“i: {0} | j: {1} | i * j: {2}”, i, j, i *
j);
}
Console.ReadKey();
}
<i>Hình 4.7. Màn hình kết quả vịng lặp for tổng hợp</i>
Cũng có thể vẽ một hình chữ nhật rỗng NxM với vòng lặp for:
<b>static</b> <b>void</b> Main(<b>string</b>[] args)
{
<b>int</b> N = 10;
<b>int</b> M = 20;
<b>char</b> drawChar = ‘*’;
<b>char</b> insideChar = ‘ ‘;
// Vẽ từ trền xuỗấng
<b>for</b> (<b>int</b> i = 0; i < N; i++)
{
// Vẽ từ trái sang
<b>for</b> (<b>int</b> 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 phaỉ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ự cuỉa hình chữ nhật
* ngược lại vẽ ra ký tự khỗng thuộc hình chữ nhật
*/
<b>if</b> (i % (N – 1) == 0 || ((i % (N – 1) != 0) && (j % (M
– 1) == 0)))
{
Console.Write(drawChar); // lúc này là ký tự *
}
Console.Write(insideChar); // lúc này là ký tự
rỗỗng ‘ ‘
}
}
//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
<i>Hình 4.8. Màn hình kết quả vịng lặp để vẽ hình vng</i>
<b>4.3. Câu lệnh for …each</b>
<b>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</b>
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 ngồi ra khơng thể làm gì
khác.
Cú pháp
foreach (<kiểu dữ liệu> <tên biến tạm> in <tên mảng
hoặc tập hợp>)
{
// Code xử lý
}
Trong đó:
Các từ khố foreach, in là từ khố bắt buộc.
<kiểu dữ liệu> là kiểu dữ liệu của các phần tử trong mảng hoặc tập hợp.
<tên biến tạm> là tên 1 biến tạm đại diện cho phần tử đang xét khi duyệt
<tên mảng hoặc tập hợp> là tên của mảng hoặc tập hợp cần duyệt.
Nguyên tắc hoạt động
<b>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ụ</b>
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
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:
Kết quả chương trình
<i>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</i>
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:
<i>Hình 4.10 Màn hình kết quả dùng vòng lặp foreach in ra giá trị mảng</i>
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.
<b>So sánh for và foreach trong C#</b>
<b>foreach mang trong mình một số ưu điểm như:</b>
Câu lệnh ngắn gọn, sẽ sử dụng.
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.
<i>Bảng 4.2. So sánh tiêu chí của 2 vịng lặp for và foreach</i>
<b>Tiêu chí</b> <b>for</b> <b>foreach</b>
Khả năng truy xuất
phần tử
Truy xuất ngẫu nhiên (có
thể gọi bất kỳ phần tử nào
trong mảng để sử dụng)
Truy xuất tuần tự (chỉ sử
dụng được giá trị phần tử
đang xét)
Thay đổi được giá trị
của các phần tử
Có Khơng
Duyệt mảng, tập hợp
khi không biết được
số phần tử của mảng,
tập hợp
Khơng Có
Hiệu suất (tốc độ xử
lý) (*)
Đối với mảng, danh sách
hoặc tập hợp có khả năng
truy xuất ngẫu nhiên
thì for sẽ chiếm ưu thế
Đối với mảng, danh sách
hoặc tập hợp khơng có khả
năng truy xuất ngẫu nhiên
thì foreach chiếm ưu thế
<b>Câu hỏi ôn tập và bài tập</b>
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 vng
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
- 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.
<b>BÀI 5: SỬ DỤNG CẤU TRÚC LỰA VÒNG LẶP WHILE, DO…</b>
<b>WHILE</b>
<b>Mã bài: 19.05</b>
<b>Giới thiệu:</b>
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.
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>5.1. Sử dụng cấu trúc vịng lặp While</b>
while (<Điều kiện lặp>)
{
// 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.
<b>Tiến trình:</b>
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.
Điều kiện lặp ln 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 ln 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:
<i>Hình 5.1. Kết quả thực hiện vòng lặp while in ra dãy số từ 10 </i><i> 19</i>
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
Kết quả chương trình
<b>5.2. Sử dụng cấu trúc vòng lặp do …while</b>
<b>Cú pháp</b>
do
{
// khối lệnh lặp lai
} while (<Điều kiện lặp>);
Đ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.
<b>Tiến trình:</b>
Đầ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 ln 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 ln 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
Kết quả thực hiện chương trình:
<i>Hình 5.2. Kết quả thực hiện vịng lặp do…while in ra dãy số từ 10 </i><i> 19</i>
Kết quả thực hiện chương trình:
<i>Hình 5.4. Kết quả thực hiện vịng lặp do…while in ra ma trận</i>
<b>Câu hỏi ơn tập và bài tập</b>
Á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.
<b>BÀI 6: SỬ DỤNG CÂU LỆNH BREAK, CONTINUE, GOTO</b>
<b>Mã bài: 19.06</b>
<b>Giới thiệu:</b>
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ể.
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>6.1. Sử dụng câu lệnh break</b>
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:
Ví dụ:
Kết quả chương trình:
<i>Hình 6.1. Kết quả lệnh break</i>
<b>6.2. Sử dụng câu lệnh continue</b>
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:
Ví dụ:
Kết quả chương trình:
<i>Hình 6.2. Kết quả thực hiện lệnh continue</i>
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 tố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
<b>goto. Sau đây là cách sử dụng lệnh nhảy goto:</b>
Cú pháp:
<b>goto <label>;</b>
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
Kết quả chương trình
<i>Hình 6.4. Kết quả thực hiện vịng lặp vơ tận</i>
<b>Câu hỏi ôn tập và bài tập</b>
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”.
<b>BÀI 7: HÀM</b>
<b>Mã bài: 19.07</b>
<b>Giới thiệu:</b>
Hàm là chương trình con được sử dụng thường xun trong tồn bộ q
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 q 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.
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>7.1. Khái niệm</b>
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á
<b>7.2. Quy tắc xây dựng hàm</b>
Cú pháp:
<Quyền truy cập> <Kiểu trả về> Tên hàm (<Tham số>)
{
// Thân hàm
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
<b>Lưu ý:</b>
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.
<i>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#</i>
<i>console hàm Main</i>
<b>7.3. Ngun tắc hoạt động của hàm</b>
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.
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.
<b>Static</b> <b>void</b> Main(<b>string</b>[] args)
{
// Gọi lại hàm đềỉ sưỉ dụng
Console.OutputEncoding = Encoding.UTF8;
Demo();
Console.ReadKey();
}
<b>static</b> <b>void</b> 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ừ
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.
<b>static</b> <b>void</b> Main(<b>string</b>[] 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();
}
<b>static</b> <b>void</b> 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.
<b>Hàm có kiểu trả về khác void</b>
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ề>;
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.
/// <summary>
/// Hàm traỉ vềề giá trị sỗấ nguyền 5 thỗng qua tền hàm
/// Lưu ý giá trị traỉ vềề phaỉi cùng kiềỉu dữ liệu với kiềỉu traỉ vềề cuỉa
hàm
/// Ởỉ đấy là kiềỉu int
/// </summary>
/// <returns></returns>
<b>static</b> <b>int</b> ReturnANumber()
{
// bắất buộc phaỉi có cấấu trúc return trong thấn hàm
<b>return</b> 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.
<b>Static</b> <b>void</b> Main(<b>string</b>[] args)
{
Console.WriteLine(ReturnANumber());
Console.ReadKey();
}
/// <summary>
/// Hàm traỉ vềề giá trị sỗấ nguyền 5 thỗng qua tền hàm
/// Lưu ý giá trị traỉ vềề phaỉi cùng kiềỉu dữ liệu với kiềỉu traỉ vềề cuỉa
hàm
/// Ởỉ đấy là kiềỉu int
/// </summary>
/// <returns></returns>
<b>static</b> <b>int</b> ReturnANumber()
{
// bắất buộc phaỉi có cấấu trúc return trong thấn hàm
<b>return</b> 5;
}
<i>Kết quả số 5 xuất hiện trên màn hình</i>
Kết quả chương trình
Kết quả chương trình
<i>Hình 7.2. Kết quả hàm trả về giá trị</i>
<b>7.5. Sử dụng hàm</b>
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.
<b>7.5.1. Gọi bằng giá trị (</b><i><b>call by value</b></i><b>)</b>
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
<i>Hình 7.3. Kết quả gọi hàm bằng giá trị</i>
<b>7.5.2. Gọi bằng tham chiếu (</b><i><b>call by Reference</b></i><b>)</b>
<i>Hình 7.4. Kết quả gọi hàm bằng tham chiếu</i>
<b>7.5.3. Tham số out</b>
Tham số out giống như kiểu tham chiếu, ngoại trừ việc nó khơng u cầu biến
khởi tạo trước khi truyền.
Kết quả chương trình
<i>Hình 7.5. Kết quả gọi hàm bằng tham số out</i>
Như vậy mình chỉ cần phân biệt ref và out như sau:
<i>Bảng 7.1. Phân biệt giữ ref và out</i>
<b>ref</b> <b>out</b>
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
thay đổi giá trị nó
Hàm phải gán giá trị cho biến out
trước khi trả giá trị về
<b>Câu hỏi ôn tập và bài tập</b>
<b>BÀI 8: THIẾT KẾ LỚP ĐỐI TƯỢNG</b>
<b>Mã bài: 19.08</b>
<b>Giới thiệu:</b>
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.
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>8.1. Định nghĩa lớp đối tượng</b>
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
<b>Tính trừu tượng (abstraction) mơ tả một cách tổng qt hóa mà khơng</b>
chi tiết thơng tin (triển khai với interface, abstract)
<b>Tính đóng gói (encapsulation) dữ liệu đối tượng cố gắng như nằm trong</b>
một hộp đen, các thành phần khác bên ngồi đối tượng khơng trực tiếp tác
động đến dữ liệu
<b>Tính đa hình (polymorphism) đối tượng ứng xử khác nhau tùy trường</b>
hợp cụ thể
<b>Tính kế thừa (inheritance) đặc tính của lớp được kế thừa từ một lớp khác</b>
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) –
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.
<b>Đố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</b>
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.
<b>Ví dụ: Một lớp mơ tả chung về nhân viên, đặt tên là nhanvien, thì bên trong nó</b>
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 ...
<b>8.2. Khai báo lớp đối tượng</b>
<i>Hình 8.1. Màn hình để chọn thêm một lớp mới vào Project</i>
<i>Hình 8.2. Màn hình đặt tên cho lớp đối tượng</i>
<b>Cú pháp, ví dụ khai báo lớp</b>
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.
<b>Cú pháp cơ bản như sau:</b>
<Access Modifiers> 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:
<i>Bảng 8.1. Bảng mơ tả các từ khóa định nghĩa lớp</i>
<b>Từ khóa</b> <b>Giải thích</b>
<b>Public</b> Truy xuất mọi nơi
<b>Protected</b> Truy xuất trong nội bộ lớp hoặc trong các lớp con
<b>Internal</b> Truy xuất trong nội bộ chương trình (Assembly)
<b>protected internal</b> Truy xuất nội trong chương trình (assembly) và
trong các lớp con
<b>private (mặc định)</b> 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.
<b>Câu hỏi ôn tập và bài tập</b>
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ỉ)
<b>BÀI 9 : ĐỊNH NGHĨA CÁC THUỘC TÍNH, PHƯƠNG THỨC HÀNH</b>
<b>ĐỘNG CHO LỚP ĐỐI TƯỢNG</b>
<b>Mã bài: 19.09</b>
<b>Giới thiệu:</b>
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.
<b>Mục tiêu:</b>
- Đị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.
<b>Nội dung chính:</b>
<b>9.1. Định nghĩa các thuộc tính cho lớp đối tượng</b>
Ví dụ:
- Định nghĩa lớp đối tượng Box gồm các thuộc tính chieudai, chieurong,
chieucao.
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:
<b>Từ khóa this</b>
Từ khóa <sub>this</sub> 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 <sub>this</sub> để 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 ;
}
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.
<b>9.2. Định nghĩa các phương thức hành động cho lớp đối tượng</b>
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 tố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ề.
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 đó thốt ra khởi phạm vi.
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ể:
Destructor trong C# có thể rất hữu ích để giải phóng tài ngun bộ nhớ trước khi
thốt khỏi chương trình. Destructor không thể bị kế thừa hoặc nạp chồng.
Chương trình được viết trong Program.cs
Kết quả thực hiện chương trình
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)
<b>Tính đa hình (polymorphism) là cách ứng xử của đối tượng - ứng xử này là</b>
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;
var c = OverloadingExample.Sum(a, b); // c = 3 nhưng có kiềỉu int
<i><b>Chú ý: Khai báo hai hàm cùng tên, giống nhau hoàn toàn về tham số chỉ</b></i>
<i><b>khác kiểu trả về sẽ gây lỗi.</b></i>
<b>Tính đóng gói lập trình hướng đối tượng</b>
<b>C# triển khai tính đóng gói này chính là sử dụng các Access Modifiers: public</b>
private protected internal khi khai báo lớp, phương thức, thuộc tính, trường dữ
liệu (biến).
<b>Ví dụ:</b>
class Student
{
private string Name;
}
<b>Khi sử dụng</b>
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 ngồ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ì
<b>Câu hỏi ôn tập và bài tập</b>
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
<b>BÀI 10: SỬ DỤNG FORM, MENUSTRIP</b>
<b>Mã bài: 19.10</b>
<b>Giới thiệu:</b>
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ế.
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>10.1. Form</b>
Form : đối tượng cửa sổ của chương trình chứa các đối tượng khác
<i>Hình 10.2. Màn hình lựa chọn khi tạo mới project</i>
<i>Hình 10.3. Màn hình quản lý các điều khiển trong Form</i>
Chọn nơi lưu
Chọn ứng dụng Windows Forms
Chọn ngôn ngữ
Thuộc tích của
điều khiển
Quản lý dự án
Để ẩn/hiện các đối tượng trên màn hình làm việc vào View ToolBox/
Properties/…
<i>Hình 10.4. Lựa chọn hiển thị cho các cửa sổ con </i>
Danh mục các điều khiển
<b>10.2. Thuộc tính của Form</b>
<i>Bảng 10.1. Bảng mơ tả thuộc tính Form</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Name </b> Đặt tên form
<b>AcceptButton </b>
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
để thực thi thì người dùng có thể ấn phím Enter
trên bàn phím
<b>Backcolor </b> Thiết lập màu nền của form
<b>BackgroundImage </b> Thiết lập hình nền cho form
<b>BackgroundImageLayou</b>
<b>t </b>
Thiết lập việc hiển thị hình vừa thêm trong thuộc
tính BackgroundImage sẽ hiển thị trên form ở
dạng: bình thường (None), giữa (Center), …
<b>CancelButton </b>
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
để thực thi thì người dùng có thể ấn phím
Escape trên bàn phím
<b>ControlBox </b>
Mang giá trị true hoặc false. Nếu thiết lập thuộc
tính là false thì sẽ loại bỏ các nút minimize và
nút maximize trên form
<b>Cusor </b> Thiết lập hình dạng con trỏ khi di chuyển
con trỏ vào form
<b>Enable </b>
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
form sẽ không cho phép người dùng thao
tác.
<b>Font </b> Thiết lập văn bản hiển thị trên điều khiển
<b>ForeColor </b> Thiết lập màu mặc định cho chuỗi của các
điều khiển trên form
<b>FormBorderStyle </b> Thiết lập đường viền của form và hành vi
của form khi chạy chương trình
<b>HelpButton </b>
Mang giá trị true hoặc false; Nếu thiết lập thuộc
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
MinimizeBox và
MaximizeBox được thiết lập là false)
titlebar của form
<b>KeyReview </b>
Mang giá trị true hoặc false: nếu thiết lập
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
<b>Location </b>
Khi thuộc tính StartPosition được thiết lập là
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
<b>MaximizeBox </b>
Mang giá trị true hoặc false: nếu thiết lập thuộc
tính là false thì nút maximize form trên thanh
titlebar sẽ mất đi
<b>MaximumSize </b> Thiết lập kích thước lớn nhất của form
(chiều rộng x chiều cao)
<b>MinimizeBox </b>
Mang giá trị true hoặc false: nếu thiết lập thuộc
tính là false thì nút minimize form trên thanh
titlebar sẽ mất đi
<b>MinimumSize </b> Thiết lập kích thước nhỏ nhất của form
(chiều rộng x chiều cao)
<b>Opacity </b> Thiết lập độ trong suốt cho form
<b>Size </b> Kích thước form
<b>StartPosition </b> Vị trí hiển thị của form trên màn hình
<b>Text </b> Chuỗi văn bản hiển thị trên Titlebar của
Form
<b>Visible </b>
Mang giá trị true hoặc false: nếu thiết lập thuộc
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
<b>WindowState </b>
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
<b>IsMDIContainer </b>
Mang giá trị True hoặc False.
- Nếu là True: Form ở dạng MDI Form
- Nếu là False: Form ở dạng bình thường
<b>MdiParent </b>
Cài đặt giá trị là đối tượng MDI Form. Khi
thiết lập giá trị cho thuộc tính MdiParent
thì form sẽ trở thành Child Form
<i>Bảng 10.2. Bảng mô tả các giá trị của FormStartPosition</i>
<b>Manual </b>
Nếu StartPosition mang giá trị Manual thì vị trí
form hiển thị sẽ là vị trí thiết lập tại thuộc tính
<i>Size.</i>
<b>CenterScreen </b> Form hiển giữa màn hình
<b>WindowsDefaultLocatio</b>
<b>n</b>
Form hiển thị tại vị trí mặc định với kích thước
tính Size
<b>WindowsDefaultBounds</b> Form hiển thị tại vị trí mặc định với kích thước
form sẽ là kích thước mặc định
<b>CenterParent </b> 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;
<i>Hình 10.6. Màn hình lập trình để cài đặt Form chạy đầu tiên</i>
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
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ập tên Form để được chạy đầu tiên.
Thay đổi tên form để chạy từng form
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
<i>Hình 10.7. Kết quả chương trình form cha – con</i>
Kết quả chương trình
<i>Hình 10.8. Kết quả chương trình form dạng hình ellipse</i>
<b>b. Sự kiện của Form</b>
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.
<i>Bảng 10.3. Bảng mô tả các sự kiện của form</i>
<b>Sự kiện</b> <b>Mô tả</b>
<b>AutoSizeChanged </b> Xảy ra khi thuộc tính Autosize của Form chuyển từ
True sang False hay ngược lại là False sang True
<b>BackColorChange</b>
<b>d </b> Xảy ra khi thuộc tính BackColor của Form thay đổi
<b>Click </b> Xảy ra khi người dùng Click chuột vào vùng làm
việc thuộc Form
<b>ControlAdded </b> Xảy ra khi một điều khiển được Add vào Form
<b>ControlRemoved </b> Xảy ra khi một điều khiển bị xóa khỏi Form
<b>CursorChanged </b> Xảy ra khi thuộc tính Cursor của Form thay đổi
<b>DoubleClick </b> Xảy ra khi người dùng DoubleClick vào vùng làm
việc của Form
<b>FontChanged </b> Xảy ra khi thuộc tính Font của Form có sự thay đổi
<b>ForeColorChanged</b> Xảy ra khi thuộc tính ForeColor của Form có sự thay
đổi
<b>FormClosed </b> Xảy ra khi Form đã đóng (Nhấn vào nút X màu đỏ
trên titlebar)
<b>FormClosing </b>
Xảy ra khi Form đang đóng (2 sự kiện FormClosed
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)
<b>KeyDown </b> Xảy ra khi người dùng nhấn một phím hay một tố
hợp phím
<b>KeyPress </b> Xảy ra khi người dùng nhấn một phím
<b>KeyUp </b> Xảy ra khi người dùng nhả một phím
<b>MouseClick </b> Xảy ra khi người dùng nhấn chuột (một trong 3 lựa
chọn: Trái, giữa, phải)
<b>MouseDoubleClick </b>
Xảy ra khi người dùng nhấp đúp chuột vào một
vùng làm việc của Form (một trong 3 lựa chọn: Trái,
giữa, phải)
<b>MouseDown </b> Xảy ra khi người dùng nhấn chuột
<b>MouseHover </b> Xảy ra khi người dùng di chuyển vào các vùng làm
việc Form
<b>MouseLeave </b> Xảy ra khi di chuyển chuột ra khỏi vùng làm việc
của Form
xảy ra sự kiện MouseMove của Form)
<b>MouseUp </b> Xảy ra khi người dùng nhả nhấn chuột (có thể là
chuột trái, chuột phải, chuột giữa – chuột cuộn)
<b>Move </b> Xảy ra khi di chuyển Form (có sự thay đổi vị trí
của Form)
<b>StyleChanged </b> Xảy ra khi thuộc tính FormBorderStyle của Form
thay đổi
<b>TextChanged </b> 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:
<b>10.2. Menustrip</b>
Đ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)
MenuStrip được đặt trong nhóm Menus & Toolbars của cửa sổ Toolbox
<i>Hình 10.11. Hiển thị điều khiển MenuStrip trên ToolBox</i>
Một số thuộc tính thường dùng của MenuStrip:
<i>Bảng 10.4. Bảng mơ tả các thuộc tính của MenuStrip</i>
<b>Thuộc tính </b> <b>Mơ tả</b>
<b>TextDirection</b>
TextDirection Chọn hình thức trình bày menu.
- Hình thức Horizontal:
- Hình thức Vertical 90:
- Hình thức Vertical 270:
<b>Items </b>
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):
Dạng Combobox:
Dạng TextBox:
Separator (Gạch phân cách):
<b>RightToLeft </b> Mang giá trị Yes hoặc No.
Nếu là Yes thì sẽ trình bày menu từ phải qua trái:
<i>Bảng 10.5. Bảng mô tả các thuộc tính thường dùng của MenuItem</i>
<b>Thuộc tính </b> <b>Mơ tả</b>
<b>Checked </b>
Mang giá trị True hoặc False.
- Nếu là True: Hiện biểu tượng CheckBox bên cạnh
chuỗi Text
Nếu là False: Không biểu tượng CheckBox
<b>CheckOnClick </b>
Mang giá trị True hoặc False.
- Nếu là True: Biểu tượng CheckBox sẽ xuất hiện bên
cạnh chuỗi Text của menu con khi người dùng nhấp
chuột chọn.
- 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
<b>CheckState </b> Cho biết trạng thái của CheckBox trên menu con.
Lưu ý: Trạng thái Indeterminate chỉ có hiệu lực khi
thuộc tính Checked là True.
<b>DisplayStyle </b>
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ả
- 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ả.
<b>Image </b> Hình ảnh xuất hiện bên cạnh chuỗi Text
<b>ImageScaling </b>
Kiểu trình bày của hình trong thuộc tính <b>Image</b>. Có thể
thiết lập một trong hai giá trị:
- <b>None</b>: Hiển thị bình thường
- <b>SizeToFit</b>: Hiển thị đúng kích cỡ của hình hoặc biểu
tượng
<b>ShorcutKeys </b> Tổ hợp phím tắt ứng với menu
<b>ShowShortcutKey</b>
<b>s </b>
Mang giá trị <b>True </b>hoặc <b>False</b>:
- Nếu là <b>True</b>: Cho phép hiễn thị giá trị trong thuộc tính
<b>ShortcutKeyDisplayString</b>.
- Nếu là <b>False</b>: giá trị trong thuộc tính
<b>ShortcutKeyDisplayString </b>sẽ không hiển thị.
<b>Text </b> Chuỗi ký tự hiển thị trên menu
<b>TooltipText </b> Chuỗi ký tự hiển thị khi rê chuột vào menu
<i>Bảng 10.6. Bảng mô tả các sự kiện thường dùng của MenuItem </i>
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.
<b>Câu hỏi ôn tập và bài tập </b>
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)
{
Form Form2 = new Form();//Thiết lập tiêu đề trên
titlebar của form
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
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
a) FormClosed
b) FormClosing
c) ClosedForm
d) ClosingForm
e) Load
f) Click
6. Xây dựng form có dạng hình tam giác như hình 2.21
<i>Hình 10.12. Thiết kế form dạng tam giác</i>
7. Thiết kế giao diện chương trình hiển thị thời gian như sau:
<i>Hình 10.12. Thiết kế form hiển thị MenuStrip</i>
Yêu cầu:
Menu Chức năng: Gồm có chức năng mục Thố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ẽ thốt
Menu Nội dung hiển thị: Dạng ComboBox. ComboBox chứa hai mục chọn:
<b>Hiển thị thời gian: Giúp hiển thị giờ phút giây trên label lblHienThi</b>
<b>Hiển thị ngày tháng: Giúp hiển thị ngày tháng năm trên label lblHienThi </b>
<b>BÀI 11: SỬ DỤNG LABEL, TEXTBOX, BUTTON</b>
<b>Mã bài: 19.11</b>
<b>Giới thiệu:</b>
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 q
trình thiết kế một Form.
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>11.1. Label</b>
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.
Một số thuộc tính thường dùng của Label:
<i>Bảng 11.1. Bảng mô tả thuộc tính Label</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>BorderStyle</b> Thiết lập đường viền
<b>Font</b> Kích thước và kiểu chữ hiển thị trên Label
<b>Text</b> Nội dung hiển thị trên Label
<b>Backcolor </b> Màu nền của Label
<b>Name</b> Tên của Label
<b>Locked</b> Khóa khơng cho di chuyển
<b>Enabled</b> Đánh dấu tích là đối tượng sẽ ở trạng thái hoạt động
<b>Cursor </b> Đổi hình trỏ chuột khi đưa vào Label
<b>ForeColor </b> Thiết lập màu chữ hiển thị trên Label
<b>TextAlign</b> Căn lề chữ hiển thị trên Label
Ví dụ: Thiết kế form hiển thị thơng tin sinh viên
<i>Hình 11.2. Form hiển thị thơng tin sinh viên</i>
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
<b>11.2. TextBox</b>
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.
<i>Hình 11.4. Hiển thị điều khiển Textbox</i>
<i>Bảng 11.2. Bảng mơ tả các thuộc tính của TextBox</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Name</b> Tên của TextBox để gọi viết lệnh
<b>Text </b> Nội dung hiển thị ban đầu khi chương trình chạy
<b>Font</b> Chọn kiểu chữ, kích thước chữ cho TextBox
<b>ForeColor</b> Chọn màu chữ cho TextBox
<b>BackColor</b> Chọn màu nền cho TextBox
<b>Enable</b> Cho phép/Không cho phép thao tác trên TextBox
<b>Mutiline</b> Cho phép TextBox có nhiều dịng hay khơng
<b>PasswordChar</b> Ký tự thay thế khi nhập vào TextBox
<b>ReadOnly</b> Cho phép/Không cho phép sửa dữ liệu trên TextBox
<b>Visible</b> Ẩn/ hiện TextBox
<b>TextAlign</b> Canh lề dữ liệu trong TextBox
<b>MaxLength</b> Quy định chuỗi Max sẽ nhập vào TextBox, mặc định là<sub>32767</sub>
<b>ScrollBars</b> Các loại thanh cuộn (dọc, ngang, cả hai)
<b>WordWrap</b> Cho phép văn bản tự động xuống dòng khi độ dài vượt quá<sub>chiều ngang của TextBox</sub>
<b>BorderStyle</b> Định kiểu đường viền cho TextBox
<b>TabIndex</b> TabIndex Chỉ định thứ tự tab của các TextBox trên form
<b>CanUndo </b>
Mang giá trị True hoặc False, nếu là True thì cho phép thực
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.
<b>SelectedText </b> Lấy ra phần nội dung chuỗi được bôi đen
<b>SelectionStart </b> Vị trí bắt đầu chọn nội dung của chuỗi
<b>SelectionLength </b> Chiều dài chuỗi sẽ chọn trong TextBox
<b>HideSelection </b>
Mang giá trị True hoặc False, nếu là True thì khơng cho
phép sử dụng thuộc tính SelectionStart, nếu là giá trị False
thì cho phép sử dụng SelectionStart
<i>Bảng 11.3. Bảng mô tả các sự kiện của TextBox</i>
<b>Sự kiện</b> <b>Mô tả</b>
<b>KeyDown</b> Thực hiện công việc nào đó khi một phím được nhấn xuống
<b>KeyUp </b> Thực hiện cơng việc nào đó khi một phím được nhả ra
<b>KeyPress</b>
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 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
<b>Click </b> Click Nhấp chuột vào TextBox
<b>DoubleClick</b> Nhấp đúp chuột vào TextBox
<b>MouseEnter </b> Chuột nằm trong vùng thấy được của TextBox
<b>MouseHover</b> Chuột nằm trong vùng hiển thị một quãng thời gian
<b>MouseLeave </b> Chuột ra khỏi vùng nhập liệu của TextBox
<b>MouseMove</b> Chuột được di chuyển trên TextBox
<b>TextChanged</b> Giá trị của thuộc tính Text bị thay đổi
<b>KeyDown</b> Thực hiện công việc nào đó khi một phím được<sub>nhấn xuống</sub>
<b>KeyUp</b> Thực hiện công việc nào đó khi một phím được<sub>nhả ra</sub>
<b>KeyPress</b>
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 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
<b>Click </b> Nhấp chuột vào TextBox
<b>DoubleClick </b> Nhấp đúp chuột vào TextBox
<b>MouseHover </b> Chuột nằm trong vùng hiển thị một quãng thời<sub>gian</sub>
<b>MouseLeave </b> Chuột ra khỏi vùng nhập liệu của TextBox
<b>MouseMove</b> Chuột được di chuyển trên TextBox
<b>TextChanged </b> Giá trị của thuộc tính Text bị thay đổi
Ví dụ: Thiết kế form và thực hiện các yêu cầu
<i>Hình 11.5. Form tìm kiếm chuỗi trong văn bản</i>
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 Thốt:
Lập trình sự kiện Click cho nút Tìm kiếm:
<b>11.3. Button</b>
<i>Hình 11.6. Hiển thị điều khiển Button</i>
<i>Bảng 11.4. Bảng mô tả thuộc tính Button</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Name</b> Đặt tên cho nút lệnh
<b>Text</b> Nội dung hiển thị trên nút nhấn
<b>Visible</b> Ẩn/ hiện nút nhấn
<b>Enable</b> Cho phép/ không cho phép tương tác với nút<sub>lệnh</sub>
<b>Font</b> Chỉ định kiểu chữ, kích cỡ chữ hiển thị
<b>ForeColor </b> Màu chữ hiện thị trên nút lệnh
<b>Image</b> Hình ảnh hiển thị trên nút lệnh
<b>BackColor </b> Màu của nút lệnh
<b>TabIndex</b> 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
<b>chào” tại vị trí “---nội dung hiển thị---”, khi nhấp chuột vào nút lệnh “Thốt”</b>
sẽ đóng chương trình.
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:
<b>Câu hỏi ôn tập và bài tập</b>
1. Viết chương trình tạo form tính tổng có giao diện:
<i>Hình 11.8. Form tính tổng số n</i>
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 Thốt dùng để đóng chương trình, hỏi trước khi thốt.
<i>Hình 11.9. Form tìm số nhỏ nhất, lớn nhất trong 2 số</i>
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 Thốt dùng để đóng chương trình, hỏi trước khi thố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:
<i>Hình 11.10. Form đếm số lần nhấp chuột</i>
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 thốt.
<i>Hình 11.11. Thực hiện các phép tính của 2 số</i>
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 Thốt dùng để đóng chương trình, hỏi trước khi thốt.
5. Viết chương trình tạo form có giao diện:
<b>BÀI 12: SỬ DỤNG CHECKBOX, RADIOBUTTON, GROUPBOX</b>
<b>Mã bài: 19.12</b>
<b>Giới thiệu:</b>
Đ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.
<b>Mục tiêu:</b>
- 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.
<b>Nội dung chính:</b>
<b>12.1. Checkbox</b>
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
<i>Bảng 12.1. Bảng mô tả các thuộc tính của CheckBox</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>AutoCheck </b>
Mang giá trị True hoặc False, nếu là giá trị True thì cho phép
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.
<b>Checked </b>
Thiết lập cho điều khiển CheckBox được lựa chọn 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.
<b>CheckState </b>
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à
<i>Indeterminate.</i>
<i>Checked: Điều khiển đang được chọn </i>
<i>UnChecked: Điều khiển không được chọn</i>
<i>Indeterminate: Điều khiển ở trạng thái không hoạt động</i>
<b>Text </b> Chuỗi văn bản hiển thị bên cạnh CheckBox
<b>ThreeState </b>
Mang giá trị True hoặc False; Nếu là True thì cho phép
<i>CheckBox có 3 trạng thái: Checked, UnChecked,</i>
<i>Indeterminate.</i>
<b>RightToLef</b>
<b>t </b>
Mang giá trị Yes hoặc No; Cho biết chuỗi văn bản hiển thị
(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à
<i>CheckedChange. Hai sự kiện này của CheckBox cho biết khi nhấp chuột chọn</i>
thì
<i>CheckBox sẽ ở trạng thái chọn (Checked) hay ở trạng thái không chọn</i>
(UnChecked).
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 “Thốt” sẽ đóng chương trình.
Sự kiện Click của nút lệnh btnThoat
<b>12.2. RadioButton</b>
RadioButton là điều khiển cho phép trình bày các giá trị để lựa chọn trên
<i>Hình 12.3. Hiển thị điều khiển RadioButton</i>
<i>Bảng 12.2. Bảng mơ tả các thuộc tính của RadioButton </i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Checked </b>
Thiết lập cho điều khiển RadioButton được lựa chọn
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
<b>Text </b> Chuỗi văn bản hiển thị bên cạnh RadioButton
<b>RightToLeft </b>
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
<i>RadioButton được chọn thì thuộc tính Checked sẽ là True, nếu RadioButton</i>
không
được chọn sẽ là False.
<i>Hình 12.4. Các điều khiển để chứa các điều khiển khác Panel, GroupBox</i>
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
<i>RadioButton bị thay đổi từ trạng thái chọn (Checked) sang trạng thái không</i>
chọn UnChecked) và ngược lại.
Ví dụ: Thiết kế chương trình sau:
<i>Hình 12.5. Form lựa chọn danh sách môn học của sinh viên</i>
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
Sự kiện Click của nút lệnh btnThoat
<b>12.3. GroupBox</b>
<i>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</i>
form, giúp cho việc thiết kế giao diện của form dễ nhìn và khoa học hơn.
<i>GroupBox không hỗ trợ thanh trượt (ScrollBar). GroupBox có thể có tiêu đề</i>
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.
<i>Hình 12.6. Hiển thị điều khiển GroupBox</i>
Thơng thường GroupBox sử dụng để nhóm điều khiển RadioButton
<i>Bảng 12.4. Bảng mơ tả các thuộc tính của GroupBox</i>
<b>Name </b> Đặt tên cho GroupBox
<b>Text </b> Chuỗi hiển thị
<b>Font </b> Thiết lập kiểu chữ, kích thước chữ, ..
<b>ForeColor </b> Thiết lập màu chữ hiển thị
<b>BackColor </b> Thiết lập màu nền của GroupBox
<b>Visible </b>
Mang giá trị True hoặc False.
- Nếu là True: Hiển thị GroupBox
- Nếu là False: Không hiển thị GroupBox
<b>AutoSize </b>
Mang giá trị True hoặc False.
- Nếu là True: GroupBox tự động thay đổi kích thước để có
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.
<b>AutoSizeMod</b>
<b>e </b>
Quy định cách thức điều khiển thay đổi kích thước.
- GrowAndShrink: GroupBox có thể co và giãn
- GrowOnly: Mặc định, chỉ giãn lớn
Ví dụ:
<i>Hình 12.7. Form định dạng chuỗi dữ liệu</i>
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.
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 cho nút btnThoat
Sự kiện TextChanged của txtNhapChuoi:
Sự kiện CheckedChanged của radXanh:
Tương tự cho các RadioButton khác.
Sự kiện CheckedChanged của radInDam:
Sự kiện CheckedChanged của radInNghieng:
<b>Câu hỏi ôn tập và bài tập</b>
1. Viết chương trình tạo form đăng nhập có giao diện
<i>Hình 12.8. Form đăng nhập hệ thống</i>
Yêu cầu:
Người dùng nhập tên tài khoản và mật khẩu trên TextBox txtTen và txtMatkhau.
- Nếu CheckBox chkHienThi khơng được chọn thì ở TextBox txtMatkhau sẽ
hiện dấu * với mỗi ký tự người dùng gõ.
- Nếu CheckBox chkHienThi được chọn thì TextBox txtMatkhau sẽ hiển thị
đúng
các ký tự người dùng đã gõ.
Sau khi nhập xong tên đăng nhập và mật khẩu. Người dùng nhấn Button “Đăng
nhập”:
- Nếu tên tài đăng nhập là “admin” và mật khẩu là “123456” thì xuất hiện
MessageBox với nội dung: “Đăng nhập thành công”.
- Nếu tên tài khoản và mật khẩu khơng phải là “admin” và “123456” thì xuất
hiện MessageBox với nội dung: “Không đăng nhập thành công”.
2. Thiết kế giao diện và cài đặt chương trình như sau
<i>Hình 12.9. Form tốn cơ bản 2 số</i>
u cầu:
- Nhập vào 2 số, kiểm tra dữ liệu phải nhập số vào 2 Textbox
- Khi chọn 1 lựa chọn ứng với từng lựa chọn Label hiển thị tương ứng là
“Tổng/Hiệu/Tích/Thương”.
<b>BÀI 13: SỬ DỤNG COMBOBOX, LISTBOX</b>
<b>Mã bài: 19.13</b>
<b>Giới thiệu:</b>
ComboBox và ListBox là hai điều khiển có nhiều điểm tương đồng, đều
sử dụng để chứa dữ liệu cho phép người dùng lựa chọn. Ứng với từng trường
hợp cụ thể người dùng có thể sử dụng các điều khiển phù hợp.
<b>Mục tiêu:</b>
- Trình bày và vận dụng ComboBox cho đồ án
- Trình bày và vận dụng ListBox 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.
<b>Nội dung chính:</b>
<b>13.1. ComboBox</b>
Mỗi lần chỉ có thể chọn một giá trị, có thể nhập mới dữ liệu vào. Điều khiển
<i>ComboBox được đặt trong nhóm Common Controls của cửa số Toolbox </i>
<i>Hình 13.1. Hiển thị điều khiển ComboBox</i>
<i>Bảng 13.1. Bảng mơ tả thuộc tính của ComboBox </i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Text </b> Trả về nội dung dòng dữ liệu đang hiển thị trên
ComboBox
<b>DropdownStyle </b> Quy định dạng của ComboBox, nhận một trong các giá
trị:
- Simple: hiển thị theo dạng ListBox + TextBox có thể
chọn dữ liệu từ ListBox hoặc nhập mới vào TextBox.
- DropDownList: chỉ cho phép chọn dữ liệu trong
ComboBox
<b>DropDownHeight </b> Thiết lập chiều cao tối đa khi sổ xuống của ComboBox
<b>DropDownWidth </b> Thiết lập độ rộng của mục chọn trong ComboBox
<b>FormatString </b>
Chuỗi định dạng. Tất cả các mục chọn trong
ComboBox sẽ
được định dạng theo chuỗi này. Việc định dạng này chỉ
thực hiện khi thuộc tính FormattingEnabled được thiết
lập
là True
<b>FormatingEnable </b>
Mang hai giá trị True và False. Nếu là True thì cho phép
các mục chọn trong ComboBox có thể định dạng lại.
Nếu
là False thì không thể định dạng.
<b>Items </b> Trả về các mục chứa trong ComboBox
<b>DataSource </b>
Chọn tập dữ liệu điền vào ComboBox. Tập dữ liệu có
thể
là mảng chuỗi, ArrayList, ..
<b>SelectedIndex </b> Lấy chỉ số mục được chọn, chỉ số mục chọn đầu tiên là
0
<b>SelectedItem </b> Trả về mục được chọn
<b>SelectedText </b> Lấy chuỗi hiển thị của mục chọn
<b>SelectedValue </b>
Trả về giá trị của mục chọn nếu ComboBox có liên kết
dữ
liệu. Nếu không liên kết dữ liệu hoặc thuộc tính
SelectedValue là giá trị chuỗi của thuộc tính
SelectedItem
<b>ValueMember </b>
Thuộc tính này chỉ định dữ liệu thành viên sẽ cung cấp
giá
Ví dụ: Xây dựng chương trình với giao diện như sau gồm ComboBox chứa danh
sách 4 màu (vàng, xanh, đỏ, đen) và một Label hiển thị dịng chữ “Hồng Sa,
<b>Trường Sa là của Việt Nam”. Yêu cầu khi chọn màu trong ComboBox thì màu</b>
của dòng chữ trên Label sẽ thay đổi tương ứng
<i>Hình 13.2. Form đổi màu chữ của Label</i>
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
Sự kiện Click của nút lệnh btnDoiMau:
<b>13.2. ListBox</b>
Tại mỗi thời điểm có thể chọn một hoặc nhiều dịng dữ liệu, không cho
nhập mới. Điều khiển ListBox được đặt trong nhóm Common Controls của cửa
số Toolbox
<i>Hình 13.3. Hiển thị điều khiển ListBox</i>
<i>Bảng 13.2. Bảng mô tả các thuộc tính của ListBox</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>SelectionMode </b>
Cho phép chọn một hoặc nhiều dòng dữ liệu trên ListBox,
bao gồm:
One: chỉ chọn một giá trị.
MultiSimple: cho phép chọn nhiều, chọn bằng cách click
vào mục chọn, bỏ chọn bằng cách click vào mục đã chọn.
MultiExtended: chọn nhiều bằng cách nhấn kết hợp với
Shift hoặc Ctrl
<i>MultiExtended. Thuộc tínhSelectedItemschứa các dịng dữ</i>
liệu được chọn.
<b>SelectedIndices </b>
Được sử dụng khi SelectionModelà MultiSimple hoặc
<i>MultiExtended. Thuộc tínhSelectedItemschứa các chỉ số</i>
của các dòng dữ liệu được chọn.
<b>FormatString </b>
Chuỗi định dạng. Tất cả các mục chọn trong ListBox sẽ
được định dạng theo chuỗi này. Việc định dạng này chỉ
thực hiện khi thuộc tính FormattingEnabled được thiết lập
là True
<b>FormatingEnabl</b>
<b>e </b>
Mang hai giá trị True và False. Nếu là True thì cho phép
các mục chọn trong ListBox có thể định dạng lại. Nếu là
False thì khơng thể định dạng.
<b>Items </b> Trả về các mục chứa trong ListBox
<b>DataSource </b> Chọn tập dữ liệu điền vào ListBox. Tập dữ liệu
có thể là mảng chuỗi, ArrayList, ..
<b>SelectedIndex </b> Lấy chỉ số mục được chọn, chỉ số mục chọn đầu
tiên là 0
<b>SelectedItem </b> Trả về mục được chọn
<b>SelectedValue </b>
Trả về giá trị của mục chọn nếu ListBox có liên
kết dữ liệu. Nếu không liên kết dữ liệu hoặc
thuộc tính ValueMember khơng được thiết lập
thì thì giá trị thuộc tính SelectedValue là giá trị
<i>Hình 13.4. Form hiển thị danh sách sinh viên được chọn</i>
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 cho nút btnThoat
Sự kiện Click của nút lệnh btnHienThi:
<b>Câu hỏi ôn tập và bài tập</b>
<i>Hình 13.5. Form Danh sách thực đơn, Thực đơn hằng ngày</i>
ListBox1: Hiển thị danh sách tất cả các món ăn
- Button “>”: chuyển một món được chọn từ ListBox1 qua ListBox2
- Button “>>”: chuyển tất cả các món từ ListBox1 qua ListBox2
- Button “<”: xóa món ăn được chọn trong ListBox2
- Button “<<”: xóa tất cả món ăn trong ListBox2
- Button “In thực đơn” sẽ hiển thị hộp thoại MessageBox với nội dung là các
món ăn đã chọn hiển thị trong ListBox2
- Button “Thốt” : đóng chương trình
<i>Hình 13.6. Xử lý danh sách xử lý danh sách số</i>
- Kiểm tra dữ liệu chỉ được nhập số. Gợi ý sử dụng sự kiện txt1_KeyPress()…
- Sau khi nhập số nhấn “Enter” hoặc nút “Cập nhật” số được thêm vào ListBox.
- Nút “Tổng các phần tử chẵn” thực hiện việc tính tổng các số chẵn trong danh
sách.
Gợi ý
- Nút “Đếm các số chẵn” thực hiện việc đếm các số chẵn trong danh sách.
- Chọn các số chẵn.
<i>Hình 13.7. Cài đặt nhiều lựa chọn cho Listbox</i>
- Nút “Chọn các số chẵn” thực hiện chọn các số chẳn trong danh sách.
Gợi ý: Sử dụng thuộc tính
- Nút “Thay bằng bình phương” thực hiện việc thay tồn bộ danh sách bằng bình
phương.
Gợi ý:
- Nút “Xóa các số lẻ” thực hiện xóa các số lẻ có trong danh sách
Gợi ý:
Gợi ý:
- Làm tương tự với nút “Xóa cuối danh sách”
- Nút “Xóa phần tử được chọn”. Lựa chọn các phần tử bất kỳ trong danh sách và
thực hiện xóa tất cả phần tử đã chọn đó. Gợi ý từ nút “Xóa các số lẻ”.
<b>BÀI 14: SỬ DỤNG DATETIMEPICKER, MONTHCALENDAR</b>
<b>Mã bài: 19.14</b>
<b>Giới thiệu:</b>
Để tạo ra các kiểu dữ liệu ngày, tháng, năm trong giao diện Windows
Form, Visual Studio hỗ trợ 2 điều khiển là DateTimePicker và MonthCanlender.
<b>Mục tiêu:</b>
- Trình bày và vận dụng DateTimePicker cho đồ án
- Trình bày và vận dụng MonthCalendar 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
<b>Nội dung chính:</b>
<b>14.1. DateTimePicker</b>
Điều khiển DateTimePicker cho phép người dùng chọn ngày tháng như một lịch
biểu nhưng biểu diễn ở dạng ComboBox , khi người
dùng nhấp chuột vào ComboBox sẽ sổ xuống lịch biểu. Các đối tượng ngày
tháng biểu diễn trong DateTimePicker thực chất là các đối tượng thuộc lớp
DateTime. Điều khiển DateTimePicker được đặt trong nhóm Common Controls
của cửa sổ Toolbox
<i>Bảng 14.1. Bảng mô tả các thuộc tính của DateTimePicker </i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Format </b> Định dạng kiểu hiển thị của ngày tháng.
Lưu ý: Thường sử dụng giá trị kiểu Short
<b>Value </b> Trả về giá trị hiện thời của điều khiển DateTimePicker
<b>Value.Date </b> Trả về ngày tháng năm
<b>Value.Day </b> Trả về ngày của tháng
<b>Value.Month </b> Trả về tháng
<b>Value.Year </b> Trả về năm
<b>Value.DateOfWeek</b> Trả về ngày của tuần (0 là chủ nhật, 1 là thứ 2, 2 là thứ 3,
… 6 là thứ 7)
<b>Value.DateOfYear </b> Trả về ngày thứ bao nhiêu của năm
<b>CustomFormat </b>
Cho phép tạo ra một định dạng khác về ngày tháng.
Lưu ý: Định dạng ngày tháng năm như kiểu Việt Nam
phải là dd/MM/yyy. Khi đó thuộc tính format phải thiết
lập là Custom.
<b>MaxDate </b> Thiết lập ngày lớn nhất cho phép người dùng chọn trên
điều khiển DateTimePicker
<b>MinDate </b> Thiết lập ngày nhỏ nhất cho phép người dùng chọn trên
điều khiển DateTimePicker
<b>Text </b> Trả về ngày hiển thị
<i>Bảng 14.2. Bảng mô tả các sự kiện của DateTimePicker </i>
<b>Sự kiện</b> <b>Mô tả</b>
<b>ValueChanged </b> Phát sinh khi người dùng chọn giá trị khác với
giá trị trước đó trên điều khiển DateTimePicker
<b>CloseUp </b> Phát sinh người dùng kết thúc việc chọn ngày
trên điều khiển DateTimePicker
<b>14.2. MonthCalendar</b>
<i>MonthCalendar là điều khiển hiển thị lịch dưới dạng một lịch biểu cho</i>
phép
người dùng chọn ngày tháng. Nhưng khác biệt là MonthCalendar cho phép
người
<i>Hình 14.2. Hiển thị điều khiển MonthCalendar</i>
<i>Bảng 14.3. Bảng mơ tả các thuộc tính của MonthCalendar</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>MaxDate </b> Thiết lập ngày lớn nhất cho phép người dùng chọn
trên điều khiển MonthCalendar
<b>MinDate </b> Thiết lập ngày nhỏ nhất cho phép người dùng chọn
trên điều khiển MonthCalendar
<b>SelectionRange </b> Trả về một dãy các ngày liên tục được chọn bởi
<b>SelectionStart </b> Trả về ngày đầu tiên trong dãy tại thuộc tính
<i>SelectionRange</i>
<b>SelectionEnd </b> Trả về ngày cuối cùng trong dãy tại thuộc tính
<i>SelectionRange</i>
<b>AnnuallyBoldedDate</b>
<b>s </b>
Chứa một mảng các ngày. Trong mỗi năm, các ngày
trong mảng sẽ được bôi đen MonthCalendar
<b>BoldedDates </b>
Chứa mảng các ngày. Các ngày này sẽ được bôi đen
trên điều khiển MonthCalendar tại những năm chỉ
định.
<b>MaxSeclectCount </b> Thiết lập số lượng ngày tối đa mà người dùng có thể
chọn
<b>MonthlyBoldedDates </b> Chứa mảng các ngày. Trong mỗi tháng, các ngày
trong mảng sẽ được bôi đen trên MonthCalendar
của dãy. Số lượng các ngày được chọn trong dãy phải nhỏ hơn giá trị thiết lập
trong thuộc tính MaxSeclectCount
<i>Bảng 14.4.Bảng mơ tả các sự kiện của MonthCalendar</i>
<b>Sự kiện</b> <b>Mô tả</b>
<b>DateChanged </b> Được phát sinh một ngày mới hoặc một dãy các ngày
mới được chọn
<b>Câu hỏi ôn tập và bài tập</b>
Viết chương trình minh họa việc hiển thị lịch, thiết kế giao diện form như
sau. Yêu cầu: khi nhấp nút hiển thị thì các ngày được chọn sẽ hiển thị trên
MessageBox
<b>BÀI 15: SỬ DỤNG LISTVIEW, TREEVIEW</b>
<b>Mã bài: 19.15</b>
<b>Giới thiệu:</b>
Điều khiển giúp hiển thị dữ liệu dưới dạng cây thư mục có thể thu hẹp và
mở rộng các đối tượng trong đó được Visual Studio phát triển là ListView và
TreeView.
<b>Mục tiêu:</b>
- Hiểu và vận dụng ListView cho đồ án
- Hiểu và vận dụng TreeView 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.
<b>Nội dung chính:</b>
<b>15.1. ListView</b>
ListView là điều khiển cho phép hiển thị danh sách các đối tượng. Mỗi
đối tượng hiển thị trong ListView được gọi là Item. Item là đối tượng được tạo
từ lớp
ListViewItem. Mỗi Item có thuộc tính Text là chuỗi ký tự hiển thị ở cột đầu tiên
trong ListView, mỗi Item có các SubItem hiển thị ở các cột tiếp theo trong
ListView. Điều khiển ListView đặt trong Common Controls của cửa sổ
Toolbox:
Có thể thêm ListViewItem vào ListView bằng cách chọn thuộc tính Items trong
cửa Properties của ListView như sau:
<i>Hình 15.2. Màn hình các đối tượng được thêm vào trong ListView</i>
Sau khi chọn thuộc tính Items trong cửa sổ Properties, cửa sổ ListViewItem
Collection Editor sẽ hiển như bên dưới. Có thể thêm hoặc xóa
ListViewItem trong ListView bằng cách nhấn nút Add hoặc Remove.
<i>Hình 15.3. Màn hình để thêm các đối tượng con vào trong ListView</i>
<i>Bảng 15.1. Bảng mơ tả các thuộc tính của ListView </i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>View </b>
Thuộc tính View qui định cách hiển thị các Item
trong
<i>ListView. Thuộc tính View có 5 giá trị:</i>
- Detail: Một Icon (Icon lấy từ ImageList) và Text
được
hiển thị ở cột đầu tiên. Tiếp theo là các SubItem
được
hiển thị ở các cột tiếp theo.Tuy nhiên để hiển thị
Item
dạng Detail thì tạo thêm Column Header cho
<i>ListView</i>
<b>Items </b>
Trả về các Item chứa trong ListView. Một số
phương thức
và thuộc tính thường dùng của ListView.Items:
- Count: Đếm số lượng Item trong ListView
- Insert( i, <Item mới> ): Chèn thêm Item < Item
mới> vào vị trí i trong ListView
- Add(<Item mới>): thêm Item <Item mới> vào
cuối ListView
- Remove(<Item cần xóa>): Xóa Item <Item cần
xóa> khỏi ListView
- RemoveAt(i): Xóa Item có chỉ số i khỏi ListView
- Contains(<Item cần tìm>): Trả về True nếu tìm
thấy <Item cần tìm> trong <b>ListView</b>, trả về <b>False</b>
nếu khơng có trong <b>ListView</b>
- <b>IndexOf(<Item cần tìm>): </b>Nếu <Item cần tìm> có
trong <b>ListView </b>thì trả về chỉ số của Item tìm thấy
trong
<b>ListView</b>, nếu khơng tìm thấy sẽ trả về -1
<b>MultiSelect </b>
True/ False: Cho phép hoặc không cho phép chọn
một lúc
nhiều Item trong <b>ListView</b>
<b>FullRowSelect </b>
Khi chọn dòng dữ liệu highlighted cả dịng hay chỉ ơ
được
<b>GridLines </b>
Nếu thiết lập True sẽ hiển thị các dòng và cột dạng
lưới,
thiết lập False không hiển thị dạng lưới
<b>SelectedItems </b> Trả về tập các Items được chọn trong <b>ListView</b>
<b>LargeImageIcon </b> Gán đối tượng <b>ImageList </b>cho <b>ListView</b>
<b>FocusedItem.Index </b> Trả về chỉ số dòng được chọn trong <b>ListView</b>
<b>SelectedIndices.Coun</b>
<b>t </b> Trả về số lượng Item được chọn trong <b>ListView</b>
<b>SelectedIndices </b>
Trả về danh sách chỉ mục các Item được chọn.
myListView.SeletedIndices[0]: trả về chỉ mục của
Item
đầu tiên được chọn trong danh sach các Item được
chọn
trong <b>ListView</b>
<i>Bảng 15.2. Bảng mô tả các sự kiện của ListView </i>
<b>Sự kiện</b> <b>Mô tả</b>
<b>SelectedIndexChange</b>
<b>d </b>
Sự kiện phát sinh khi có sự thay đổi về chỉ mục
được chọn của Item trên ListView
<b>ItemSelectionChanged</b> Sự kiện phát sinh khi có sự thay đổi lựa chọn một
<i>Item trên ListView</i>
<b>ItemCheck </b> Xảy ra khi trạng thái chọn của Item thay đổi
<b>ColumnClick </b> Sự kiện phát sinh khi một column trong ListView
được click
<b>MouseClick </b>
Sự kiện phát sinh khi nhấp chuột chọn một Item
trong
Ví dụ: Thiết kế giao diện form như sau:
<i>Hình 15.4. Form Thêm lớp học vào ListView</i>
Yêu cầu: Khi người dùng nhập xong tên lớp và số lượng sinh viên, sau đó nhấn
nút “Thêm” thì trong ListView sẽ chèn một dịng vào cuối với tên lớp và số
lượng vừa nhập.
Thực hiện chương trình
Sự kiện Click của nút btnThem
<b>15.2. TreeView</b>
TreeView là điều khiển dùng để hiển thị danh sách các đối tượng dưới
dạng phân cấp như hình 15.5.
<i>Hình 15.5. Cấu trúc TreeView</i>
Đối tượng trong TreeView thường được gọi là node và cấu trúc phân cấp
của TreeView được biểu diễn bởi lớp TreeNode. Mỗi một node trong TreeView
có thể chứa các node khác. Node chứa một node khác gọi là node cha
(RootNode) và node được chứa gọi là node con (ChildNode). Việc sử dụng điều
khiển TreeView để hiển thị rất hữu ich, vì trình bày theo dạng phân cấp giúp
việc hiển thị được rõ ràng và có hệ thống hơn. Điều khiển TreeView đặt trong
nhóm Common Controls của cửa sổ Toolbox
<i>Bảng 15.3. Bảng mơ tả các thuộc tính của TreeView</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Node </b> Trả về một đối tượng thuộc lớp TreeNode
<b>SelectedNode </b> Trả về node đang được chọn trong TreeView
<b>ShowPlusMinus </b> Hiển thị dấu + và – trước mổi TreeNode
<b>ShowRootLines </b> Hiển thị đường thằng nối giữa các Root Node trong
một TreeView
<b>ImageList </b>
Hiển thị hình trước mỗi node trong TreeView.
Lưu ý: Phải sử dụng thêm điều khiển ImageList, và
<b>ImageIndex </b>
Giá trị của thuộc tính ImageIndex là chỉ số của hình
trong điều khiển ImageList. Khi gán chỉ số cho thuộc
tính ImageIndex thì hình hiển thị trước mỗi node sẽ là
hình có chỉ số tương ứng.
Lưu ý: Phải sử dụng thuộc tính ImageList trước
<b>SelectedImageInde</b>
<b>x </b>
Giá trị của thuộc tính SelectImageIndex là chỉ số của
hình trong điều khiển ImageList. Khi người dùng chọn
node nào thì node đó sẽ có hình tương ứng như thuộc
tính
SelectedImageIndex chỉ định
<i>Bảng 15.4. Bảng mô tả các sự kiện của TreeView</i>
<b>Sự kiện</b> <b>Mô tả</b>
<b>AfterCollapse </b> Phát sinh khi thu gọn một TreeNode
<b>AfterExpand </b> Phát sinh khi hiển thị các node trong TreeNode
<b>AfterSelect </b> Phát sinh khi chọn một TreeNode
<b>NodeMouseClic</b>
<b>k </b> Phát sinh khi chọn một node
TreeView là điều khiểu để hiển thị các node, tuy nhiên việc hiển thị này thực
chất là do TreeNode tạo ra. Do đó để làm việc với các node cần sử dụng các
thuộc tính và phương thức của lớp TreeNode
<i>Bảng 15.5. Bảng mơ tả các thuộc tính của TreeNode</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Nodes </b> Trả về tập các node
<b>Text </b> Đọc/ gán chuỗi ký tự người dùng sẽ nhìn thấy ở mỗi
node
<b>LastNode </b> Trả về node cuối cùng
<b>NextNode </b> Chuyển đến node tiếp theo
<b>PrevNode </b> Lùi lại node trước đó
<b>Parent </b> Trả về node cha của node hiện tại
<b>Index </b> Trả về chỉ số của node
<i>Bảng 15.6. Bảng mô tả các phương thức của TreeNode</i>
<b>Phương thức</b> <b>Mô tả</b>
<i>Nodes.Add </i> Thêm một node
<i>Nodes.Remove </i> Xóa một node
<i>Nodes.Insert </i> Chèn vào một node (chèn trước, chèn sau một
node)
<i>Nodes.Clear </i> Xóa tất cả các node con và node hiện tại
Ví dụ: Viết chương trình minh họa việc thêm sửa xóa các node trong một
TreeView. Giao diện thiết kế như sau:
<i>Hình 15.7. Form để tạo một TreeView</i>
Thực hiện chương trình:
Bước 1: Tạo Form đặt tiêu đề Form phù hợp
Bước 2: Đưa vào form các điều khiển
Sự kiện Click của nút btnThemCon:
Sự kiện Click của nút btnXoaTaCa:
Sự kiện Click của nút btnXoaChon:
Sự kiện Click của nút btnMoRong:
Sự kiện Click của nút btnThuHep:
<b>Câu hỏi ôn tập và bài tập</b>
1. Thiết kế Form có giao diện như mẫu sau:
<i>Hình 15.8. Form sử dụng ListView</i>
Yêu cầu:
Dùng ListView và các hình ảnh phù hợp để thiết kế Form
2. Thiết kế Form có giao diện như mẫu sau:
<i>Hình 15.9. Form sử dụng ListView có CheckBox</i>
Yêu cầu:
3. Thiết kế Form có giao diện như mẫu sau:
<i>Hình 15.10. Form sử dụng ListView kết hợp TreeView</i>
Yêu cầu:
- Dùng ListView, TreeView và các hình ảnh phù hợp để thiết kế Form
- Phương thức thanh tốn gồm: Trả góp, Khốn gọn và Bảo hiểm.
- Người dùng nhấn chọn xe cần mua trên ListView, hai điều khiển
NumericUpdown là Số lượng: và Thông tin mua hàng: được kích hoạt cho
người dùng nhập số lượng và thơng tin mua hàng.
- Khi đã đặt hàng xong, người dùng nhấn vào button Lưu để lưu lại thông tin
mua hàng. Thông tin mua hàng được hiển thị trên MessageBox.
<b>BÀI 16: SỬ DỤNG PICTUREBOX, TOOLTIP</b>
<b>Mã bài: 19.16</b>
<b>Giới thiệu:</b>
Việc đưa dữ liệu bằng hình ảnh lên Form được Visual Studio hỗ trợ với
công cụ là PictureBox. Điều khiển ToolTip giúp chúng ta hiển thị mở rộng được
các giải thích, hướng dẫn bên dưới các điều khiển khác.
<b>Mục tiêu:</b>
- Trình bày và vận dụng PictureBox cho đồ án
- Trình bày và vận dụng ToolTip 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
<b>Nội dung chính:</b>
<b>16.1. PictureBox</b>
Cũng là một Control thường được sử dụng trọng C#, PictureBox dùng để
hiển thị các hình ảnh dưới định dạng Bitmap, GIF, icon, hoặc định dạng JPEG.
Khi lập trình phần mềm cần phải sử dụng tới hình ảnh thì chúng ta khơng thể bỏ
qua Control này.
<i>Hình 16.1. Hiển thị điều khiển PictureBox</i>
Đối với PictureBox Control có thể thiết lập các thuộc tính của ảnh khi
thiết kế Form hoặc khi chạy chương trình. Cũng có thể thay đổi hình ảnh
trong PictureBox khi sử dụng một PictureBox để hiển thị các thông tin khác
nhau. Để tải ảnh lên PictureBox ta thực hiện như sau:
pictureBox1.Image = Image.FromFile("c:\testImage.jpg");
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
Có tất cả các kiểu hiển thị ảnh trên PictureBox:
<i>Bảng 16.1. Bảng các kiểu hiển thị ảnh trên PictureBox</i>
<b>AutoSize </b> <b>Tự động điều chỉnh kích cỡ ảnh.</b>
CenterImage Căn giữa ảnh.
Normal Đặt góc trái phía trên của ảnh vào vị trí góc trái phía trên của
PictureBox
StretchImag
e
Giãn nở kích thước theo PictureBox
Ví dụ: Cách sử dụng PictureBox trên Winform.
<b>16.2. ToolTip</b>
Điều khiển Tooltip là điều khiển cho phép hiển thị các thơng tin chú thích
khi người dùng đưa chuột qua các điều khiển có thiết lập Tooltip. Điều khiển
<i>Tooltip được đặt trong nhóm Commont Controls của cửa sổ Toolbox </i>
<i>Bảng 16.2. Bảng mơ tả các thuộc tính của Tooltip</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Active </b>
Mang giá trị True hoặc False, nếu thiết lập True thì
Tooltip có hiệu lực hiển thị thơng báo, nếu mang giá trị
False thì Tooltip khơng hiển thị được thơng báo.
<b>AutomaticDelay </b> Thiết lập thời gian xuất hiện Tooltip khi vừa đưa chuột
đến điều khiển, thời gian tính bằng mili giây
<b>AutoPopDelay </b>
Thời gian hiển thị Tooltip cho đến khi kết thúc khi
người dùng đã đưa chuột đến điều khiển, thời gian tính
bằng mili giây
<b>IsBalloon </b> Quy định kiểu hiển thị của Tooltip. Nếu thiết lập False
kiểu hiển thị Tooltip:
<b>ReshowDelay </b> Thời gian mà Tooltip tắt từ khi người dùng đưa chuột ra
khỏi điều khiển, thời gian tính bằng mili giây
<b>ShowAlways</b> Ln hiển thị trên màn hìn
<b>ToolTipIcon </b> Biểu tượng xuất hiện bên cạnh chuỗi khai báo trong
thuộc tính TooltipTitle
<b>ToolTipTitle </b> Chuỗi hiện thị bên cạnh biểu tượng TooltipIcon
<b>UseAnimation </b> Thiết lập hiệu ứng ảnh động được biểu diễn khi Tooltip
được hiển thị
<b>UseFading </b> Thiết lập hiệu ứng mờ dần được biểu diễn khi Tooltip
hiển thị
<i>Bảng 16.3. Bảng mô tả các phương thức của Tooltip</i>
<b>Phương thức</b> <b>Mô tả</b>
<b>SetTooltip() </b> Thiết lập chuỗi hiển thị của Tooltip trên điều khiển
<b>GetTooltip() </b> Lấy nội dung chuỗi hiển thị trên Tooltip
<b>Clear() </b> Loại bỏ tất cả TooltipText cho các điều khiển trên form
Ví dụ: Viết chương trình tạo giao diện form đăng nhập và thực hiện yêu cầu
chức
<i>Hình 16.3. Form màn hình đăng nhập có chưa ToolTip</i>
u cầu:
- Khi rê chuột vào TextBox1: hiển thị dòng ghi chú “Nhập chuỗi ký không dấu,
không khoảng trắng”
- Khi rê chuột vào TextBox2: hiển thị dịng ghi chú “Nhập ít nhất 6 ký tự, nhiều
nhất 10 ký tự”
- Khi nhấn nút “Đăng nhập”: hiển thị MessageBox với nội dung “Bạn đã đăng
nhập thành cơng”
- Khi nhấn nút “Thốt”: thốt khỏi 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
Sự kiện Click của nút btnDangNhap:
<b>Câu hỏi ôn tập và bài tập</b>
1. Thiết kế Form có giao diện sau:
2. Thiết kế Form có giao diện sau:
<i>Hình 16.5. Màn hình hiển thị Tooltip</i>
Yêu cầu:
<b>BÀI 17: SỬ DỤNG CHECKLISTBOX, NUMERICUPDOWN</b>
<b>Mã bài: 19.17</b>
<b>Giới thiệu:</b>
Việc kiểm tra dữ liệu số khi nhập vào Textbox sẽ được Visual Studio hỗ
trợ bằng điều khiển khác NumericUpDown. Để tạo được một danh sách liên tiếp
các CheckBox trong quá trình hoạt động được dễ dàng hơn.
<b>Mục tiêu:</b>
- Trình bày và vận dụng CheckListBox cho đồ án
<b>17.1. CheckListBox</b>
Điều khiển CheckedListBox cung cấp tất cả khả năng của hộp danh sách
và cũng cho phép hiển thị dấu kiểm bên cạnh các mục trong hộp danh sách.
<i>Hình 17.1. Hiển thị điều khiển của CheckListBox</i>
public int Add (object item, bool isChecked);
Có thể thêm các mục riêng lẻ vào danh sách bằng phương thức Thêm. Đối tượng
CheckedListBox hỗ trợ ba trạng thái thông qua bảng liệt kê CheckState:
Checked, Indeterminate và Unchecked.
checkedListBox1.Items.Add("Sunday", CheckState.Checked);
checkedListBox1.Items.Add("Monday", CheckState.Unchecked);
checkedListBox1.Items.Add("Tuesday",
CheckState.Indeterminate);
<i>Hình 17.3. Kết quả của việc thêm vào 3 đối tượng vào CheckListBox</i>
Hay cũng có thể thêm bằng các phương thức khác như sau
string[] days = new[] { "Sunday", "Monday", "Tuesday" };
checkedListBox1.Items.AddRange(days);
Thêm từng đối tượng trong danh sách ChekedListBox và gán giá trị mặc định là
<b>17.2. NumericUpDown</b>
Điều khiển NumericUpDown là một cách đơn giản để cho người
sử dụng lựa
chọn một giá trị mà nó rơi giữa một số nhỏ nhất và một số lớn
nhất.
<i>Hình 17.4. Hiển thị điều khiển của NumericUpDown</i>
Điều khiển có thể chỉ chấp nhận những số nguyên, và những giá
trị thập phân sẽ được làm tròn.
Điều khiển NumericUpDown được kiểm sốt bởi bốn thuộc tính
số ngun
Minimum, Maximum, Value, và Increment.
Những thuộc tính Minimum và Maximum xác định giá trị nhỏ nhất và giá trị
lớn nhất của điều khiển.
- Thuộc tính Value là giá trị hiện tại của điều khiển.
Ngoài ra, người sử dụng cũng có thể thay đổi thuộc tính Value bằng cách gõ vào
một giá trị mới trong điều khiển. Nếu giá trị mà người sử dụng nhập vào nằm
giữa các
giá trị Minimum và Maximum, thì cả hai thuộc tính Value và Text sẽ được thay
đổi để giá trị mới được nhập vào. Nếu giá trị mới vượt ra ngoài tập giới hạn, thì
thuộc tính Text nhận giá trị được nhập vào, trong khi thuộc tính Value sẽ nhận
giá trị của thuộc tính Maximum. Để những người sử dụng nhập đúng dữ liệu
vào trong điều khiển, thì ta thiết đặt thuộc tính ReadOnly là true.
Khi một người sử dụng thay đổi giá trị của điều khiển NumericUpDown , một
sự
kiện ValueChanged được thực hiện. Sự kiện ValueChanged chỉ được thực hiện
khi giá trị được thay đổi thông qua mã hay qua những mũi tên lên và xuống. Sự
kiện đó sẽ khơng được thực hiện khi một người sử dụng nhập vào trong điều
khiển. Đoạn code sau trình bày việc sử dụng điều khiển NumericUpDown như
thế nào để xử lý sự kiện ValueChanged.
Ví dụ bên dưới tạo và sử dụng NumericUpDown có vùng giá trị nhỏ nhất là 1
và lớn nhất là 32 .
Bước 1: Tạo Form có thuộc tính Text = “Dental Payment Application”.
Bước 2: Kéo tất cả các điều khiển vào Form
Bước 3: Áp dụng các thuộc tính và điều khiển để thực hiện yêu cầu. Trong đó
chú ý hộp thoại sau để chọn chữ gạch dưới
<i>Hình 17.6. Màn hình để cài đặt Tối đa – Tối thiểu của NumericUpDown</i>
<b>Câu hỏi ôn tập và bài tập</b>
Thiết kế chương trình giống màn hình sau:
Yêu cầu
a. Thiết kế giao diện chương trình đặt đúng tên các đối tượng
b. Khi khách hàng vào chọn 1 trong các loại cafe. Cột “số lượng” mặc định là 1
và màu của ô “Đơn giá” đổi thành màu vàng
<b>BÀI 18: SỬ DỤNG PANEL, SPLITCONTAINER, TABCONTROL</b>
<b>Mã bài: 19.18</b>
<b>Giới thiệu:</b>
Ngồi chức năng gom nhóm các điều khiển khác thành các nhóm chức
năng bằng GroupBox như bài học trước. Visual Studio cịn có các điều khiển
khác như Panel, SplitContainer, TabControl để gom nhóm các điều khiển khác.
<b>Mục tiêu:</b>
- Trình bày và vận dụng Panel cho đồ án
- Trình bày và vận dụng SplitContainer cho đồ án
- Trình bày và vận dụng TabControl 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.
<b>Nội dung chính:</b>
<b>18.1. Panel</b>
Cũng như GroupBox, Panel là một điều khiển dùng để chứa các điều khiển
khác.
Panel có các thuộc tính AutoSize, AutoSizeMode như GroupBox và thuộc tính
đường viền BorderStyle như Label.
Điểm khác biệt của Panel với GroupBox là điều khiển Panel khơng có tiêu đề
mơ
tả (khơng có thuộc tính Text) và có thanh trượt ScrollBar ngang và ScollBar dọc
(có thuộc tính AutoScroll).
Điều khiển Panel đặt trong nhóm Containers của cửa sổ Toolbox
<i>Bảng 18.1. Bảng mô tả các thuộc tính của Panel </i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>AutoScroll </b>
Mang giá trị True hoặc False.
- Nếu là True: Panel tự động xuất hiện thanh trượt khi
kích thước Panel không thể hiển thị hết các điều khiển
chứa bên
trong
- Nếu là False: Panel sẽ không hiển thị thanh trượt
<b>BorderStyle</b>
Kiểu đường viền của Panel khi hiển thị. Có 3 giá trị:
None, FixedSingle và Fixed3D
- None: Không hiển thị đường viền
- FixedSingle:Quanh Panel sẽ hiển thị một đường viền
đơn.
- Fixed3D: Hiển thị đường viền của Panel dạng 3 chiều.
<b>18.2. SplitContainer</b>
Điều khiển SplitContainer giúp phân chia form thành hai phần. Cụ thể
hơn
<i>SplitContainer được cấu tạo bởi hai điều khiển Panel, mỗi Panel trong điều</i>
khiển
<i>Hình 18.2. Hiển thị điều khiển SplitContainer</i>
Các Panel đều hỗ trợ thanh trượt (ScrollBar) khi thuộc tính AutoScroll được
thiết
lập là True.
Tuy nhiên Panel trong SplitContainer không có thuộc tính BorderStyle để thiết
lập đường viền, vì là điều khiển chứa trong SplitContainer, do đó thuộc tính
<i>BorderStyle được đặt ở điều khiển SplitContainer. Các giá trị của thuộc tính</i>
<i>BorderStyle của SplitContainer cũng gồm 3 giá trị như Panel: None, Fixed3D,</i>
<i>FixedSingle.</i>
Vạch phân cách Splitter có thể phân cách theo chiều dọc hoặc chiều ngang tùy
thuộc vào thuộc tính Orientation. Thuộc tính Orientation mang hai giá trị để
thiết lập SplitContair là: Vertical và Horizontal như sau:
<i>Hình 18.3. Các kiểu hiển thị của điều khiển SplitContainer</i>
Nếu không muốn cho người dùng dịch chuyển vạch phân cách Splitter để thay
đổi kích thước của hai Panel, lập trình viên có thể thiết lập thuộc tính
<i>IsSplitterFixed của SplitContainer là True. Ngồi ra một điểm đặc biệt là có thể</i>
chỉ định khơng cho phép thay đổi kích thước của Panel1 hoặc Panel2 bằng cách
kết hợp thuộc tính FixedPanel và thuộc tính IsSplitterFixed như bảng sau:
<i>Bảng 18.2. Bảng mơ tả thuộc tính IsSplitterFixed và FixedPanel</i>
<b>Thuộc tính</b> <b>Tác dụng</b>
<b>IsSplitterFixed</b> <b> =</b>
<b>False </b>
Thuộc tính FixedPanel khơng có hiệu lực. Người
dùng có thể thay đổi kích thước của Panel1 và cả
Panel2
<b>IsSplitterFixed</b> <b> =</b>
<b>True </b>
Thiết lập thuộc tính FixedPanel:
vạch phân cách Splitter để thay đổi kích thước của cả
- FixedPanel = Panel2: Người dùng khơng thể thay
đổi kích thước Panel2 (Khi thay đổi kích thước form
thì kích thước Panel1 thay đổi, kích thước Panel2 là
không đổi).
Một trong hai Panel của SplitContainer có thể ẩn đi bằng cách thiết lập thuộc
tính Panel1Collapsed và Panel2Collapsed là True. Việc ẩn hai Panel chỉ có có
tác
dụng với một Panel. Nghĩa là chỉ có thể thiết lập một trong hai thuộc tính
<i>Panel1Collapsed và Panel2Collapsed là True. Khi Panel1Collapsed là True thì</i>
<i>Panel2Collapsed là False và ngược lại. </i>
<i>Bảng 18.3. Bảng mơ tả các thuộc tính của SplitContainer</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>BorderStyle </b> Thiêt lập đường viên cho SplitContainer. Gồm 3 giá trị:
<i>None, FixedSingle, Fixed3D.</i>
<b>FixedPanel </b> Cố định kích thước của các Panel trong SplitContainer.
<b>IsSplitterFixed </b> Mang hai giá trị True và False. Nếu là True, cố định vạch
phân cách Splitter
<b>Orientation </b> Xác định vạch phân cách Splitter sẽ phân cách theo chiều
ngang hay dọc. Gồm 2 giá trị: Vertical, Horizontal.
<b>Panel1Collapse</b>
<b>d </b> Mang hai giá trị True hoặc False. Nếu là True sẽ ẩn Panel1
<b>Panel1MinSize </b> Lấy kích thước nhỏ nhất hoặc thiết lập kích thước nhỏ nhất
cho Panel1
<b>Panel2Collapse</b>
<b>d </b> Mang hai giá trị True hoặc False. Nếu là True sẽ ẩn Panel2
<b>Panel2MinSize </b> Lấy kích thước nhỏ nhất hoặc thiết lập kích thước nhỏ nhất
<b>SplitterDistance</b>
Trả về khoảng cách bằng pixel từ Splitter đến cạnh bên
trái (nếu hai Panel nằm dọc) hay đến cạnh trên (nếu hai
Panel nằm ngang)
<b>SplitterWidth </b> thiết lập độ rộng của vạch phân cách Splitter
Ví dụ: Viết chương trình có giao diện như hình bên dưới. Gồm: 1 điều khiển
SplitContainer với Panel1 chứa 1 điều khiển ListView và Panel2 chứa 1 điều
khiển WebBrowser.
Yêu cầu: Người dùng nhập đường dẫn website vào TextBox và nhấn nút thêm.
Đường dẫn website vừa nhập sẽ được đưa vào ListView. Người dùng có thể
hiển thị bất cứ website nào trên WebBrowser bằng cách nhấp chuột vào đường
dẫn chứa trong ListView.
<i>Hình 18.4. Form dùng các điều khiển và kết hợp Panel để phân bổ, gom nhóm</i>
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 cho nút btnThoat
Sự kiện Click của nút btnThem:
Sự kiện Click của nút btnCapNhat:
Sự kiện Click của nút btnXoa:
Sự kiện MouseClick của listLinkWebsite:
<b>3. TabControl</b>
TabControl là điều khiển dạng Containers, do đó có thể chứa các diều
khiển
khác. Điểm đặc biệt của TabControl là cho phép thể hiện nhiều page trên một
form duy nhất. Mỗi page có thể chứa nhiều điều khiển khác bên trong. Điều
<i>Hình 18.5. Hiển thị điều khiển TabControl</i>
TabPage:
Thuộc tính quan trọng nhất của TabControl là TabPage. Một TabControl có thể
có nhiều TabPage . Người dùng có thể nhấp vào các tab để chuyển đổi
qua lại giữa các TabPage với nhau
<i>Hình 18.7. Hiển thị giao diện của TabControl</i>
<i>Hình 18.8. Màn hình để thêm được các TabPage</i>
Điều khiển TabPage có nhiều điểm giống với điều khiển Panel. TabPage cũng
hỗ trợ thanh trượt khi cần nếu như thuộc tính AutoScroll được thiết lập là True,
có thuộc tính BorderStyle để thiết lập đường viền quanh TabPage với 3 giá trị:
<i>None, FixedSingle, Fixed3D. Tuy nhiên có điềm khác biệt với Panel là TabPage</i>
hỗ trợ thuộc tính Text, chuỗi mơ tả được thiết lập trong thuộc tính Text sẽ hiển
thị trên tab của TabPage:
<i>Hình 18.9. Màn hình hiển thị các TabPage trên giao diện</i>
<i>Bảng 18.4. Bảng mơ tả các thuộc tính của TabControl</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>Appearance </b> Thuộc tính chỉ định TabPage sẽ hiển thị ở hình dạng nào.
Có 3 giá trị: Normal, Button FlatButtons.
<b>Alignment </b>
Thuộc tính xác định các tab sẽ hiển thị ở trên, dưới, trái hay
phải của TabControl. Gồm các giá trị:
<b>Multiline </b> Mang hai giá trị True hoặc False.
tab nếu số lượng các tab vượt ngồi phạm vi kích thước của
TabControl.
Nếu là False: Chỉ cho phép tab hiển thị trên một dòng
<b>TabPages </b> Chứa tập các các TabPage có trong TabControl
<b>TabCount </b> Trả về số lượng TabPage mà TabControl có
<b>SelectedTab </b> Trả về điều khiển TabPage được chọn
<b>SelectedIndex </b> Trả về vị trí của TabPage được chọn
Ví dụ: Viết chương trình quản lý nhân sự như hình 18.9 và 18.10. Chương trình
gồm 2 TagPage: TagPage Quản lý nhân viên và TagPage Quản lý giáo viên.
<i>TagPage quản lý nhân viên: Cho phép thêm, sửa và xóa nhân viên. Thơng tinh</i>
nhân viên cần quản lý bao gồm: Họ tên nhân viên, chức vụ của nhân viên, hệ
sốlương và lương cơ bản.
<i>TagPage Quản lý giáo viên: Cho phép thêm sửa xóa giáo viên. Thông tin giáo</i>
viên cần quản lý gồm: Họ tên giáo viên, chức vụ của giáo viên, tiền giảng một
tiết, số tiết dạy và học vị của giáo viên.
<i>Hình 18.11. Màn hình Tab Quản lý nhân viên</i>
Sự kiện Click của btnCapNhatNV:
Sự kiện Click của btnXoaNV:
Sự kiện SelectedIndexChanged của listNhanVien:
<b>Câu hỏi ôn tập và bài tập</b>
<i>Hình 18.12. Form tự động phát sinh các nút</i>
Yêu cầu:
- Khi nhấn F5 chạy chương trình xuất hiện giao diện như yêu cầu.
- Người dùng nhập tổng số Button cần phát sinh trong TextBox txtTongNut;
nhập
<i>Hình 18.13. Màn hình kết quả khi nhập dữ liệu</i>
Khi người dùng nhấn vào một nút nhấn xuất thông báo “Bạn vừa nhấn nút: _” .
Riêng nút số 10 khi người dùng nhấn sẽ xuất thông báo “Chúc mừng
bạn đã trúng 01 tỉ USD”
<b>BÀI 19: TẠO KẾT NỐI, ĐÓNG KẾT NỐI CƠ SỞ DỮ LIỆU</b>
<b>Mã bài: 19.19</b>
<b>Giới thiệu:</b>
Việc kết nối được cơ sở dữ liệu trong lập trình rất quan trọng, nó giúp cho
q trình thao tác giữa giao diện lập trình và phần cơ sở dữ liệu được thực hiện
một cách tối ưu hơn.
<b>Mục tiêu:</b>
- Trình bày được cách thức kết nối cơ sở dữ liệu
- Sử dụng các kiểu dữ liệu để mở kết nối và đóng kết nối cơ sở dữ liệu.
- Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm
<b>Nội dung chính:</b>
<b>19.1. Các kiểu dữ liệu kết nối</b>
ADO.NET là gì ? Là mơ hình cho phép người lập trình thao tác với nhiều loại
cơ sở dữ liệu theo cùng một cách CSDL có thể là SQL Server, MS Access,
Oracle, …
<b>ADO.NET là gì ?</b>
Là mơ hình cho phép người lập trình thao tác với nhiều loại cơ sở dữ liệu
theo cùng một cách
CSDL có thể là SQL Server, MS Access, Oracle, …
Ứng với mỗi loại CSDL sẽ là các .NET Framework Data Provider thích
hợp
<i>Hình 19.1. Các mơ hình kết nối cơ sở dữ liệu</i>
<b>.NET Framework Data Provider for Microsoft SQL Server</b>
Tối ưu khi kết nối với SQL Server (từ phiên bản 7.0)
Kết nối trực tiếp không thông qua ODBC hoặc OLE DB
<b>.NET Framework Data Provider for OLE DB</b>
Sử dụng native OLE DB
SQLOLEDB provider
MSDAORA provider
Microsoft.Jet.OLEDB.4.0 provider
Các lớp cung cấp thuộc System.Data.OleDb
<b>.NET Framework Data Provider for ODBC</b>
Sử dụng native ODBC Driver Manager
SQL Server driver
Microsoft ODBC for Oracle driver
Microsoft Access driver
Các lớp cung cấp thuộc System.Data.Odbc
<b>.NET Framework Data Provider for Oracle</b>
SQL Server driver
Microsoft ODBC for Oracle driver
Microsoft Access driver
Các lớp cung cấp thuộc System.Data.OracleClient
<b>Các lớp Data Provider</b>
IDbConnection Interface
o Dùng để tạo một kết nối (connection) đến CSDL Được cài đặt cho
các lớp của các Data Provider
o Ví dụ: với Data Provider for SQL Server thì sử dụng lớp
SqlConnection
IDbCommand Interface
o Dùng để thực hiện câu lệnh, có thể truyền tham số, có thể nhận kết
quả trả về Được cài đặt cho các lớp của các Data Provider
o Ví dụ: với Data Provider for SQL Server thì sử dụng lớp
SqlCommand
IDataReader Interface
o Dùng để đọc dữ liệu theo cách forward-only và read-only
IDataAdapter Interface
o Dùng để đọc dữ liệu từ CSDL và lưu trong DataSet
o DataSet là một CSDL thu nhỏ được đặt trong bộ nhớ của máy client
o Người dùng có thể thao tác trên DataSet và ghi lại các thay đổi trở
lại CSDL
o Dữ liệu đọc và lưu trong DataSet cũng có thể là dữ liệu XML
<b>Quy trình kết nối đến CSDL</b>
Tạo đối tượng Connection và xác định chuỗi kết nối (Connection String)
Tạo đối tượng Command và xác định câu lệnh SQL
Mở đối tượng Connection (Open)
Thực hiện câu lệnh SQL và xử lý kết quả (Execute)
Đóng đối tượng Connection (Close)
Thông tin chuỗi kết nối
Tên Server
Tên Database
Kiểu đăng nhập (Windows hoặc SQL Server)
Tên user
Mật khẩu
<b>19.2. Tạo kết nối dữ liệu </b>
<i>Hình 19.3. Lựa chọn kết nối cơ sở dữ liệu</i>
<i>Hình 19.6. Kiểm tra kết nối</i>
<i>Hình 19.8. Màn hình lựa chọn các đối tượng trong cơ sở dữ liệu</i>
Kết nối bằng lệnh
<b>19.3. Đóng kết nối cơ sở dữ liệu</b>
- Thuộc tính của SqlConnection để đóng kết nối đến CSDL là .Open().
- Việc đóng kết nối đến CSDL giúp giải phóng các kết nối đến CSDL đang làm
việc
- Giảm tải việc tranh chấp dữ liệu khi truy cập dữ liệu
<b>Câu hỏi ôn tập và bài tập</b>
1. Thực hiện tạo cơ sở dữ liệu QLBANHANG gồm các bảng sau:
<b>KHACHHANG (MAKH, HOTEN, DCHI, SODT, NGSINH, DOANHSO, </b>
NGDK)
<b>NHANVIEN (MANV,HOTEN, NGVL, SODT)</b>
<b>SANPHAM (MASP,TENSP, DVT, NUOCSX, GIA)</b>
<b>HOADON (SOHD, NGHD, MAKH, MANV</b>
Tạo kết nối đến CSDL trên
2. Thực hiện tạo cơ sở dữ liệu QLNHANVIEN gồm các bảng sau:
<b>SINHVIEN(MASV, HOTENSV, NU, NGAYSINH, NOISINH,TINH,MALOP)</b>
LOP(MALOP,TENLOP, MAKHOA)
<b>KHOA(MAKHOA,TENKHOA) </b>
<b>MONHOC(MAMH,TENMH,DONVIHT) </b>
<b>GIANGVIEN(MAGV,HOTENGV,HOCVI,CHUYENNGANH,MAKHOA) </b>
<b>KETQUA(MASV, MAMH, LANTHI, DIEMTHI) </b>
<b>BÀI 20: TRUY XUẤT CƠ SỞ DỮ LIỆU BẰNG DATASET</b>
<b>Mã bài: 19.20</b>
<b>Giới thiệu:</b>
Lập trình cơ sở dữ liệu là một phần rất quan trọng trong lập trình ứng
dụng, nó là trung gian kết nối giữa người sử dụng với cơ sở dữ liệu.
Với cơng nghệ ADO.NET chúng ta có một chuẩn thống nhất để lập trình thao
tác với các nguồn cơ sở dữ liệu khác nhau như Access, MySQL, SQL Server,
Oracle… cũng như lập trình ứng dụng với dạng WinForm và WebForm.
Tìm hiểu các đối tượng quan trọng trong ADO.NET để lập trình với CSDL như:
Connection, Command, DataReader, DataAdapter, DataSet để kết nối đến hệ
quản trị CSDL SQL Server.
<b>Mục tiêu:</b>
- Trình bày cơng dụng của Control Dataset
- Sử dụng các control Dataset để truy xuất cơ sở dữ liệu.
- Vận dụng control Dataset 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.
<b>20.1. Định nghĩa Dataset.</b>
DataSet là một đối tượng có thể chứa nhiều DataTable cùng với mối liên
hệ giữa chúng (relationship) và kể các ràng buộc (constraint) được lưu hoàn toàn
trong bộ nhớ để làm việc offline. Qua bài viết này, có thể hiểu cấu trúc của
DataSet, DataTable cũng như nạp dữ liệu, tạo Relation, Constraint và thao tác
dữ liệu trên các đối tượng dữ liệu này.
<b>Cấu trúc của DataSet và DataTable</b>
Để làm việc với DataSet và DataTable cần thêm (Import) thư viện hàm
sau:
<b>Namespace: System.Data</b>
<i>Hình 20.1. Mơ tả đối tượng DataSet</i>
Các property của DataSet và DataTable dùng để lưu trữ các collection
<i>Bảng 20.1. Bảng mô tả DataSet</i>
<b>Kiểu</b> <b>Tên</b> <b>Mô tả</b>
DataTableCollection Tables Lấy dữ liệu của bảng được chứa trong đối
tượng System.Data.DataSet
DataRelationCollectio
n Relations
Lấy dữ liệu của quan hệ liên kết với bảng
và cho phép định hướng từ bảng cha đến
bảng con.
<i>Bảng 20.2. Bảng mô tả DataTable:</i>
<b>Type</b> <b>Name</b> <b>Description</b>
<b>DataColumn</b> Columns Lấy dữ liệu của cột trên bảng.
<b>DataRow</b> Rows Lấy dữ liệu của cột trên bảng.
<b>20.2. Thao tác truy xuất dữ liệu với Dataset.</b>
Để truy xuất được dữ liệu của DataSet cần thực hiện các bước sau:
Bước 1: Kết nối đến CSDL
Bước 3: Dùng thuộc tính .Fill để đưa dữ liệu từ SqlDataAdapter vào trong
DataTable hoặc thông qua DataSet.
Bước 4: Từ đó thao tác và truy xuất cơ sở dữ liệu
Code thực hiện:
Thực hiện bước 1 bằng các đoạn Code sau:
Các bước 2, 3, 4 bằng các đoạn code bên dưới và đưa vào sự kiện _Load của
form để lấy dữ liệu lên DataSet
<b>Câu hỏi ôn tập và bài tập</b>
1. Thực hiện tạo CSDL trên phần mềm quản trị cơ sở dữ liệu SQL Server bằng
giao diện lệnh CSDL QLTHUVIEN sau:
go
use QLTHUVIEN
go
/*=============DANH MUC HỆ ĐÀO TẠO ==============*/
Create table HEDAOTAO
(
MAHE char(5)primary key,
TENHE nvarchar(100) not null,
)
/*==============DANH MUC SINHVIEN ============*/
Create table SINHVIEN
(
MASV char(10) primary key,
TENSV nvarchar(200)not null,
NGAYSINH date,
GIOITINH nvarchar(5),
MAHE CHAR (5) references HEDAOTAO (MAHE)
)
/*==============NHAP DU LIEU LOAIPHONG=============*/
INSERT INTO HEDAOTAO(MAHE,TENHE)
values('CD',N'Cao đẳng')
INSERT INTO HEDAOTAO(MAHE,TENHE)
values('TC',N'Trung cấp')
INSERT INTO HEDAOTAO(MAHE,TENHE)
values('SC',N'Sơ cấp')
/*==============NHAP DU LIEU PHONG=============*/
INSERT INTO SINHVIEN(MASV,TENSV,NGAYSINH,GIOITINH,MAHE)
values('SV01',N'Nguyễn Văn An', '01/02/2004', 'Nam', 'CD')
INSERT INTO SINHVIEN(MASV,TENSV,NGAYSINH,GIOITINH,MAHE)
values('SV03',N'Lương Xuân Trường', '11/02/2002', 'Nam', 'TC')
INSERT INTO SINHVIEN(MASV,TENSV,NGAYSINH,GIOITINH,MAHE)
values('SV04',N'Nguyễn Thị Ngọc Anh', '09/08/2002', N'Nữ', 'CD')
INSERT INTO SINHVIEN(MASV,TENSV,NGAYSINH,GIOITINH,MAHE)
values('SV05',N'Trịnh Thị Mến', '09/13/2004', N'Nữ', 'TC')
INSERT INTO SINHVIEN(MASV,TENSV,NGAYSINH,GIOITINH,MAHE)
values('SV06',N'Trương Tiến Đạt', '02/04/2004', 'Nam', 'TC')
<b>BÀI 21: HIỂN THỊ CƠ SỞ DỮ LIỆU BẰNG DATAGRIDVIEW</b>
<b>Giới thiệu:</b>
Điều khiển giúp hiển thị dữ liệu dưới dạng lưới (bảng) và được sử dụng
để hiển các bảng dữ liệu từ cơ sở dữ liệu.
<b>Mục tiêu:</b>
- Trình bày cơng dụng của control DataGridView
- Sử dụng các control DataGridView để truy xuất và hiển thị cơ sở dữ liệu
- Vận dụng control DataGridView 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
<b>Nội dung chính:</b>
<b>21.1. Ý nghĩa DataGridView.</b>
Là control được tổ chức dưới dạng bảng với các cột dọc (column) và hàng
ngang (row), trên đầu mỗi cột có tên cột. DataGridView hữu ích trong trường
hợp xuất dữ liệu có cấu trúc mảng 2 chiều, bảng dữ liệu, lưu trữ thống kê,
database…
<i>Hình 21.1. Hiển thị điều khiển DataGridView</i>
<b>Xử lý cột (Column) trong DataGridView</b>
thể thêm cột và thiết lập tùy chỉnh cho các cột đó. Thêm cột tại Add Column và
chỉnh sửa cột tại Edit Column. Các checkbox bên dưới thiết lập cho phép (hoặc
không) thêm, bớt, chỉnh sửa, xóa dữ liệu trên DataGridView trong q trình
Nhìn vào bảng Edit Column bên dưới ta thấy trình quản lý các column, tại đây ta
có thể thay đổi tên, text hiển thị đầu dòng và một số tùy chỉnh layout tại nhóm
chức năng Layout.
<b>Xử lý cột trong Code.</b>
Bên dưới là cách thêm cột cho DataGridView. Trong ví dụ ta cần thêm 3 cột nên
lần lượt tạo 3 đối tượng DataGridViewTextBoxColumn và thứ tự thiết lập thuộc
tính cho mỗi cột và cuối cùng thông qua phương thức AddRange để Add các cột
vào DataGridView. Trong ví dụ trên ta thấy cịn có 1 cột nhỏ bên trái
DataGridView, để ẩn cột này ta thiết lập giá trị False cho thuộc
tính RowHeaderVisible.
<b>Thêm dữ liệu cho DataGridView</b>
Thơng qua phương thức Rows.Add() ta có thể dễ dàng thêm dữ liệu cho
DataGridView. Ta thấy DataGridView có 3 cột nên đối số của phương thức
Rows.Add() cần có 3 chuỗi, nếu ít hơn thì những vị trí sau sẽ bị chừa trống.
<b>Truy xuất dữ liệu trong DataGridView</b>
DataGridView tổ chức dữ liệu giống như 1 mảng 2 chiều thông thường, ta có thể
thiết lập và truy xuất dữ liệu dễ dàng thông qua chỉ số hàng và cột. Bên dưới ta
tiến hành lấy dữ liệu trong DataGridView thông qua các chỉ số hàng, cột đưa
vào ở các TextBox. Lưu ý: dữ liệu trong các Cell (ô) lưu trữ dưới kiểu string.
Việc gán dữ liệu vào bảng cũng tiến hành tương tự.
<b>Event Cell Click</b>
<b>21.2. Các thiết lập thuộc tính.</b>
<i>Bảng 21.1. Bảng mơ tả thuộc tính của DataGridView</i>
<b>Thuộc tính</b> <b>Mơ tả</b>
<b>AutoSizeColumnsMode</b> Các kiểu lựa chọn với Cột (Đặt các chế độ
khác nhau)
<b>AutoSizeRowsMode</b> Các kiểu lựa chọn với Hàng (Đặt các chế độ
khác nhau)
<b>BackGroundColor</b> Chọn mầu nền cho DataGridView
<b>BorderStyle</b> Đặt kiểu đường viền ngoài bao quanh cho
DataGridView
<b>CellBorderStyle</b> Đặt đường viền cho các ô
<b>ColumnHeadersBorderStyle</b> Đặt đường viền cho tiêu đề cột
<b>ColumnHeadersHeight</b> Đặt chiều cao cho tiêu đề cột
<b>ColumnHeadersVisible </b> Nhận một trong hai giá trị True hay False
- True: Cho phép hiển thị tiêu đề các cột
- False: Không cho phép hiển thị tiêu để các
cột
<b>Columns</b> Làm việc với cột (Đặt tiêu đề cho Headers,
lựa chọn kiểu cột (Checkbox, Button,
Image…). → Trong DataGridView một cột
<b>DataMember</b> Chọn cơ sở dữ liệu để hiển thị nên
DataGridView
<b>DataSource</b> Chọn nguồn dữ liệu cho DataGridView (hai
thuộc tính DataSource và DataMember hay đi
với nhau)
<b>GridColor</b> Chọn màu cho lưới (các hàng, các cột được
ngăn cách nhau bởi lưới)
<b>MultiSelect</b> Cho phép/Không cho phép chọn nhiều dòng?
<b>ReadOnly </b> Nhận một trong hai giá trị True hay False
- True: Cho phép thay đổi giá trị các các
phần tử (các ô hay các Cell).
- False: không cho phép thay đổi giá trị các
phần tử.
<b>RowHeadersBorderStyle</b> Chọn kiểu viền cho các Hàng (Rows).
<b>RowHeaderVisible</b> Nhận một trong hai giá trị True hay False
- True: Cho phép hiển thị Headers của
hàng(Cột đầu tiên ở mép ngoài bên trái)
- False: Ngược lại