2011-07-30 78 views
2

どのようにDataGridで行インデックスを選択しますか?DataGrid(wpf)の行インデックスを選択

イベントには、次のコードは動作しません

をSelectionChanged:

 private DataGridRow dgr = new DataGridRow(); 

    private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

     this.dgr = this.dataGrid.ItemContainerGenerator.ContainerFromItem(this.dataGrid.SelectedItem) as DataGridRow; 
     MessageBox.Show(this.dgr.GetIndex().ToString()); 

    } 

答えて

3

WPFデータグリッドが仮想化されているため、コードの上に動作しない理由があり、それが復帰しない場合がありますitemContainerGenerator.ContainerFromItemを使用すると、スクロールビューの外側にある可能性があります。

このため、データグリッドのアイテムコレクションと、選択したアイテムを使用しているIndexOfコールを使用する必要があります。

private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var dg = sender as DataGrid; 
     MessageBox.Show(dg.Items.IndexOf(dg.SelectedItem).ToString()); 
    } 
+0

エラー:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 – mrJack

+0

dgがnullの場合は、代わりにthis.dataGridを使用してください。 dg.SeletedItemがnullの場合はそのチェックを行い、nullでなければインデックスを返します。 –

+0

正解:var dg = DataGrid.CurrentItemとしてDataRowView; MessageBox.Show(dg [0] .ToString()); – mrJack

2

私の答えは遅いですが、検索エンジンからこの投稿を見つけた人にはまだ役立つことを願っています。これはより一般的な解決策であり、選択されたすべての行の索引を定義するのにも役立ちます。

List<int> RowIndexes = new List<int>(); 
int SelectedItemsCount = yourDataGrid.SelectedItems.Count; 
    for (int i = 0; i < SelectedItemsCount ; i++) 
      { 
       RowIndexes.Add(yourDataGrid.Items.IndexOf(yourDataGrid.SelectedItems[i])); 
      } 

これで、RowIndexesには選択した行のすべてのインデックスが含まれます。あなたが望むイベントの中にコードを入れるだけです。

1

これは遅れての回答ですが、これが私の方法です。これは、(dgQueryが私のデータグリッドの名前です)、データグリッドにあなたのすべての選択した行のインデックスを与える:

foreach (var selection in dgQuery.SelectedItems) 
{ 
     DataRowView row = (DataRowView)item; 

     int index = Convert.ToInt32(row.Row[0]) - 1; 
} 

それはインデックス0で1を与えるので、我々は、すべてのインデックスに1を減算する必要があります。

.Row[0]なぜ私は行と呼ばれているのかわからない、そのDataRowViewの列です。 [1]、[2]などに変更して、その行内の他のセルを表示することができます。

このソリューションでは、コレクション、配列、そのような並べ替えの必要はありません。手元にあるもので作業し、既存のコードを利用するだけです。

この実装の大きなプラスの側面は、少なくとも私のために、選択された項目を選択された順序で通過するという事実でした。これは、ユーザーの選択の順序を知りたい場合に非常に強力なツールになります。

解決策を探して4時間以上費やしたので、私はこれを投稿しています。私はチェックボックスをあきらめました。なぜなら、うまく動作するようにそれらを実装するのに十分な時間がなかったからです。

関連する問題