web-dev-qa-db-ja.com

WPF DataGrid:現在の行インデックスを決定する方法は?

DataGridに基づいた非常にシンプルなスプレッドシート機能を実装しようとしています。

  1. ユーザーがセルをクリックする

  2. ユーザーが値を入力してReturnキーを押す

  3. 現在の行がスキャンされ、クリックされたセルに依存するセル数式が更新されます。

これは私の要件に最適なイベントハンドラのようです。

private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)

質問:現在の行の行インデックスを検出するにはどうすればよいですか?

16
Travis Banger

これを試してください(グリッドの名前が「my_dataGrid」であると仮定):

var currentRowIndex = my_dataGrid.Items.IndexOf(my_dataGrid.CurrentItem);

通常、my_dataGrid.SelectedIndexを使用できますが、CurrentCellChangedイベントでは、SelectedIndexの値は常に以前選択されたインデックスを表示するようです。この特定のイベントは、SelectedIndexの値が実際に変更される前に発生するようです。

38
Grant

こんにちは、あなたはあなたのスプレッドシートをするためにこのような何かをすることができます

 //not recomended  as it always  return the previous index of the selected row 
 void dg1_CurrentCellChanged(object sender, EventArgs e)
    {

       int rowIndex = dg1.SelectedIndex;   
     }

しかし、より詳細な例が必要な場合は、これを行うことができます

namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    ObservableCollection<Tuple<string,string>> observableCollection = new ObservableCollection<Tuple<string,string>>();  
    public MainWindow()
    {
        InitializeComponent();            
        for (int i = 0; i < 100; i++)
        {
            observableCollection.Add( Tuple.Create("item " + i.ToString(),"=sum (c5+c4)"));
        }

        dg1.ItemsSource = observableCollection; 

        dg1.CurrentCellChanged += dg1_CurrentCellChanged;

    }

    void dg1_CurrentCellChanged(object sender, EventArgs e)
    {
        //int rowIndex = dg1.SelectedIndex;   
        Tuple<string, string> Tuple = dg1.CurrentItem as Tuple<string, string>; 
        //here as you have your datacontext you can loop through and calculate what you want 

    }
}
}

この助けを願っています

3
BRAHIM Kamel

Grantからの解決策は、ItemsSourceに参照の重複がなくなるまで機能します。それ以外の場合は、オブジェクトの最初の出現のインデックスを取得します。

BRAHIM Kamelのソリューションは、選択するまで機能します。それ以外の場合(2回クリックしてセル/行の選択を解除すると)SelectedIndexがなくなります。

YourDataGrid.ItemContainerGenerator.ContainerFromItem( _dataItemFromCurentCell ) as DataGridRowを使用すると、データ項目の最後の出現が常に重複して取得されます。

I would _DataGrid.PreviewMouseLeftButtonDown_イベントを処理し、DatagridRow.GetIndex()メソッドを持つDatagridRowまでのビジュアルツリーをハンドラーで検索します。 つまり、常に正しい行インデックスを取得します

_<DataGrid ... PreviewMouseLeftButtonDown="Previe_Mouse_LBtnDown" >
    ...
</DataGrid>

private void Previe_Mouse_LBtnDown(object sender, MouseButtonEventArgs e)
{
    DataGridRow dgr = null;
    var visParent = VisualTreeHelper.GetParent(e.OriginalSource as FrameworkElement);
    while (dgr == null && visParent != null)
    {
        dgr = visParent as DataGridRow;
        visParent = VisualTreeHelper.GetParent(visParent);
    }
    if (dgr == null) { return; }

    var rowIdx=dgr.GetIndex();
}
_
2
Rekshino