Проблема привязки .Net ComboBox - PullRequest
3 голосов
/ 03 октября 2009

У меня есть 2 комбинированных списка, каждый из которых привязан к одной и той же DataTable следующим образом:

    channelTypeCB.DataSource = SynergyData.ds.Tables["ChannelTypes"];
    channelTypeCB.DisplayMember = "channelType";
    channelTypeCB.ValueMember = "channelTypeID";
    channelTypeCB.BindingContext = new BindingContext();

    newSKChanTypeCB.DataSource = SynergyData.ds.Tables["ChannelTypes"];
    newSKChanTypeCB.DisplayMember = "channelType";
    newSKChanTypeCB.ValueMember = "channelTypeID";
    newSKChanTypeCB.BindingContext = new BindingContext();

Когда я нажимаю кнопку, чтобы вставить запись в базу данных, я использую channelType.SelectedValue ..., который возвращает неправильное значение. У меня есть ощущение, что это как-то связано с использованием сортировки ComboBox (которую я установил в свойствах элемента управления в режиме конструктора). Кто-нибудь сталкивался с этой проблемой?

Это запрограммировано для приложения winforms, используя C #

Edit:

Например, мой Datatable хранит значения вроде:

channelType    channelTypeID
Web             2
Mailer          3
Catalog         4

Это сортируется в выпадающем списке, и когда я выбираю первый элемент (который будет "Каталог" при сортировке), SelectedValue возвращает 2, когда я выбираю второй элемент, он возвращает 3 .... Я бы ожидал Каталог "Вернуть 4

Ответы [ 5 ]

5 голосов
/ 03 октября 2009

MSDN ComboBox.Sorted

Возможно, связано с этим

Попытка установить свойство Sorted на элемент управления с привязкой к данным поднимает ArgumentException. Вы должны отсортировать данные с использованием базовой модели данных.

(однако ошибок не было)

Таким образом, вместо использования ComboBox.sort, я сортирую представление по умолчанию для DataTable:

SynergyData.ds.Tables["ChannelTypes"].DefaultView.Sort = "channelType";

Не уверен, что это лучший способ, но он работает, и теперь selectedValue возвращает правильную вещь

1 голос
/ 03 октября 2009

Я бы сделал это по-другому: я бы создал 2 отдельных BindingSource, каждый на основе вашего DataSet, а затем привязал каждый элемент управления DataSource к соответствующему BindingSource только что созданному.

1 голос
/ 03 октября 2009

Вы можете ссылаться на channelTypeCB.SelectedValue в своем коде, когда вам нужно ссылаться на newSKChanTypeCB.SelectedValue (это общее предположение, основанное исключительно на именах ваших элементов управления).

0 голосов
/ 10 декабря 2013

Проблема заключается в свойстве Sorted ComboBox, поскольку ваши данные поступают из DataTable.

Когда используется свойство Sorted, ComboBox организует только DisplayMember и игнорирует другие данные, поскольку не может напрямую изменять DataTable. Пример:

Данные из DataTable в качестве источника данных без сортировки

channelType   channelTypeID  ComboBoxDisplayMember    ComboboxValueMember
Web            2              Web                       2
Mailer         3              Mailer                    3
Catalog        4              Catalog                   4

теперь с отсортированным свойством

channelType   channelTypeID  ComboBoxDisplayMemberSorted   ComboboxValueMember
Web            2              Catalog                       2
Mailer         3              Mailer                        3
Catalog        4              Web                           4

Эта проблема может быть решена путем добавления базы данных в конце запроса: «ORDER BY FieldName» http://technet.microsoft.com/en-us/library/ms188385.aspx

0 голосов
/ 07 сентября 2011

Это известная проблема в .net

Пожалуйста, подпишите это, чтобы исправить это в .net 5: http://connect.microsoft.com/VisualStudio/feedback/details/542353/combobox-selectedvalue-returns-incorrect-data-when-sorted-is-true

...