21

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

  1. 用户点击一个单元格

  2. 用户输入一个值并按回车键

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

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

private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)

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

4

5 回答 5

43

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

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

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

于 2013-11-24T01:23:28.980 回答
4

接受的解决方案将一直有效,直到您在 中没有引用重复项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();
}
于 2018-11-15T13:16:22.570 回答
3

嗨,你可以做这样的事情来做你的电子表格

 //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 

    }
}
}

希望这有帮助

于 2013-11-24T01:28:46.137 回答
1

1.点击Datagrid里面的Cell,获取CurrentCell信息

2.从DatagridCellInfo中,我们可以找到特定单元格的列和行索引

private void CellClick(object sender,RoutedEventArgs e)
    {
     DataGridCellInfo cell=DataGrid.CurrentCell;
     int columnindex=cell.Column.DisplayIndex;
     int rowIndex=DataGrid.Items.IndexOf(cell.Item);
    }
于 2019-12-19T06:41:11.987 回答
-3
GRD.Items.Count;
DataGridRow row = (DataGridRow) GRD.ItemContainerGenerator.ContainerFromIndex(i);     
DataGridCell TXTGROUPID = GRD.Columns[2].GetCellContent(row).Parent as DataGridCell;               
string str = ((TextBlock) TXTGROUPID.Content).Text;
MessageBox.Show(str);
于 2015-09-07T06:26:11.763 回答