2013-08-22 100 views
1

我有一个DataGridView带有两个复选框列。当他们两个上的任何行都被选中时,我想清除复选标记。网格从DataTable填充。它的工作原理是这样的:立即刷新DataGridView单元格值

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

我不明白。选择datagridview中的行并在某个列中添加复选标记(我假设你已经从你写的内容中获得)是两种不同的东西。你想达到什么目的?选择消失还是什么? – Tarec

+0

当我点击一个复选框时,复选框被选中。选择可能会消失或不会,这并不重要。我想要做的是在清除复选框后重新绘制网格,以便复选标记不存在。 –

+0

@JohnNoCookies我不明白你的意思是'清除复选框'?你自己画画,你想清除它?或者你的意思是'取消选中复选框'? –

回答

0

现在有点清楚了。你总是可以取消选择DGV行,但我不知道这是你以后

brandsGridView.ClearSelection(); 
+0

这不取消选中该行,但复选标记仍然存在。 –

+0

是的,但我想一个复选标记取消选择其他原因的原因是因为第二行仍处于选中状态,所以您可以尝试清除选择,然后取消选中您提供的方法中的复选框。 – Tarec

0

我觉得easies方法是首先建立该DataGridView的样结合:

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

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

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

老答案: 我想你可以使用BindingGroup为: http://msdn.microsoft.com/en-us/library/system.windows.data.bindinggroup.aspx

+1

看起来像'BindingGroup'是一些'WPF'的东西,而不是'Winforms':P –

0

我有一个非常类似的问题。 (这是一个不同的背景下,但问题是一样的)

经过大量的尝试和阅读,这和其他相关的线程,我找到了一个解决方案。这有点简陋但对我很有用。

问题与DataGridView有关。所以我暂时改变了焦点到另一个控件(例如按钮),然后把它带回给DataGridView

你的情况可能是这样的:

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

    // stuff... 

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

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