Выберите индекс строки в сетке данных (wpf) - PullRequest
2 голосов
/ 30 июля 2011

как выбрать индекс строки в сетке данных?

Событие SelectionChanged

Следующий код не работает:

        private DataGridRow dgr = new DataGridRow();

    private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        this.dgr = this.dataGrid.ItemContainerGenerator.ContainerFromItem(this.dataGrid.SelectedItem) as DataGridRow;
        MessageBox.Show(this.dgr.GetIndex().ToString());

    }

Ответы [ 3 ]

3 голосов
/ 30 июля 2011

Причина, по которой вышеприведенный код не сработал, заключается в том, что сетка данных wpf виртуализирована и может не возвращать строку с помощью itemContainerGenerator.ContainerFromItem, поскольку она может находиться за пределами представления прокрутки.

Для этого вам нужно использовать коллекцию элементов таблицы данных и вызов IndexOf с использованием выбранного элемента.

   private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
   {
         var dg = sender as DataGrid;
         MessageBox.Show(dg.Items.IndexOf(dg.SelectedItem).ToString());
   }
2 голосов
/ 04 сентября 2013

Мой ответ опоздал, но я надеюсь, что он все еще будет полезен для людей, которые нашли этот пост в поисковых системах.Это более общее решение, которое также помогает определить индексы всех выбранных строк.

List<int> RowIndexes = new List<int>();
int SelectedItemsCount = yourDataGrid.SelectedItems.Count;
   for (int i = 0; i < SelectedItemsCount ; i++)
            {
               RowIndexes.Add(yourDataGrid.Items.IndexOf(yourDataGrid.SelectedItems[i]));
            }

И теперь RowIndexes содержит все индексы выбранных строк.Просто вставьте код в событие, которое вы хотите, и все.

1 голос
/ 12 октября 2013

Это поздний ответ, но так я его выполнил. Это дает вам индекс каждой выбранной строки в DataGrid (dgQuery - это имя моей DataGrid):

foreach (var selection in dgQuery.SelectedItems)
{
       DataRowView row = (DataRowView)item;

       int index = Convert.ToInt32(row.Row[0]) - 1;
}

Это дает 1 в индексе 0, поэтому нам нужно вычесть 1 в каждом индексе.

.Row[0] На самом деле это столбец (в моей голове) ... этого DataRowView, не знаю, почему он называется строкой. Вы можете изменить его на [1], [2] и т. Д. Для просмотра других ячеек в этой строке.

С этим решением вам не нужна коллекция, массив, ничего подобного. Вы просто работаете с тем, что у вас под рукой, и используете существующий код.

Огромным плюсом этой реализации, по крайней мере для меня, был тот факт, что она проходит через выбранные элементы в порядке их выбора. Это может быть очень мощный инструмент, если вы хотите знать порядок выбора пользователя.

Я публикую это, потому что я потратил более 4 часов на поиски решения. Я даже отказался от флажков, потому что у меня нет достаточно времени, чтобы реализовать их для хорошей работы ... может быть, в будущем.

...