Невозможно преобразовать объект типа AnonymousType в System.Data.DataRowView в WPF

Я новичок в WPF. Я пытаюсь прочитать выбранные элементы Datagrid с помощью DataRow/DataRowView. Мой код следующий:

foreach (System.Data.DataRowView row in dgDocument.SelectedItems)
  {
    txtPhotoIDNo.Text = row["PhotoIdNumber"].ToString();
  }

но я столкнулся со следующей ошибкой -

«Невозможно преобразовать объект типа «‹>f__AnonymousTypeb11[System.String,System.Byte,System.String,System.String,System.String,System.Byte[],System.Nullable1[System.DateTime],System.String,System.Nullable`1[System.DateTime],System.String,System.String]» в тип «System.Data.DataRowView» ."

Когда я пытаюсь использовать следующий путь, это работает нормально.

(dgDocument.SelectedCells[2].Column.GetCellContent(item) as TextBlock).Text;

Проблема в том, что когда мне нужно было добавить новый столбец/изменить положение столбца в сетке данных, мне нужно было изменить индекс для всего назначенного значения. Чтобы решить эту проблему, я хочу присвоить значение вышеупомянутым способом с именем столбца.


person Osman    schedule 02.04.2016    source источник
comment
Элемент управления DataGrid не имеет ничего общего с System.Data / DataTable и т. д. Свойство SelectedItems содержит фактические объекты, которые вы добавили в сетку (которые в данном случае кажутся анонимными типами). Вы должны изучить привязку данных - вы не должны пытаться установить текст прямо так.   -  person Charles Mager    schedule 02.04.2016
comment
Пожалуйста! Приведите пример.   -  person Osman    schedule 02.04.2016


Ответы (3)


Содержимое списка SelectedItems будет иметь тип, привязанный к вашему DataGrid. Так, например, если у меня есть свойство List DataSource в моем отделенном коде, и я привязываю этот список к ItemsSource сетки данных:

<DataGrid x:Name="grid" ItemsSource={Binding DataSource) />

grid.SelectedItems вернет мне список строк.

В вашем случае ItemsSource DataGrid привязан к какому-то анонимному типу. Хотя я обычно не рекомендую использовать анонимные типы в этом конкретном случае, обходной путь для вас будет следующим:

foreach (dynamic item in dgDocument.SelectedItems)
  {
    txtPhotoIDNo.Text = Convert.ToString(item.???);
  }

Вам нужно заменить ??? с именем свойства из анонимного класса, содержащего данные, которые вы хотите поместить в txtPhotoIDNo.

person Nick Sologoub    schedule 02.04.2016

Наконец-то я нашел свою проблему. То есть два значения моих SelectedItems были нулевыми. По этой причине пара значений ключа не подготавливается идеально. Следующий код работает отлично.

foreach (System.Data.DataRowView row in dgDocument.SelectedItems)
  {
    txtPhotoIDNo.Text = row["PhotoIdNumber"].ToString();
  }
person Osman    schedule 02.04.2016

 foreach (dynamic row in dgBarDetails.ItemsSource)
 { 
  myList.Add(row);
 }

в моем случае строка — это объект моего класса, используемый для заполнения ItemsSource. Это может быть int или строка или что-то еще, что у вас есть в ItemsSource.

person Bianca Kalman    schedule 30.11.2016