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

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

  • Пользователь нажимает на ячейку

  • Пользователь вводит значение и нажимает return

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

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

private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)

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

Ответ 1

Попробуйте это (если имя вашей сетки равно "my_dataGrid" ):

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

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

Ответ 2

привет, вы можете сделать что-то вроде этого, чтобы сделать ваш 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 

    }
}
}

Надеемся на эту помощь

Ответ 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);