Проблема привязки.Net ComboBox

У меня есть 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#

Редактировать:

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

channelType    channelTypeID
Web             2
Mailer          3
Catalog         4

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

5 ответов

Решение

MSDN ComboBox.Sorted

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

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

(Не было никаких ошибок, хотя)

Поэтому вместо использования ComboBox.sort я сортирую DefaultView для DataTable:

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

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

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

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

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

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

Проблема заключается в свойстве 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

Другие вопросы по тегам