Những điều cơ bản về winform C#
Contents
1. Tổng quan C#
2. Hướng đối tượng
2.1 Phương thức nạp chồng Overloading
Tức là có nhiều phương thức trùng tên, trùng kiểu trả về nhưng khác tham số truyền vào.
- ref int a
- out int b
Ví dụ:
public int chuVi(int a, int b) { return (a+b); } public int chuVi(int a, int b, int c) { return (a+b+c); }
Ngoài ra trong C# hướng đối tượng còn có một trường hợp ghi đè nữa là Override: tức là có những phương thức trùng tên, trùng kiểu trả về, cùng tham số nhưng định nghĩa khác nhau. Lớp con ghi đè lại phương thức của lớp cha.
public virtual string Show() {} public override string Show() {}
2.2 Lớp trừu tượng
abstract class ConNguoi { public abstract string tinhTuoi(); }
2.3 Get – Set
private string hoten; public string HoTen { get { return hoten; } set { hoten = value; } } //khi chạy string name = tenClass.HoTen; //get tenClass.HoTen = "blog cong nghe"; //set
Với mình thì mình sẽ làm cách như thế này. Nhưng mình thấy cách trên lại tiện hơn nhiều nhưng do mình quen cách dưới hơn.
private string hoten; public string HoTen() { return hoten; } public void HoTen(string hoten) { this.hoten = hoten; } //khi chạy string name = tenClass.HoTen(); //get tenClass.HoTen( "blog cong nghe" ); //set
2.4 Contructor
Tên hàm sẽ trùng với tên lớp. Và các bạn lưu ý một điều là khi tạo constructor có tham số thì trình biên dịch khộng tạo constructor mặc định nếu bạn cố gắng khai báo kiểu contructor mặc định thì sẽ bị báo lỗi, để khắc phục nó thì bạn chỉ cần tạo constructor mặc định là được. (Constructor mặc định là constructor không có tham số nhé).
class ConNguoi { int tuoi; public ConNguoi() { } public ConNguoi(int tuoi) { this.tuoi = tuoi; } }
Khi không khai báo phạm vi truy xuất, được hiểu là giá trị thấp nhất. Tức là biến tuoi ở trạng thái private.
2.5 Destructor
Ví dụ:
if(true) { HocSinh hs = new HocSinh(); } //hs bị hủy sẽ gọi Destructor
Cú Pháp:
class ConNguoi { int tuoi; public ~ConNguoi() { } }
2.6 Bài tập hướng đối tượng
using System; /* main */ public class Program { public static void Main() { Date ngaySinh = new Date(1, 9, 1999); Date ngayVaoLam = new Date(08, 4, 2020); Employee nv = new Employee("Do", "Hao", ngaySinh, ngayVaoLam); nv.show(); } } /* Lop Date */ public class Date { private int day; private int month; private int year; public void setDay(int day) { this.day = day; } public void setMonth(int month) { this.month = month; } public void setYear(int year) { this.year = year; } public int getDay() { return day; } public int getMonth() { return month; } public int getYear() { return year; } public Date(int day, int month, int year) { this.day = day; this.month = month; this.year = year; } public Date() { this.day = 1; this.month = 1; this.year = 1900; } public void show() { Console.Write(day + "/" + month + "/" + year); } public bool hopLe() { if( !validateDay() ) { Console.Write("Loi ngay"); return false; } if( !validateMonth() ) { Console.Write("Loi thang"); return false; } if( !validateYear() ) { Console.Write("Loi nam"); return false; } return true; } public bool validateDay() { if( day<1 || day>31 ) return false; return true; } public bool validateMonth() { if( month<1 || month>12 ) return false; return true; } public bool validateYear() { if( year<1900 ) return false; return true; } } /* Lop Employee*/ public class Employee { private String ho; private String ten; private Date birthday = new Date(); private Date ngayVaoLam = new Date(); public Employee() { } public Employee(String ho, String ten, Date birthday, Date ngayVaoLam) { this.ho = ho; this.ten = ten; this.birthday = birthday; this.ngayVaoLam = ngayVaoLam; } public void show() { Console.WriteLine("Ho: " + ho); Console.WriteLine("Ten: " + ten); Console.Write("Ngay sinh: " ); birthday.show(); Console.WriteLine(); Console.Write("Ngay vao lam: " ); ngayVaoLam.show(); } }
3. Cơ bản về winform
3.1 Đóng Form
this.Close();
3.2 Readonly
- Const
- define
3.3 TabIndex
TabIndex là thuộc tính nhận thứ tự của control khi nhấn phím Tab.
3.4 Enable: thấy nhưng không thao tác được
3.5 Visible: Không thấy hiện ra luôn
3.6 Anchor: neo theo form
3.7 Text-box
- Password: sử dụng thuộc tính PasswordChar (các kí tự nhập vào biến thành dấu *)
- Hiện nhiều dòng để nhập: sử dụng thuộc tính Multiple và nhớ thêm ScrollBar
- Sự kiện: TextChanged
3.8 Button
3.9 ListBox & Combobox
- Lấy dữ liệu được chọn:
tenCB.Items[vi_tri].tostring();
hoặc tenCB.Items.IndexOf(vi_tri); - Thêm dữ liệu:
tenCB.Items.Add(); - Xóa dữ liệu:
tenCB.Items.RemoveAt(vi_tri); - DropDownStyle
- DisplayMembers
- ValueMember
- DataSource: nguồn của CSDL
3.10 ListView
ColumnHeader col1 = newe ColumnHeader(); col1.Text = "Ten Cot"; listviewName.Column.Add(col1);
3.11 Data Grid View
Link hướng dẫn: https://tuandc.com/lap-trinh/goi-du-lieu-tu-datagridview-va-listview-len-textbox-khi-click-dong-trong-c.html
Thuộc tính:
- ReadOnly
- AutoSizeColumnMode : Fill (để nội dung full width của dataGridView)
Sự kiện: cellClick
String sql = "SELECT maSinhVien as 'Mã Sinh Viên', tenSinhVien as 'Tên Sinh Viên' FROM sinhvien"; DataTable bangSinhVien = new DataTable(); bangSinhVien = csdl.LayBang(sql); dgvSinhVien.DataSource = bangSinhVien; //lấy giá trị cột nhất định int index = e.RowIndex; txtMaSV.Text = dgv.Rows[index].Cells[0].Value.ToString(); txtTenSV.Text = dgv.Rows[index].Cells[1].Value.ToString(); string giaTri = dgv.Rows[index].Cells[2].Value.ToString(); //lưu ý cần bỏ giá trị index = -1 vì đó là tiêu đề cột if(index != -1) { //code } //Khi truy vấn csdl sử dụng as để hiển thị tiếng việt
3.12 DateTimePicker
Điều khiển DateTimePicker có 2 phần (hình trên), phần thứ nhất là 1 Label để hiển thị ngày tháng đã lựa chọn, và phần thứ 2 là 01 bảng lịch dưới dạng Popup cho phép người dùng lựa chọn ngày tháng. Thuộc tính quan trọng nhất của điều khiển DateTimePicker đó là thuộc tính Value, nó cho phép lưu trữ thông tin về ngày tháng đã được người sử dụng lựa chọn. Chúng ta có thể gán giá trị cho thuộc tính Value trong khi chạy ứng dụng như sau:
dateTimePicker1.Value = DateTime.Today;
Để lưu lại giá trị của thuộc tính Value của điều khiển DateTimePicker , chúng ta sử dụng biến đối tượng DateTime, như dưới đây.
DateTime iDate; iDate = dateTimePicker1.Value;
Điều khiển DateTimePicker có một vài lựa chọn kiểu hiển thị ngày tháng, cụ thể gồm có 4 định dạng hiển thị gồm các kiểu: Long, Short, Time, hoặc dạng Custom, chúng ta có thể thay đổi kiểu hiển thị như sau:
dateTimePicker1.Format = DateTimePickerFormat.Short;
Nguồn: https://csharpcanban.com/huong-dan-su-dung-datetimepicker.html
Về kiểu dữ liệu DateTime, bạn tham khảo bài viết: https://o7planning.org/vi/10457/huong-dan-su-dung-date-time-trong-csharp
4. Kết nối CSDL
Thư viện kết nối csdl của thầy Việt: https://github.com/tronghao
4.1 Sửa lỗi không thể kết nối SQL Server
Bước 1: Nhấn tổ hợp phím Windows +R
Bước 2: Gõ services.msc
Bước 3: Click phải chuột vào dòng SQL Server (MSSQLSERVER) sau đó chọn start
Bước 4: Click phải chuột vào dòng SQL Server VSS Writer sau đó chọn restart
Video hướng dẫn
5. Các mẹo khi sử dụng
- Ctrl + F4: đóng toàn bộ các tab làm việc trên visual studio.
5.1 Snippet
Snippet giups chúng ta code nhanh hơn với vài kí tự ngắn.
Các code của tôi đã tạo snippet. Link download: https://drive.google.com
Sau khi tải bạn vào visual studio => TOOLS => Code Snippets Manager => Language (chọn C#) => My Code Snippets. Bạn giải nén file lúc nãy ra copy toàn bộ file vào đường dẫn tại mục Location.
6. Kinh nghiệm
6.1 Show form con từ form cha
//form cha vẫn thao tác được xu_ly_them frmThem = new xu_ly_them(); frmThem.Show(); //khóa form cha khi form con hiển thị xu_ly_them frmThem = new xu_ly_them(); frmThem.ShowDialog(); //hiện form con ẩn form cha //lưu ý visible form cha phải thực hiện trước khi form con hiển thị xu_ly_them frmThem = new xu_ly_them(); this.Visible = false; frmThem.ShowDialog(); this.Visible = true;
6.2 Lấy năm hiện tại
DateTime.Now.Year
6.3 Truyền giá trị giữa các form trong C# bằng thuộc tính DialogResult
DialogForm: có 1 TextBox (id: txtValue) và 2 button OK, Cancel
Đối với button OK, bạn set thuộc tính DialogResult là OK và tương tự, button Cancel có thuộc tính DialogResult là Cancel
DialogForm frm = new DialogForm(); //Gán giá trị cho biến textValue trong DialogForm frm.textValue = txtValue.Text; //Nếu sau khi bạn ấn nút OK trên DialogForm if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK) { //Gán giá trị textValue trong DialogForm cho textbox txtValue trong MainForm txtValue.Text = frm.textValue; }
6.4 Public cho đối tượng(textbox,…)
6.5 Sử dụng ArrayList và ListBox
//ArrayList //Khai báo ArrayList dsKhachhang = new ArrayList(); //duyệt for (int i=0; i< dsKhachhang.Count; i++) { } //Thêm dsKhachhang.Add(kh); //Xóa dsKhachhang.RemoveAt(index); dsKhachhang.Clear(); //Xóa hết //ListBox //xóa lbKhachHang.Items.Clear(); //xóa tất cả lbKhachHang.Items.RemoveAt(index); //thêm lbKhachHang.Items.Add(kh.hoten); //Lấy vị trí được chọn lbKhachHang.SelectedIndex; //Kết hợp ListBox và ArrayList KhachHang kh= new KhachHang(); lbKhachHang.Items.Clear(); for (int i=0; i< dsKhachhang.Count; i++) { kh= (KhachHang)dsKhachhang[i]; lbKhachHang.Items.Add(kh.hoten); }
6.6 Xử lý bắt phím
//Viet trong ham KeyDownEvent switch (e.KeyValue) { case 48: btn0_Click(sender, e); break; case 108: btnBang_Click(sender, e); break; }
6.7 Combobox và ArrayList
ArrayList sử dụng như phần 6.5 nha!
Combobox có hai phần quan trọng là: DisplayMember (phần hiển thị) và ValueMember (phần dữ liệu của item). À muốn hiển thị không cho người ta nhập thì dùng thuộc tính dropdownstyle: dropdownlist nhé!
COMBOBOX //thêm một item cmb.Items.Add((sinhvien)ds[i]); //xóa //xóa tất cả cmb.Items.Clear(); //(cái này sử dụng cho class) //xóa một phần tử Xóa trong ArrayList rồi cập nhật lại cho combobox //Hiển thị giá trị của trường nào cmb.DisplayMember = "maSo"; //lấy vị trí được chọn int index = cmb.SelectedIndex; //text hiển thị cmb.Text = ""; //ví dụ DataTable bangsinhvien = new DataTable(); sql = "select * from lop"; bangsinhvien = csdl.LayBang(sql); cbTenLop.DataSource = bangsinhvien; cbTenLop.DisplayMember = "ten_lop"; cbTenLop.ValueMember = "ma_lop"; //lấy dữ liệu int index = cbTenLop.SelectedIndex; String maLop = cbTenLop.SelectedValue.ToString(); //chọn dữ liệu để hiển thị lên combobox string giaTri = dgv.Rows[index].Cells[2].Value.ToString(); cbTenLop.SelectedIndex = cbTenLop.FindStringExact(giaTri); //giaTri là giá trị của displayMember
6.8 DataTable
/* Ví dụ: DataTable có dữ liệu như sau: ma_nganh tennganh 110 Cong Nghe Thong Tin 111 Ke Toan */ //Để lấy dữ liệu dòng 110: tenDataTable.Rows[0][0] //kết quả 110 tenDataTable.Rows[0][1] //kết quả Cong Nghe Thong Tin //Để lấy dữ liệu dòng 111: tenDataTable.Rows[1][0] //kết quả 111 tenDataTable.Rows[1][1] //kết quả Ke Toan //Lưu ý: nên sử dụng toString() để sử dụng dữ liệu tenDataTable.Rows[1][0].toString() //Cách khác tenDataTable.Rows[1].<Kiểu dữ liệu>ten_cot_trong_csdl
6.9 Bắt sự kiện click chuột trái – phải – giữa
private void textBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) //thay thành Left - Right - Middle { //code } }
7. Mã ASCII
Mã ascii của bảng chữ cái, bàn phím Enter, Space, ESC, mũi tên
Khi học lập trình C hoặc C++ Chắc hẳn các bạn sẽ được làm quen với bảng mã ASCII các ký tự chữ số và bàn phím để nhận biết khi sử dụng một số thao tác như nhập tới khi nhấn Enter hoặc phím nào đó. một số mã ASCII thường gặp là:
- Phím Enter: 13
- Phím Space: 32
- Phím Xóa ngược(BackSpace) <–: 8
- Phím ESC: 27
- Tab: 9
- CTRL: 17
Các kỹ tự, chữ cái | Hệ 10(Thập phân) | Hệ 2(Nhị phân) | Hệ 16(Thập lục phân) |
[Khoảng trắng] | 32 | 010 0000 | 20 |
! | 33 | 010 0001 | 21 |
“ | 34 | 010 0010 | 22 |
# | 35 | 010 0011 | 23 |
$ | 36 | 010 0100 | 24 |
% | 37 | 010 0101 | 25 |
& | 38 | 010 0110 | 26 |
‘ | 39 | 010 0111 | 27 |
( | 40 | 010 1000 | 28 |
) | 41 | 010 1001 | 29 |
* | 42 | 010 1010 | 2A |
+ | 43 | 010 1011 | 2B |
, | 44 | 010 1100 | 2C |
– | 45 | 010 1101 | 2D |
. | 46 | 010 1110 | 2E |
/ | 47 | 010 1111 | 2F |
0 | 48 | 011 0000 | 30 |
1 | 49 | 011 0001 | 31 |
2 | 50 | 011 0010 | 32 |
3 | 51 | 011 0011 | 33 |
4 | 52 | 011 0100 | 34 |
5 | 53 | 011 0101 | 35 |
6 | 54 | 011 0110 | 36 |
7 | 55 | 011 0111 | 37 |
8 | 56 | 011 1000 | 38 |
9 | 57 | 011 1001 | 39 |
: | 58 | 011 1010 | 3A |
; | 59 | 011 1011 | 3B |
< | 60 | 011 1100 | 3C |
= | 61 | 011 1101 | 3D |
> | 62 | 011 1110 | 3E |
? | 63 | 011 1111 | 3F |
@ | 64 | 100 0000 | 40 |
A | 65 | 100 0001 | 41 |
B | 66 | 100 0010 | 42 |
C | 67 | 100 0011 | 43 |
D | 68 | 100 0100 | 44 |
E | 69 | 100 0101 | 45 |
F | 70 | 100 0110 | 46 |
G | 71 | 100 0111 | 47 |
H | 72 | 100 1000 | 48 |
I | 73 | 100 1001 | 49 |
J | 74 | 100 1010 | 4A |
K | 75 | 100 1011 | 4B |
L | 76 | 100 1100 | 4C |
M | 77 | 100 1101 | 4D |
N | 78 | 100 1110 | 4E |
O | 79 | 100 1111 | 4F |
P | 80 | 101 0000 | 50 |
Q | 81 | 101 0001 | 51 |
R | 82 | 101 0010 | 52 |
S | 83 | 101 0011 | 53 |
T | 84 | 101 0100 | 54 |
U | 85 | 101 0101 | 55 |
V | 86 | 101 0110 | 56 |
W | 87 | 101 0111 | 57 |
X | 88 | 101 1000 | 58 |
Y | 89 | 101 1001 | 59 |
Z | 90 | 101 1010 | 5A |
[ | 91 | 101 1011 | 5B |
\ | 92 | 101 1100 | 5C |
] | 93 | 101 1101 | 5D |
^ | 94 | 101 1110 | 5E |
_ | 95 | 101 1111 | 5F |
` | 96 | 110 0000 | 60 |
a | 97 | 110 0001 | 61 |
b | 98 | 110 0010 | 62 |
c | 99 | 110 0011 | 63 |
d | 100 | 110 0100 | 64 |
e | 101 | 110 0101 | 65 |
f | 102 | 110 0110 | 66 |
g | 103 | 110 0111 | 67 |
h | 104 | 110 1000 | 68 |
i | 105 | 110 1001 | 69 |
j | 106 | 110 1010 | 6A |
k | 107 | 110 1011 | 6B |
l | 108 | 110 1100 | 6C |
m | 109 | 110 1101 | 6D |
n | 110 | 110 1110 | 6E |
o | 111 | 110 1111 | 6F |
p | 112 | 111 0000 | 70 |
q | 113 | 111 0001 | 71 |
r | 114 | 111 0010 | 72 |
s | 115 | 111 0011 | 73 |
t | 116 | 111 0100 | 74 |
u | 117 | 111 0101 | 75 |
v | 118 | 111 0110 | 76 |
w | 119 | 111 0111 | 77 |
x | 120 | 111 1000 | 78 |
y | 121 | 111 1001 | 79 |
z | 122 | 111 1010 | 7A |
{ | 123 | 111 1011 | 7B |
| | 124 | 111 1100 | 7C |
} | 125 | 111 1101 | 7D |
~ | 126 | 111 1110 | 7E |
Mã ASCII của bàn phím:
Phím |
Mã ASCII |
– (keypad) |
109 |
. (keypad) |
110 |
/ (keypad) |
111 |
F1 |
112 |
F2 |
113 |
F3 |
114 |
F4 |
115 |
F5 |
116 |
F6 |
117 |
F7 |
118 |
F8 |
119 |
F9 |
120 |
F10 |
121 |
F11 |
122 |
F12 |
123 |
F13 |
124 |
F14 |
125 |
F15 |
126 |
Back space |
8 |
Tab |
9 |
Clear |
12 |
Enter |
13 |
Shift |
16 |
Ctrl |
17 |
Alt |
18 |
Caps lock |
20 |
Esc |
27 |
Space bar |
32 |
Page up |
33 |
Page down |
34 |
End |
35 |
Home |
36 |
Left arrow |
37 |
Up arrow |
38 |
Right arrow |
39 |
Down arrow |
40 |
Insert |
45 |
Delete |
46 |
Help |
47 |
Num lock |
144 |
; : |
186 |