2013-08-22 135 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(); 

我希望它可以幫助。但是,如果有人找到更好的解決方案或更詳細的解釋爲什麼會發生這種情況。它將不勝感激。