1

我有一个DataGridView带有两个复选框的列。当检查它们的任何行时,我想清除复选标记。网格由 DataTable 填充。它是这样工作的:

if (bothColumnsAreChecked)
{
    DataRow first = SelectedFirstItems.First();
    DataRow second = SelectedSecondItems.First();

    // stuff...

    first["IsCheckedFirst"] = false;
    second["IsCheckedSecond"] = false;
}

根据这个,我修改了代码以CellValueChanged在单击复选框后立即触发事件,而不是在失去焦点时:

void brandsGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    brandsGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
}

问题是,在清除复选标记后,其中一行仍被选中(因为我只是单击了该行中的一个复选框),并且该行上的复选标记仍然可见 - 它不会消失,直到我取消选择排。我该如何做到这一点?我试过了:

1)Refresh()在网格上。徒劳无功; 网格会刷新,但在移动光标之前不会重绘。

2)CommitEdit()EndEdit()。这甚至不会清除最后选中的复选框。

我能做些什么?

编辑:我不擅长解释。这是一个简单的演练:

有两个复选框列:c1 和 c2。

1) 我点击 r1 行上的 c1。c1 被选中并且 r1 被选中。

2) 我在 r2 行(甚至 r1)上单击 c2。c2 被选中并且 r2 被选中。

3) c1 和 c2 现在被清除(在某处记录复选框信息后)。

问题是,当 r1 中的 c1 中的标记消失时,它会一直停留在 r2 上的复选框中,直到 r2 失去焦点。

希望有帮助。

4

4 回答 4

0

我认为最简单的方法是首先为此 DataGridView 设置绑定,例如:

DataGridView dg = new DataGridView();
DataTable dt = GetDataTable();
dg.DataSource = dt;

然后当你想刷新它时,你再次设置绑定。是的,我意识到这是肮脏的hacky方式,但它是最简单的。

DataTable dt = GetDataTable();
dg.DataSource = dt;

旧答案:我认为您可以为此使用 BindingGroup:http: //msdn.microsoft.com/en-us/library/system.windows.data.bindinggroup.aspx

于 2013-08-22T17:39:19.127 回答
0

现在有点清楚了。您可以随时取消选择 dgv 中的行,但我不知道这是否是您所追求的

brandsGridView.ClearSelection();
于 2013-08-22T16:14:36.720 回答
0

我有一个非常相似的问题。(嗯,这是一个不同的上下文,但问题是一样的)

经过大量尝试和阅读,this和其他相关线程,我找到了解决方案。它有点初级,但对我有用。

问题与DataGridView焦点有关。所以我暂时将焦点更改为另一个控件(例如按钮),然后将其带回DataGridView

在你的情况下可能是这样的:

button1.focus();
if (bothColumnsAreChecked)
{
    DataRow first = SelectedFirstItems.First();
    DataRow second = SelectedSecondItems.First();

    // stuff...

    first["IsCheckedFirst"] = false;
    second["IsCheckedSecond"] = false;
}
brandsGridView.focus();

我希望它可以帮助。但是,如果有人找到更好的解决方案或更详细的解释为什么会发生这种情况。将不胜感激。

于 2016-05-11T14:01:15.657 回答
0

在设置所需的单元格值后使用以下命令对我有用,这是我在Microsoft 论坛线程上找到的。

brandsGridView.RefreshEdit();

于 2020-11-30T22:44:04.247 回答