並べ替える前に現在選択されている行(または複数の行)の値を保存し、その後にその行を再選択することでこの問題を回避することができます。
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がない場合は、この目的のために列に追加して非表示にすることができます。
は、その後、あなたがグリッドのバインディングソースの.Find()メソッドを使用することができたDataGridViewのSorted
のEventHandlerにこれを調査している間
void dataGridView1_Sorted(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(selected))
{
int itemFound = _bindingSource.Find("name", selected);
_bindingSource.Position = itemFound;
}
}
を私は答えが使用するMSDNフォーラム上で、次のpostを見つけましたDataBindingCompleteイベント - 100%の理由で私のアプローチがすべてのテストでうまくいきましたが、それが必要なことがわかりましたが、参考になるかもしれません。
あなたは正しいです。選択された行は、行の値ではなく行の索引によって「記憶」されます。 –
ASP .NET 4は、GridViewのEnablePersistedSelectionプロパティを導入しました。しかし、それはWinFormsのために利用できるように見えません。 http://www.asp.net/learn/whitepapers/aspnet4#0.2__Toc253429262 –