VieTopik
Tiếng HànTiếng AnhIT
  • Góc học tập
Tải app
  • Thư viện
  • Luyện thi
  • Cẩm nang
  • Góc học tập
WinForms với OracleHiển thị dữ liệu
Bài 7/15
5 phút

BindingSource

Nội dung bài · 5 mục
  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt

Ở bài trước, thêm sản phẩm vào List<Product> mà lưới không hiện dòng mới. Màn hình kho còn cần một ô nhập luôn hiện tên của sản phẩm đang chọn trên lưới. BindingSource giải quyết cả hai việc.

Khái niệm

🔄 BindingSource: object đứng giữa danh sách dữ liệu và các control, báo cho control khi dữ liệu đổi và giữ dòng đang chọn trong property Current.

🪢 Data binding: nối một property của control với một property của object, sửa bên này thì bên kia đổi theo.

List Product BindingSource DataGridView TextBox tên
Lưới và ô nhập cùng nối vào một BindingSource

Ví dụ

class MainForm : Form
{
    private readonly BindingSource _source =
        new BindingSource();

    public MainForm()
    {
        Text = "Kho hàng";
        Width = 500;
        _source.DataSource = new List<Product>
        {
            new Product
            {
                Id = 1, Name = "Bút bi", Price = 5000m
            },
            new Product
            {
                Id = 2, Name = "Vở", Price = 12000m
            }
        };

        var grid = new DataGridView
        {
            Dock = DockStyle.Fill,
            DataSource = _source,
            ReadOnly = true,
            AllowUserToAddRows = false
        };
        var nameBox = new TextBox
        {
            Dock = DockStyle.Top
        };
        nameBox.DataBindings.Add(
            "Text", _source, "Name");

        var addButton = new Button
        {
            Text = "Thêm thước",
            Dock = DockStyle.Top
        };
        addButton.Click += (sender, e) =>
        {
            _source.Add(new Product
            {
                Id = 3, Name = "Thước", Price = 7000m
            });
        };

        Controls.Add(grid);
        Controls.Add(nameBox);
        Controls.Add(addButton);
    }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = "";
    public decimal Price { get; set; }
}
  • Lưới gắn vào _source, không gắn thẳng vào list.
  • _source.Add(...) thêm vào list bên dưới rồi báo cho lưới. Bấm "Thêm thước" lần này thì dòng mới hiện ngay.
  • DataBindings.Add("Text", _source, "Name") nối Text của ô nhập với Name của sản phẩm đang chọn. Chọn dòng khác trên lưới, ô nhập đổi theo.
  • Control xếp bằng Dock. Giữa các control DockStyle.Top, control thêm sau cùng nằm trên cùng. Lưới DockStyle.Fill lấp phần còn lại.

Thử ngay

Chạy app, chọn dòng "Vở" trên lưới. Trong ô nhập, sửa thành "Vở kẻ ngang", rồi bấm chuột vào lưới.

Đoán trước khi chạy: dòng "Vở" trên lưới có đổi thành "Vở kẻ ngang" không, và đổi lúc nào?

Xem kết quả
Lúc đang gõ: lưới vẫn hiện "Vở".
Bấm sang lưới: dòng thứ hai đổi thành "Vở kẻ ngang".

Binding ghi giá trị vào object khi ô nhập mất focus, không ghi theo từng phím. Object Product đổi xong, BindingSource báo cho lưới vẽ lại.

Lỗi hay gặp

Quên AllowUserToAddRows = false. Gắn qua BindingSource thì cuối lưới có thêm một dòng trống để gõ sản phẩm mới. Màn hình chỉ để xem thì dòng đó gây rối.

// SAI — cuối lưới có một dòng trống
var grid = new DataGridView
{
    DataSource = _source
};
// ĐÚNG
var grid = new DataGridView
{
    DataSource = _source,
    AllowUserToAddRows = false
};

Tóm tắt

  • Gắn control vào BindingSource, không gắn thẳng vào List<T>.
  • Thêm, xoá qua BindingSource thì mọi control gắn vào nó tự cập nhật.
  • DataBindings.Add nối property của control với property của object.
  • Giá trị trong ô nhập được ghi vào object khi ô mất focus.

Tự kiểm tra

0/3 câu
Câu 1

Lưới gắn vào BindingSource _source, bên dưới là List<Order> orders. Thêm đơn bằng cách nào thì lưới hiện ngay?

Câu 2

Dòng nào nối Text của emailBox với property Email của khách đang chọn trong _source?

Câu 3

Nhân viên đang gõ dở tên mới trong ô nhập đã binding. Object Product đã đổi chưa?

DataGridViewHộp thoại và form thứ hai

Nội dung bài

  1. 1.Khái niệm
  2. 2.Ví dụ
  3. 3.Thử ngay
  4. 4.Lỗi hay gặp
  5. 5.Tóm tắt