【问题标题】:.Net ComboBox Binding Issue.Net ComboBox 绑定问题
【发布时间】:2009-10-03 02:19:07
【问题描述】:

我有 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 排序(我在设计视图中的控件属性中设置)有关。有人遇到过这个问题吗?

这是使用 C# 为 winforms 应用程序编写的

编辑:

例如,我的 Datatable 存储如下值:

channelType    channelTypeID
Web             2
Mailer          3
Catalog         4

这是在组合框中排序的,当我选择第一项(排序时将是“目录”)时,SelectedValue 返回 2,当我选择第二项时,它返回 3....目录”返回 4

【问题讨论】:

  • 你说的“返回不正确的值”是什么意思?
  • 例如,我在组合框中选择了一项,而 channelType.SelectedValue 肯定没有返回正确的一项...这会将数据插入我的数据库,并将它们放在错误的类别中(我三倍检查数字)

标签: .net combobox sorting selectedvalue


【解决方案1】:

MSDN ComboBox.Sorted

可能与此有关

尝试设置 Sorted 属性 在数据绑定控件上引发 参数异常。您必须对 使用底层数据模型的数据。

(虽然没有收到任何错误)

所以我没有使用 ComboBox.sort,而是对 DataTable 的 DefaultView 进行排序:

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

不相信这是最好的方法,但它有效,现在 selectedValue 返回正确的东西

【讨论】:

    【解决方案2】:

    当您需要引用 newSKChanTypeCB.SelectedValue 时,您可能会在代码中引用 channelTypeCB.SelectedValue(这完全是基于您的控件名称的猜测)。

    【讨论】:

    • 肯定引用了正确的(channelTypeCB.SelectedValue)...它几乎就像 DisplayMember 正在排序但 ValueMember 没有
    • 尝试注释掉“.BindingContext = New BindingContext();”线。不确定这是在做什么,但它可能正在删除正常的 BindingContext(有效的)和一个无效的空。
    • 事实上,这正是它在做什么......我原以为它只在 DisplayMember 上排序? ... ValueMember 是单独排序的?
    • 我必须创建一个新的 BindingContext,这样当我在一个组合框上更改 selectedindex 时,另一个组合框不会显示相同的内容(我在 MS 的某个人的帖子中看到它是这样做的)
    • @Chris:ComboBox 绝不应该将 DisplayMembers 与 ValueMembers 分开排序。只有 Excel 会做这样的事情。
    【解决方案3】:

    我会采取不同的做法:我将创建 2 个单独的 BindingSource,每个都基于您的 DataSet,然后将每个控件 DataSource 绑定到刚刚创建的相应 BindingSource

    【讨论】:

    • 刚刚更新了我的代码以使用它,没有解决 selectedIndex 问题,但感谢您的建议。
    【解决方案4】:

    这是 .net 中的一个已知问题

    请对此进行投票以使其在 .net 5 中得到修复: http://connect.microsoft.com/VisualStudio/feedback/details/542353/combobox-selectedvalue-returns-incorrect-data-when-sorted-is-true

    【讨论】:

      【解决方案5】:

      问题在于 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/en-us/library/ms188385.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-11
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 2014-08-24
        • 2012-11-29
        • 2015-06-24
        • 1970-01-01
        相关资源
        最近更新 更多