我有一个DataGridView
,有两个复选框列。当检查它们上的任何行时,我想清除复选标记。网格从DataTable填充。它的工作原理如下:
if (bothColumnsAreChecked)
{
DataRow first = SelectedFirstItems.First();
DataRow second = SelectedSecondItems.First();
// stuff...
first["IsCheckedFirst"] = false;
second["IsCheckedSecond"] = false;
}
根据this,我修改了代码,以便在点击复选框后立即触发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现在被清除(在某处记录复选框信息之后)。
问题是,当chackmark从r1中的c1消失时,它会停留在r2的复选框中,直到r2失去焦点。
希望有所帮助。
答案 0 :(得分:0)
现在有点清楚了。您可以随时取消选择dgv中的行,但我不知道您是否正在使用
brandsGridView.ClearSelection();
答案 1 :(得分: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
答案 2 :(得分:0)
我有一个非常类似的问题。 (嗯,这是一个不同的背景,但问题是相同的)
经过大量的尝试和阅读,这个和其他相关的线程,我找到了解决方案。它有点简陋,但对我有用。
问题与焦点DataGridView
有关。所以我暂时将焦点改为另一个控件(例如一个按钮),然后将其重新调回DataGridView
在你的情况下可能是这样的:
button1.focus();
if (bothColumnsAreChecked)
{
DataRow first = SelectedFirstItems.First();
DataRow second = SelectedSecondItems.First();
// stuff...
first["IsCheckedFirst"] = false;
second["IsCheckedSecond"] = false;
}
brandsGridView.focus();
我希望它可以提供帮助。但是,如果有人找到更好的解决方案或更详细的解释为什么会发生这种情况。非常感谢。
答案 3 :(得分:0)
设置所需的单元格值后,使用以下命令对我有用,我在Microsoft forum thread上找到了
。 brandsGridView.RefreshEdit();