【发布时间】:2018-10-06 04:37:30
【问题描述】:
问题已解决 - 发布以供参考。
您好,我发生了一个奇怪的错误。 我有一个用于存储记录列表的 DataGridView,这些记录由 BackgroundWorker 从源更新。有一个 CheckBox Column 允许用户从 DataGridView 中选择记录进行处理。
当我选中 CheckBox 的第一行(并且只有第一行)时,复选框似乎没有正确刷新并显示为未选中。该复选框仍被视为已选中,并且与其相关的逻辑工作正常。这是一个可能使用户感到困惑的外观问题。 DataGridView 中的任何其他 CheckBox 始终正确绘制。
单击 DataGridView 上的任意位置会导致 CheckBox 状态正确重绘。
这似乎是一个重绘问题,但我无法追踪它为什么会这样绘制。
一些相关的细节。
每次刷新时我都需要重新加载数据集。
我已将单元格突出显示颜色设置为与未突出显示的颜色相同。
我有一个例程检查复选框的选中状态,记录已选择的记录并在替换数据集时重新选中复选框。 - 这工作正常
见以下代码。
private void BgwDocketList_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
var checkedRows = from DataGridViewRow r in Dgv_Batch.Rows
where Convert.ToBoolean(r.Cells[0].Value) == true
select r;
List<int> L = new List<int>();
foreach (DataGridViewRow x in checkedRows)
{
L.Add((int)x.Cells[1].Value);
}
Dgv_Batch.DataSource =e.Result;
foreach (DataGridViewRow v in Dgv_Batch.Rows)
{
if (L.Count(x=>x==(int)v.Cells[1].Value)>0)
{
v.Cells[0].Value = true;
}
}
}
已尝试以编程方式更改选定的单元格 我尝试将焦点设置到 DataGridView 以尝试以编程方式重新创建单击控件的效果。这不会重绘复选框。似乎只需单击鼠标即可。
...好的...
在写这篇文章时,我已经设法解决了这个问题。我想写下这些步骤以确保它们被签出会有所帮助。
问题是更新复选框后我需要使用
DataGridView.EndEdit()
我本来希望该例程最后一个记录而不是第一个记录。我猜这与包含反向索引的 DataGridView.DataGridViewSelectedRowCollection 有关。
无论如何我已经发布了这个问题,希望它可以帮助遇到同样问题的人。
【问题讨论】:
标签: c# checkbox datagridview webforms