Проблема привязки.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