背景:
WinForms窗体有两个DataGridView控件,DataGridView 1和DataGridView 2(SelectionMode属性设置为FullRowSelect),如上传的图片所示。这两个DataGridView控件都列出产品,并且具有相同的列集(DataGridView 1中有一个附加的复选框列)。“数量”列是可编辑的,编辑后将更新“金额”列。目标是,当在一个DataGridView控件中进行更改时,相同的更改也会反映在另一个DataGridView控件中。
数据模型:
public class Product : INotifyPropertyChanged
{
public string Code { get; set; }
public string Name { get; set; }
private int quantity;
public int Quantity
{
get { return this.quantity; }
set
{
this.quantity = value;
this.OnPropertyChanged();
}
}
}
public class ProductCollection : Collection<Product>
{
}
数据绑定:
BindingSource bs1 = new BindingSource();
bs1.DataSource = pc1; // pc1 is the ProductCollection from database as a result of search
dataGridView1.DataSource = bs1;
BindingSource bs2 = new BindingSource();
bs2.DataSource = new ProductCollection();
dataGridView2.DataSource = bs2;
用法:
1.用户执行搜索,一个或多个产品将根据搜索文本从数据库加载到DataGridView 1中。
1.然后,用户根据需要编辑Quantity列,这将相应地更新Amount列。
1.然后,用户使用每行的复选框选择产品,然后单击“添加到产品列表”按钮将所选产品添加到DataGridView 2。
...
private void AddProductsButton_Click(sender, e)
{
for (int rowIndex = 0; rowIndex < this.dataGridView1.RowCount; rowIndex++)
{
DataGridViewRow row = this.dataGridView1.Rows[rowIndex];
DataGridViewCheckBoxCell cell = (DataGridViewCheckBoxCell)row.Cells[0];
if (cell.IsChecked())
{
Product product = (Product)row.DataBoundItem;
this.bs2.Add(product);
cell.Uncheck();
}
}
}
到目前为止一切顺利!
问题:
1.当更新一个DataGridView控件中的Quantity列时,仅对于当前突出显示(选定)的行,更改会立即反映在另一个DataGridView控件中。对于未选定的行,更改不会立即反映。而且,正如我所做的任何导致DataGridView被重新绘制的事情一样,更新后的值也会显示出来。
1.在DataGridView 1中,将选定(选中)产品添加到DataGridView 2后,将以编程方式取消选中单元格(请参见上面的代码)。除突出显示的行外,所有行的单元格都未选中(尽管基础单元格值为false)。与上面的问题类似,当我执行任何导致DataGridView重新绘制的操作时,复选标记消失。
我试图在所附的截图中描述这些问题(尽可能多地)。
DataGridView1:
DataGridView2:
1条答案
按热度按时间n3h0vuf21#
我可以用下面的代码修复问题#2: