Особенности связки ComboBox с DataTable и ошибка с System.Data.DataRowView

Программисты - существа капризные и непредсказуемые. Иногда у них возникает желание заполнить ComboBox данными из DataTable вручную, не используя визуальную среду. Делается это следующим образом:

someComboBox.DataSource = someDataTable;
someComboBox.DisplayMember = "FIELD_TO_DISPLAY";
someComboBox.ValueMember = "FIELD_TO_HIDE";

Не заполнив DisplayMember и ValueMember можно получить совершенно невнятную ошибку - ComboBox будет заполнен строками "System.Data.DataRowView" (подробнее на StackOverFlow).

Так же ее можно получить, попытавшись прочитать выбранное значение до установки свойства DisplayMember - на самом деле это не так уж и сложно, установка значения DataSource вызывает событие SelectedIndexChanged - на которое нередко вешается обработка.

Еще один возможный случай возникновения этой ошибки - привязка пустой таблицы без колонок, такое может случиться если структура таблицы автоматически создается методом DataAdapter.Fill(). В таком случае надо заранее создать таблицу с нужным набором колонок или использовать строго типизированный DataSet.

Если же мы хотим получить именно текст выбранного в ComboBox пункта, то надо использовать не кажущееся самоочевидным свойство SelectedText, а просто Text.

Глядя на свойства SelectedItem, SelectedIndex и SelectedValue начинающий программист может подумать, что SelectedText так же содержит текст выбранного пункта, но на самом деле оно содержит выделенную мышкой часть текста выбранного пункта - и в большинстве случаев пустое, а если свойство DropDownStyle имеет значение DropDownList - то SelectedText будет пустым всегда.


Комментарии

Особенности связки ComboBox с DataTable и ошибка с System.Data.DataRowView — Комментарии (3)

Добавить комментарий для Андрей Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>