-----
Câu hỏi 14.
Làm sao để gỡ bỏ chế độ chọn (checked) mặc định cho một radiobutton?
2.11
ComboBox
Bài 10. ComboBox
ComboBox là một dạng danh sách xổ xuống và cho phép người
dùng lựa chọn các mục trong đó. Ví dụ như mục chọn phông chữ, kích thước phông
trong Microsoft Word.
Các mục con, hiển thị trong ComboBox được thiết lập ở thuộc
tính Items.
Để sử dụng chức năng autocomplete (gợi ý mục chọn) thiết lập
thuộc tính AutoCompleteMode là SuggestAppend và thuộc tính AutoCompleteSource
là ListItems.
Để xác lập độ rộng và kiểu của ComboBox thiết lập trong thuộc
tính DropDownHeight và DropDownStyle.
Khi người dùng chọn một mục trong danh sách xổ xuống, nên
quan tâm tới hai sự kiện là SelectedIndexChanged và SelectedValueChanged.
– SelectedIndexChanged: khi có sự thay đổi chỉ mục
– SelectedValueChanged: khi có sự thay đổi giá trị
Về sự khác nhau của hai sự kiện SelectedIndexChanged và
SelectedValueChanged, đọc thêm tại đây: https://stackoverflow.com/questions/4818312/combobox-events-selectedindexchanged-vs-selectedvaluechanged
Sử dụng thuộc tính SelectedIndex để lấy giá trị index mà người
dùng vừa chọn. Ví dụ,
private void
comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox cb = sender as
ComboBox;
MessageBox.Show(cb.SelectedIndex.ToString());
}
Sử dụng thuộc tính SelectedItem để lấy item trong ListItem
mà người dùng vừa chọn . Ví dụ,
private void
comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
ComboBox cb = sender as
ComboBox;
MessageBox.Show(cb.SelectedItem.ToString());
}
Có hai cách để đưa dữ liệu vào ComboBox, một là sử dụng
ListItem, hai là sử dụng DataSource.
Ví dụ, sử dụng DataSource để đưa dữ liệu vào ComboBox:
List<string> listItems;
private void
button1_Click(object sender, EventArgs e)
{
listItems = new List<string>() { "CTK40",
"CTK41", "CTK42"
};
comboBox1.DataSource = listItems;
}
Đọc thêm về cách khai báo và sử dụng kiểu dữ liệu List tại
đây:
Đọc thêm về Generic collection tại đây:
List là một kiểu dữ liệu generic collection, dùng để lưu trữ
và quản lý một tập các đối tượng theo kiểu mảng.
Vì List là một lớp, nên trước khi sử dụng cần phải khởi tạo
nó bằng từ khóa new. Kiểu dữ liệu được khai báo trong dấu <>.
Khai báo: public string MSSV { get; set; } sẽ chuyển MSSV thành một property, khi đó thay vì viết
obj.get_MSSV, thì viết thành obj.MSSV. Hoặc thay vì viết obj.set_MSSV(001122),
thì viết thành obj.MSSV = 001122. Đọc thêm ở đây: https://daynhauhoc.com/t/cho-minh-hoi-ve-get-set-trong-c/23855/8
Thuộc tính DisplayName của ComboBox được sử dụng để xác định
trường được hiển thị. Ví dụ,
private void
button1_Click(object sender, EventArgs e)
{
listItems = new List<SinhVien>()
{
new SinhVien() {
MSSV = "001122", HoTen = "Nguyễn Văn Tèo", Diem = 5 },
new SinhVien() {
MSSV = "001133", HoTen = "Trần Văn Tí", Diem = 7 },
new
SinhVien() { MSSV = "001144",
HoTen = "Lê Huỳnh Sửu", Diem = 9
},
};
comboBox1.DataSource = listItems;
comboBox1.DisplayMember = "MSSV";
}
public class SinhVien
{
public string MSSV { get; set; }
public string HoTen {
get; set; }
public float Diem { get; set; }
}
Ví dụ sau sẽ xuất MSSV và HoTen trên hai ComboBox khác nhau,
comboBox1.DataSource = listItems;
comboBox1.DisplayMember = "MSSV";
comboBox2.DataSource = listItems;
comboBox2.DisplayMember = "HoTen";
Ví dụ: xử lý khi có sự thay đổi mục chọn trong ComboBox,
private void
comboBox1_SelectedValueChanged(object sender, EventArgs e)
{
ComboBox
cb = sender as ComboBox;
if ( cb.SelectedValue != null
)
{
SinhVien sv = cb.SelectedValue as SinhVien;
textBox1.Text = sv.HoTen.ToString();
}
}
Có thể viết khác,
private void comboBox1_SelectedValueChanged(object sender, EventArgs
e)
{
ComboBox cb = sender as
ComboBox;
if ( cb.SelectedItem != null
)
{
SinhVien sv = cb.SelectedItem as SinhVien;
textBox1.Text = sv.HoTen.ToString();
}
}
SelectedItem: là lấy item trong listItem của ComboBox, là một
Object???
SelectedValue: là lấy value trong DataSource của ComboBox,
là một chuỗi???
Đọc thêm về sự khác nhau giữa SelectedItem và SelectedValue: https://stackoverflow.com/questions/4902039/difference-between-selecteditem-selectedvalue-and-selectedvaluepath
2.12
Kĩ thuật Data Binding
Thực hiện kết buộc dữ liệu (data binding) giữa ComboBox và TextBox.
Ví dụ,
Viết hàm thực hiện kết buộc dữ liệu:
void addBindings()
{
textBox1.DataBindings.Add("Text",
comboBox1.DataSource, "HoTen");
}
Ý nghĩa của đoạn mã trên: lấy trường HoTen của DataSource
thuộc comboBox1 kết buộc với trường Text của textBox1. Khi giá trị trong HoTen
thay đổi thì cập nhật luôn giá trị tương ứng bên Text.
Gọi hàm addBindings() trong hàm khởi tạo của Form:
public Form1()
{
InitializeComponent();
listItems = new List<SinhVien>()
{
new SinhVien() {
MSSV = "001122", HoTen = "Nguyễn Văn Tèo", Diem = 5 },
new SinhVien() {
MSSV = "001133", HoTen = "Trần Văn Tí", Diem = 7 },
new SinhVien() {
MSSV = "001144", HoTen = "Lê Huỳnh Sửu", Diem = 9 },
};
comboBox1.DataSource = listItems;
comboBox1.DisplayMember = "MSSV";
addBindings();
}
Ví dụ: tạo một ComboBox chứa danh sách các lớp, khi người
dùng chọn một lớp sẽ hiển thị danh sách sinh viên của lớp ở một ComboBox khác.
Sử dụng kĩ thuật data binding.
– Tạo lớp Lop,
public class Lop
{
public string Ten { get; set; }
public List<string>
DanhSachSinhVien { get; set; }
}
– Tạo một danh sách chứa các lớp,
List<Lop> DanhSachLop;
– Khởi tạo dữ liệu, tạo ba lớp, mỗi lớp ba sinh viên,
DanhSachLop = new List<Lop>();
DanhSachLop.Add(new Lop()
{
Ten = "CTK40",
DanhSachSinhVien = new List<string>()
{ "Tí", "Sửu",
"Dần" }
});
DanhSachLop.Add(new Lop()
{
Ten = "CTK41",
DanhSachSinhVien = new List<string>()
{ "Mão", "Thìn",
"Tỵ" }
});
DanhSachLop.Add(new Lop()
{
Ten = "CTK42",
DanhSachSinhVien = new List<string>()
{ "Ngọ", "Mùi",
"Thân" }
});
– Hiển thị dữ liệu trong comboBox1,
comboBox1.DataSource = DanhSachLop;
comboBox1.DisplayMember = "Ten";
– Hàm kết buộc dữ liệu: giữa DataSource của comboBox2 với
DanhSachSinhVien của comboBox1.DataSource,
void addBinding_Lop_DanhSachSinhVien()
{
comboBox2.DataBindings.Add("DataSource",
comboBox1.DataSource, "DanhSachSinhVien");
}
– Gọi hàm kết buộc dữ liệu giữa DataSource của comboBox2 với
DanhSachSinhVien của comboBox1.DataSource,
addBinding_Lop_DanhSachSinhVien();
Lab 7. Data binding giữa ComboBox
và TextBox
[Giao diện khi thiết kế]
[Giao diện khi chạy]
[Yêu cầu]
– Tạo danh sách gồm ít nhất 5 sinh viên
– Mỗi Sinh viên gồm có: MSSV, Họ tên, Điểm
– Sử dụng kĩ thuật data binding giữa ComboBox “MSSV” và hai
TextBox “Họ tên” và “Điểm”
– Khi chạy: chương trình sẽ hiển thị danh sách các MSSV
trong ComboBox “MSSV”, nếu người dùng chọn
một MSSV bất kì, họ tên và điểm sẽ được hiển thị ở hai TextBox tương ứng.
Lab 8. Data binding giữa ComboBox
và ComboBox
[Giao diện khi thiết kế]
[Giao diện khi chạy]
[Yêu cầu]
– Tạo danh sách gồm 5 lớp (ví dụ: CTK38, CTK39, CTK40,…)
– Mỗi lớp gồm ít nhất 5 sinh viên
– Sử dụng kĩ thuật data binding giữa hai ComboBox “Danh sách
lớp” và “Danh sách sinh viên”
– Khi chạy: chương trình sẽ hiển thị danh sách các lớp
trong ComboBox “Danh sách lớp”, nếu người
dùng chọn một lớp bất kì, danh sách sinh viên của lớp đó sẽ được hiển thị trong
ComboBox “Danh sách sinh viên”
Câu hỏi 15.
Kiểu dữ liệu Generics là gì?
Câu hỏi 16.
Trong ComboBox, sự khác nhau giữa SelectedItem và SelectedValue là gì?
Câu hỏi 17. Kĩ thuật data binding là gì?
</////
hết buổi 6
-----Tiếp theo: Lập trình UD Desktop_05_PictureBox ListView
Xem thêm: Danh sách các bài học