Dot-Net
在 WinForm 應用程序中對 DataGridView 進行排序時選擇的行
在 WinForm 應用程序 C# 4.0 中,我有一個綁定到 SortableBindingList 的 DataGridView。因此,可以通過點擊標題列對其進行排序 - 到目前為止一切正常;-)
問題是,選定的行似乎被行號“記住”了。這是發生的事情:
A* <- "Selected" B C現在按降序排序,C 在頂部並被選中。我還想選擇 A:
C* <- "Selected" B A <- "Want have"選擇多行時也會發生類似的情況。有解決方法嗎?
您可以通過在排序之前儲存目前選定行(或多行)的值,然後重新選擇該行來解決此問題。
您需要使用 CellMouseDown 事件 - 必須使用此事件,因為它是唯一在排序發生之前觸發的事件。ColumnHeaderMouseClick 等替代事件都為時已晚。
在 CellMouseDown 事件處理程序中檢查行索引是否為 -1 以確保選擇了標題。
void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { if (e.RowIndex == -1) { selected = dataGridView1.SelectedRows[0].Cells[0].Value.ToString(); } }我有一個類級別欄位
selected,用於儲存所選列的唯一標識符。如果您沒有唯一的 id,那麼您可以為此添加一列並將其隱藏。然後在
SortedDataGridView 的事件處理程序中,您可以使用網格綁定源的 .Find() 方法:void dataGridView1_Sorted(object sender, EventArgs e) { if (!string.IsNullOrEmpty(selected)) { int itemFound = _bindingSource.Find("name", selected); _bindingSource.Position = itemFound; } }在調查此問題時,我在 MSDN 論壇上發現了以下文章,其中答案使用了 DataBindingComplete 事件 - 我不是 100% 為什麼他們認為這是必要的,因為我的方法對我的所有測試都有效,但您可能會發現它是一個有用的參考。