System.InvalidCastException: System.Data.DataViewManagerListItemTypeDescriptor - PullRequest
1 голос
/ 09 июня 2009

Случайно получаю исключение. У меня есть сканер штрих-кода, который вводит штрих-коды в таблицу. Код написан на C #. Сначала я смог получить исключение дважды; однако, я больше не могу генерировать его. Исключением является System.InvalidCastException: невозможно преобразовать объект типа «System.Data.DataViewManagerListItemTypeDescriptor» в тип «System.Data.DataRowView». Сначала я сгенерировал его, отсканировав 2 разных бутылки с водой, по 2-3 раза в каждой. Затем, когда я нажал кнопку «Сохранить», я получил исключение. Я попробовал Google для исследования, если кто-то еще получил эту ошибку прежде, но не мог найти кого-либо с подобной проблемой в том же контексте. Исключение выдается в следующем сегменте кода:

 foreach (object o in this.theBindingSource.List)
 {
   System.Data.DataRowView dataRowView1 = (System.Data.DataRowView)o;
 }

Очевидно, иногда o имеет тип System.Data.DataViewManagerListItemTypeDescriptor, а не тип System.Data.DataRowView. Есть идеи, почему выбрасывается это исключение?

BindingSource заполняется базой данных:

  XYZDataAccess.TypedDataSets.ABCTag tags
                = XYZDataAccess.DAL.ABCTagDAL.GetABCTags(
                    DeliverySession.DeliverySessionId);
            if (tags != null && tags.Tables[0] != null)
            {
                theBindingSource.Sort = "";
                theBindingSource.DataSource = tags;
            }

Причина, по которой мне пришлось пройтись по источнику привязки, заключается в том, что другой DataGridView должен быть заполнен содержимым источника bindindg; Более того, DataGridView реализовал пользовательскую сортировку данных в элементе управления или представлении. В дополнение к удалению прямого доступа к списку, я должен указать свойство DisplayMember?

1 Ответ

2 голосов
/ 09 июня 2009

System.Data.DataViewManagerListItemTypeDescriptor является допустимым результатом BindingSource, особенно если привязываемый элемент не указывает должным образом .DisplayMember. Есть ли конкретная причина, по которой вы вручную просматриваете источник привязки? Назначение источника привязки состоит в том, что вы можете привязать его к определенным элементам управления и автоматически заполнять их из базы данных.

В любом случае, я не тестировал следующий код, но вам может повезти с:

foreach (object o in this.theBindingSource)
{
    System.Data.DataRowView dataRowView1 = (System.Data.DataRowView)o;
}

BindingSource уже IEnumerable, поэтому вам не нужно иметь прямой доступ к списку.

UPDATE

Вместо циклического просмотра, вы можете сделать что-то вроде этого, чтобы заполнить ваш DataGridView, например:

theBindingSource.DataSource = tags;
yourDataGridView.DataSource = theBindingSource;

Я считаю, что .DisplayMember необходим только для таких вещей, как ListViews, но я не уверен в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...