此問題通常適用於標準DataGridView。出於某種原因,即使在用戶單擊列標題對DataGridView進行排序時,即使沒有選擇任何單元格(選擇已清除),排序後也會始終選擇一個單元格。爲了解釋我爲什麼不想要這個,我需要提供一些關於我的項目的背景。DataGridView排序會導致單元格被選中,即使在排序之前已清除選擇內容
我需要擴展DataGridView的功能,同時保持數據綁定完好無損。首先,我需要將數據組織成可展開/可摺疊的組。後來,其他功能已經專門爲DataGridView(由其他人編寫)將被添加。這意味着我沒有自由使用不是圍繞DataGridView構建的第三方網格組件。
因此,我決定使用由HotDog(Robert Verpalen)編寫的DataGridViewGrouper組件,他的代碼請參閱this link。在此組件中,摺疊的行通過將其可見屬性設置爲false而隱藏。
原則上它的工作原理是,直到我嘗試在選擇了一個組行後排序數據。在這種情況下,它會引發一個錯誤:ArgumentOutOfRangeException。我想我會走捷徑來解決這個問題,並補充說:
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (dataGridViewGrouper1.CurrentRowIsGroupRow)
{
dataGridView1.ClearSelection();
}
}
沒有理由爲什麼用戶必須能夠選擇組行之一,並清除他們的選擇擺脫錯誤的當我嘗試分類時,我得到了。 但是,排序後總會有一個單元格被選中;即使在排序之前選擇已被清除。
我已經添加了一個CellMouseDown事件來跟蹤在排序之前最後選擇了哪個單元格,以便排序後我可以再次選擇同一個單元格(而不是恰好坐在同一行索引處的單元格) 。
private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex == -1)
{
if (dataGridView1.SelectedCells.Count == 0) { return; }
selected = dataGridView1.Rows[dataGridView1.SelectedCells[0].RowIndex].Cells[0].Value.ToString();
}
}
如果沒有選定的單元格(這裏沒有任何要記住的),我從這個方法返回。事實上,如果在最後一次選擇組行後進行排序,確實發生了這種情況,這意味着我嘗試清除該選擇是成功的。
但是,在這種情況下排序後仍然選擇一個單元格。這是一個看似隨機選擇的小組。我懷疑它與選擇被清除之前選擇的單元的位置有某種關係。這會導致相當令人討厭的行爲,例如屏幕跳轉到選定單元格的位置(幾百行距離)或摺疊組中的不可見行在選中時變得可見。
我找不到在哪個事件中選擇了單元格。我試着跟蹤排序之前選擇哪個組行,以便稍後可以選擇其他內容,並且如果有必要使該組中的所有行都不可見,但我沒有管理。我也覺得這不是解決這個問題的正確方法。
類似地,在進入排序操作而不是清除選擇之前,使用循環來選擇最接近的可見數據單元似乎不是一個很好的解決方案。特別是因爲當所有組合都摺疊時(沒有可見的數據行),我仍然會遇到問題。
我真正想要的(我認爲)是在排序之後停止選擇一個單元格,如果在排序之前沒有選擇一個單元格。有人可以幫助我嗎?
雖然這是一箇舊帖子,但我想知道您是否仍在使用該組件。博客上發佈的代碼是一箇舊的主要版本,並已有許多更新(爲了清楚起見,我的vbcity名稱是hotdog)。自舊的vbcity博客關閉以來,我得到了有人正在查找代碼的想法,並且正在考慮將新版本上傳到代碼項目。 (儘管現在的版本已經停滯了一段時間) –
我們仍然使用這個組件,做了一些調整。查看更新版本的代碼肯定會很有趣。 – 5Ke
組件和代碼現在可以在這裏找到:http://www.codeproject.com/Tips/995958/DataGridViewGrouper –