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

时间:2013-11-24 00:43:11

标签: c# wpf datagrid datagridcell

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

  1. 用户点击一个单元格

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

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

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

    private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)
    

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

5 个答案:

答案 0 :(得分:36)

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

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

通常情况下,您可以使用my_dataGrid.SelectedIndex,但似乎对于CurrentCellChanged事件,SelectedIndex的值始终显示之前选定的索引。这个特殊事件似乎在SelectedIndex的值实际发生变化之前触发。

答案 1 :(得分: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 

    }
}
}

希望这个帮助

答案 2 :(得分:1)

格兰特(Grant)的解决方案将一直运行,直到ItemsSource中没有引用重复项为止,否则将获得该对象首次出现的索引。

在选择之前,BRAHIM Kamel的解决方案将一直有效,否则,如果您单击两次并取消选择一个单元格/行,您将没有SelectedIndex

使用 YourDataGrid.ItemContainerGenerator.ContainerFromItem( _dataItemFromCurentCell ) as DataGridRow ,您将总是通过重复获得最后一次出现的数据项。

我将处理DataGrid.PreviewMouseLeftButtonDown事件,并在处理程序中搜索可视树,直到DatagridRow,该树具有DatagridRow.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();
}

答案 3 :(得分:0)

1。单击Datagrid内的单元格时,获取CurrentCell信息

2。从DatagridCellInfo中,我们可以找到特定单元格的Column和Row索引

<?php
  $user = wp_get_current_user();
  if ( $user ) : ?>
   <img src="<?php echo esc_url( get_avatar_url( $user->ID ) ); ?>" />
<?php endif; ?>

答案 4 :(得分:-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);