Dot-Net

在 WinForm 應用程序中對 DataGridView 進行排序時選擇的行

  • February 25, 2020

在 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% 為什麼他們認為這是必要的,因為我的方法對我的所有測試都有效,但您可能會發現它是一個有用的參考。

引用自:https://stackoverflow.com/questions/4819573