WinForms DataGridView行刷新问题

xmq68pz9  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(145)

背景:

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:

n3h0vuf2

n3h0vuf21#

我可以用下面的代码修复问题#2:

private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
  if (dataGridView1.CurrentCell is DataGridViewCheckBoxCell && dataGridView1.IsCurrentCellDirty)
  {
    dataGridView1.EndEdit(DataGridViewDataErrorContexts.Commit);
  }
}

相关问题