Lập trình UD Desktop_04_ComboBox DataBinding

Bài trước: Lập trình UD Desktop_03_CheckBox MessageBox Panel RadioBox
-----

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