VieTopikKhoá học
  • Games
  • Cá nhân
Tải app
© 2026 VieTopikChính sách bảo mậtĐiều khoản sử dụngCài appEnglish
  • Trang chủ
  • Học
  • Luyện thi
  • Cẩm nang
  • Games
  • Cá nhân
WinForms với OracleHiển thị dữ liệu
Bài 7/15
5 phút

BindingSource

Bình luận
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. Khi nhiều control cùng DockStyle.Top, control được Add 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.
DataGridViewHộp thoại và form thứ hai

Bình luận

Đang tải bình luận…

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