BindingSource
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 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.
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ốiTextcủa ô nhập vớiNamecủ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 controlDockStyle.Top, control thêm sau cùng nằm trên cùng. LướiDockStyle.Filllấ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àoList<T>. - Thêm, xoá qua
BindingSourcethì mọi control gắn vào nó tự cập nhật. DataBindings.Addnố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âuLướ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?
Dòng nào nối Text của emailBox với property Email của khách đang chọn trong _source?
Nhân viên đang gõ dở tên mới trong ô nhập đã binding. Object Product đã đổi chưa?