Thumbnail
Category: Lập Trình Winform

Những điều cơ bản về winform C#

Date: April 3, 2020
158 views

Những điều cơ bản về winform C#

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.

Bước 1: View ->TabOrder

 

 TabIndex trong winform C#

 

 Step 2 Click vào mỗi control để thay đổi

 

cơ bản về winform C#

3.4 Enable: thấy nhưng không thao tác được

enable trong winform C#

3.5 Visible: Không thấy hiện ra luôn

3.6 Anchor: neo theo form

anchor trong winform C#

3.7 Text-box

text-box trong winform C#

  • Password: sử dụng thuộc tính PasswordChar (các kí tự nhập vào biến thành dấu *)
  • winform C#

  • pasword text-box
  • Hiện nhiều dòng để nhập: sử dụng thuộc tính Multiple và nhớ thêm ScrollBar
  • multiple password text-box

  • Sự kiện: TextChanged
  • TextChanged trong text-box C#

3.8 Button

button trong winform C#

3.9 ListBox & Combobox

ListBox và Combobox trong winform C#

  • 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

C# 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

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

Truyền giá trị giữa các form (2)

Đố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à CancelDialogResult-OK


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áiHệ 10(Thập phân)Hệ 2(Nhị phân)Hệ 16(Thập lục phân)[Khoảng trắng]32010 000020!33010 000121“34010 001022#35010 001123$36010 010024%37010 010125&38010 011026‘39010 011127(40010 100028)41010 100129*42010 10102A+43010 10112B,44010 11002C–45010 11012D.46010 11102E/47010 11112F048011 000030149011 000131250011 001032351011 001133452011 010034553011 010135654011 011036755011 011137856011 100038957011 100139:58011 10103A;59011 10113B<60011 11003C=61011 11013D>62011 11103E?63011 11113F@64100 000040A65100 000141B66100 001042C67100 001143D68100 010044E69100 010145F70100 011046G71100 011147H72100 100048I73100 100149J74100 10104AK75100 10114BL76100 11004CM77100 11014DN78100 11104EO79100 11114FP80101 000050Q81101 000151R82101 001052S83101 001153T84101 010054U85101 010155V86101 011056W87101 011157X88101 100058Y89101 100159Z90101 10105A[91101 10115B\92101 11005C]93101 11015D^94101 11105E_95101 11115F`96110 000060a97110 000161b98110 001062c99110 001163d100110 010064e101110 010165f102110 011066g103110 011167h104110 100068i105110 100169j106110 10106Ak107110 10116Bl108110 11006Cm109110 11016Dn110110 11106Eo111110 11116Fp112111 000070q113111 000171r114111 001072s115111 001173t116111 010074u117111 010175v118111 011076w119111 011177x120111 100078y121111 100179z122111 10107A{123111 10117B|124111 11007C}125111 11017D~126111 11107E

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

Nguồn: https://vforum.vn/diendan/showthread.php?74832-Ma-ASCII-cua-bang-chu-cai-ban-phim-Enter-Space-ESC-mui-ten


Copyright © 2025 All Right Reserved