Доступ к значениям ячеек DataGrid в WPF? - PullRequest
0 голосов
/ 25 октября 2011

У нас есть такой сценарий, что у нас есть страница, включающая DataGrid, и теперь мы хотим получить все данные из этой DataGrid, но без доступа к базовому источнику элемента, то есть мы хотим получить доступ к данным напрямуюиз DataGrid.Это кажется хитрым, но не невозможным.Я нашел много статей, таких как: DataGridHelper , и это: Получить строку и ячейку WPF DataGrid и многие другие.По сути, это одно и то же: определить методы расширения в DataGrid с помощью другой функции GetVisualChild, чтобы найти целевой объект DataGridCell.Однако, когда я использую его, я не могу найти целевую ячейку.В частности, каждая строка в DataGrid соответствует одному элементу из коллекции DataContext, скажем, это коллекция типа «Сотрудник», и каждый столбец DataGrid соответствует одному свойству класса Employee, например, Имя, Пол, Возраст.Теперь моя проблема заключается в том, что вышеупомянутая функция GetCell () всегда находит DataGridCell с одним объектом Employee в качестве содержимого (свойство Content в DataGridCell) и не может углубляться в каждое свойство, независимо от того, какой индекс столбца я даю.Это.Например, в функции GetCell есть одна строка: Dim cell As DataGridCell = DirectCast(presenter.ItemContainerGenerator.ContainerFromIndex(column), DataGridCell), где докладчик - это DataGridCellsPresenter, который я получил, представляющий выбранную мной строку, и как только я дам индекс столбца, естественно, я ожидаю, что он вернетконтроль выбранного свойства в позиции, которую я указал.Но это просто не работает, как ожидалось.Любая помощь будет оценена!

Ответы [ 2 ]

0 голосов
/ 05 апреля 2014

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

    private void dgSetRow(DataGrid dg, string sColHeader, int iFindValue)
    {

        foreach (DataRowView drv in dg.Items )
        {
            // compare value in datarow of view
            if (iFindValue == (int)drv.Row[sColHeader])
            {
                // select item
                dg.SelectedItem = drv;
                dg.ScrollIntoView(drv);
            }
        }
    }
0 голосов
/ 25 октября 2011

В тот момент, когда вы используете presenter.ItemContainerGenerator.ContainerFromIndex, вы попадаете в ограничение для того, чтобы оно работало ТОЛЬКО для не виртуализированных элементов, то есть строк, отображаемых в представлении прокрутки (плюс некоторое смещение числа строк выше и ниже пределов представления прокрутки)сетка данных.

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

  1. Доступ к коллекции DataGrid.Items.Это представление элементов, поэтому любые элементы, скрытые по критериям фильтра или пользовательской подкачки страниц, будут исключены.Если вы не хотите этого, выполните DataGrid.ItemsSource.Cast<object>().ToList() вызов.

  2. Теперь получите доступ ко всем столбцам таблицы данных, например, DataGrid.Columns.Предполагая, что они относятся к любому типу, кроме DataGridTemplateColumn, на шаге 3 ниже будет извлечено значение уровня ячейки.Для столбцов шаблона вам нужно будет указать некоторое значение свойства, представляющее весь шаблон ячейки.Я считаю DataGridTemplateColumn.SortMemberPath хорошим кандидатом для этого.

  3. Извлеките DataGridTextColumn.Binding, DataGridCheckBoxColumn.Binding, DataGridComboBoxColumn.SelectedValueBinding или DataGridComboBoxColumn.SelectedItemBinding.Затем для каждого элемента из шага 1 выполните привязку для извлечения значения.

Код

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        string gridContent = string.Empty;

        foreach(var item in MyDataGrid.Items)
        {
            foreach (var column in MyDataGrid.Columns)
            {
                var textCol = column as DataGridTextColumn;
                var checkCol = column as DataGridCheckBoxColumn;
                var comboCol = column as DataGridComboBoxColumn;
                var templateCol = column as DataGridTemplateColumn;

                if (textCol != null)
                {
                    var propertyName = ((Binding)textCol.Binding).Path.Path;
                    var value
                            = item.GetType().GetProperty(
                                  propertyName).GetValue(
                                  item,
                                  new object[] {});

                    if (((Binding)textCol.Binding).Converter != null)
                    {
                        value
                            = ((Binding)checkCol.Binding).Converter.Convert(
                                value,
                                typeof(object),
                                ((Binding)checkCol.Binding).ConverterParameter,
                                ((Binding)checkCol.Binding).ConverterCulture);
                    }
                    gridContent = gridContent + "\t" + value.ToString();
                }
                if (checkCol != null)
                {
                    var propertyName = ((Binding)checkCol.Binding).Path.Path;
                    object value
                        = item.GetType().GetProperty(
                               propertyName).GetValue(
                               item,
                               new object[] { });

                    if (((Binding)checkCol.Binding).Converter != null)
                    {
                        value
                            = ((Binding)checkCol.Binding).Converter.Convert(
                                value,
                                typeof(object),
                                ((Binding)checkCol.Binding).ConverterParameter,
                                ((Binding)checkCol.Binding).ConverterCulture);
                    }
                    gridContent = gridContent + "\t" + value.ToString();
                }
                if (comboCol != null)
                {
                    var propertyName = string.Empty;
                    if (comboCol.SelectedValueBinding != null)
                    {
                        propertyName
                          = ((Binding)comboCol.SelectedValueBinding).Path.Path;
                    }
                    else if (!string.IsNullOrEmpty(comboCol.SelectedValuePath))
                    {
                        propertyName = comboCol.SelectedValuePath;
                    }
                    else if (!string.IsNullOrEmpty(comboCol.DisplayMemberPath))
                    {
                        propertyName = comboCol.DisplayMemberPath;
                    }

                    var value = item.GetType().GetProperty(
                         propertyName).GetValue(
                            item,
                            new object[] { });

                    if (comboCol.SelectedValueBinding != null
                        && ((Binding)comboCol.SelectedValueBinding).Converter != null)
                    {
                        var bnd = (Binding)comboCol.SelectedValueBinding; 
                        value
                            = bnd.Converter.Convert(
                                value,
                                typeof(object),
                                bnd.ConverterParameter,
                                bnd.ConverterCulture);
                    }
                    gridContent = gridContent + "\t" + value.ToString();
                }
                if (templateCol != null)
                {
                    var propertyName = templateCol.SortMemberPath;
                    var value
                        = item.GetType().GetProperty(
                             propertyName).GetValue(
                               item,
                               new object[] { });

                    gridContent = gridContent + "\t" + value.ToString();
                }
            }

            gridContent = gridContent + "\n";
        }

        MessageBox.Show(gridContent);
    }
}
...