2011-01-27 25 views
10

WinFormアプリケーションC#4.0では、SortableBindingListにバインドされたDataGridViewがあります。したがって、ヘッダー列をクリックすることでソートすることができます.-すべてこれまでの細かい;-)WinFormアプリケーションでDataGridViewをソートするときに選択した行

問題は、選択した行が行番号によって「記憶されている」ように見えることです。次のようになります。

A* <- "Selected" 
B 
C 

ここで、降順でソートし、Cを上に移動して選択します。私はまだ選択したままにしたいと思っています。選択:

C* <- "Selected" 
B 
A <- "Want have" 

同じことが複数の行が選択されているのと同じように起こります。このための回避策はありますか?

+0

あなたは正しいです。選択された行は、行の値ではなく行の索引によって「記憶」されます。 –

+0

ASP .NET 4は、GridViewのEnablePersistedSelectionプロパティを導入しました。しかし、それはWinFormsのために利用できるように見えません。 http://www.asp.net/learn/whitepapers/aspnet4#0.2__Toc253429262 –

答えて

11

並べ替える前に現在選択されている行(または複数の行)の値を保存し、その後にその行を再選択することでこの問題を回避することができます。

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%の理由で私のアプローチがすべてのテストでうまくいきましたが、それが必要なことがわかりましたが、参考になるかもしれません。

3

はここ

Private cSelectedRow As String 

Private Sub DataGridView1_CellMouseDown(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown 
    If e.RowIndex = -1 AndAlso DataGridView1.SelectedRows.Count > 0 Then 
     cSelectedRow = DataGridView1.SelectedRows(0).Cells("ID").Value.ToString() 
    End If 
End Sub 

VB.NET

で私のアプローチ私はデビッド・ホールと同じイベントを使用しますが、 BindingSourceを使用していないです。だから私は前に選択されたものを見つけるためにグリッドのすべての線をループします。

Private Sub DataGridView1_Sorted() Handles DataGridView1.Sorted 
    DataGridView1.ClearSelection() 
    For Each xRow As DataGridViewRow In DataGridView1.Rows 
     If xRow.Cells("ID").Value = cSelectedRow Then 
      DataGridView1.CurrentCell = xRow.Cells(0) 
      'Line Found. No need to loop through the rest. 
      Exit For 
     End If 
    Next 
End Sub 
関連する問題