WPF DataGrid:如何确定当前行索引?

Tra*_*ger 18 c# wpf datagrid datagridcell

我正在尝试基于DataGrid实现一个非常简单的电子表格功能.

  1. 用户单击一个单元格

  2. 用户键入值并按回车键

  3. 扫描当前行,并更新依赖于单击的单元格的任何单元格公式.

这似乎是我的要求的最佳事件处理程序:

private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)
Run Code Online (Sandbox Code Playgroud)

问题:如何检测当前行的行索引?

Gra*_*ICA 40

试试这个(假设你的网格名称是"my_dataGrid"):

var currentRowIndex = my_dataGrid.Items.IndexOf(my_dataGrid.CurrentItem);
Run Code Online (Sandbox Code Playgroud)

通常,您可以使用my_dataGrid.SelectedIndex,但似乎对于CurrentCellChanged事件,SelectedIndex的值始终显示先前选择的索引.在SelectedIndex的值实际发生更改之前,此特定事件似乎已触发.


Rek*_*ino 5

接受的解决方案将一直有效,直到 中没有引用重复项为止ItemsSource,否则您将获得对象第一次出现的索引。BRAHIM Kamel 的解决方案

将一直有效,直到您进行选择,否则(如果您单击两次并取消选择单元格/行)您将不会有. 这样,您将始终获得最后一次出现的数据项的重复项。我将处理事件并在处理程序中搜索可视化树直至 a ,其中有方法。所以你总是会得到正确的行索引SelectedIndex

YourDataGrid.ItemContainerGenerator.ContainerFromItem( _dataItemFromCurentCell ) as DataGridRow

DataGrid.PreviewMouseLeftButtonDownDatagridRowDatagridRow.GetIndex()

<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();
}
Run Code Online (Sandbox Code Playgroud)