.NET ComboBox 绑定问题

3

我有两个下拉框,它们都绑定到同一个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排序有关(我在设计视图中的控件属性中设置了排序)。有人遇到过这个问题吗?
这是一个使用C#编写的winforms应用程序。
编辑:
例如,我的Datatable存储以下值:
channelType    channelTypeID
Web             2
Mailer          3
Catalog         4

这是在下拉框中进行排序的,当我选择第一个项目(在排序时应该是“目录”)时,SelectedValue返回2,而当我选择第二个项目时,它返回3... 我本来期望“目录”返回4。


当你说“返回错误的值”时,你是什么意思? - Mitch Wheat
例如,我在组合框中选择一个项目,但channelType.SelectedValue明显没有返回正确的项目...这会将数据插入到我的数据库中,并将它们放入错误的类别中(我三次检查了数字)。 - Chris Klepeis
5个回答

5

MSDN ComboBox.Sorted

这可能与以下内容有关

尝试在数据绑定的控件上设置 Sorted 属性会引发 ArgumentException。您必须使用底层数据模型对数据进行排序。

(虽然没有出现任何错误)

因此,我不使用 ComboBox.sort,而是对 DataTable 的 DefaultView 进行排序:

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

我并不确定这是最佳的做法,但它有效,并且现在selectedValue返回了正确的结果。


1
你的代码中可能在引用channelTypeCB.SelectedValue,当你需要引用newSKChanTypeCB.SelectedValue(这只是基于你控件名称的猜测)。

肯定引用了正确的(channelTypeCB.SelectedValue)... 就好像 DisplayMember 被排序了,但 ValueMember 没有。 - Chris Klepeis
尝试将“.BindingContext = New BindingContext();”这行代码注释掉。不确定它的作用是什么,但它可能会用一个无法工作的空绑定上下文替换正常的绑定上下文(那个可以工作的)。 - MusiGenesis
实际上这正是它正在做的...我本以为它只会按照 DisplayMember 进行排序?...ValueMember 是单独排序的吗? - Chris Klepeis
我必须创建一个新的BindingContext,以便当我更改一个组合框上的selectedindex时,另一个组合框不会显示相同的内容(我在MS的某个帖子中看到了这样的方法)。 - Chris Klepeis
@Chris:ComboBox绝不应该将DisplayMembers与ValueMembers分开排序。只有Excel才会这样做。 - MusiGenesis
@Chris:我认为更好的方法是将第二个ComboBox绑定到一个不同的DataTable,该DataTable从第一个DataTable进行Clone()。 - MusiGenesis

1
我会用不同的方式来做:我会创建两个独立的BindingSource,每个都基于你的DataSet,然后将每个控件的DataSource绑定到刚刚创建的相应的BindingSource

刚刚更新了我的代码以使用这个,虽然没有解决selectedIndex的问题,但还是感谢你的建议。 - Chris Klepeis


0
问题出在ComboBox的Sorted属性上,因为您的数据来自DataTable。
当使用Sorted属性时,ComboBox仅组织DisplayMember并忽略其他数据,因为它无法直接修改DataTable。例如:
来自DataTable的数据作为未排序的DataSource
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/zh-cn/library/ms188385.aspx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接