WPF DataGrid: как определить текущий индекс строки?

Я пытаюсь реализовать очень простую функциональность электронной таблицы на основе DataGrid.

  1. пользователь нажимает на ячейку

  2. пользователь вводит значение и нажимает return

  3. текущая строка сканируется и обновляется любая формула ячейки, которая зависит от нажатой ячейки.

Это, кажется, лучший обработчик событий для моих требований:

private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)

вопрос: Как я могу определить индекс строки текущей строки?

3 ответов


попробуйте это (предполагая, что имя вашей сетки "my_dataGrid"):

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

обычно вы сможете использовать my_dataGrid.SelectedIndex, но кажется, что с CurrentCellChanged событие, значение SelectedIndex всегда отображает ранее выбранный индекс. Это конкретное событие, кажется, срабатывает до того, как значение SelectedIndex фактически изменится.


привет вы можете сделать что-то вроде этого, чтобы сделать свой spreadsheed

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

    }
}
}

надеюсь, что это поможет


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);