【问题标题】:ComboBox Items Empty but DataSource Full组合框项为空但数据源已满
【发布时间】:2012-08-03 12:50:24
【问题描述】:

将列表绑定到组合框后,其 dataSource.Count 为 5,但组合框项计数为 0。 怎么会这样?

我习惯于 Web 编程,这是在 Windows 窗体中。 所以不存在combo.DataBind(); 方法。

这里的问题是,我正在尝试以编程方式设置所选项目。由于我没有看到 combo.Items 集合已填充,因此我无法设置所需的项目。


更新

我猜需要全面更新:

  • 数据源包含 7 项
  • 当绑定到组合框时,DisplayMemberValueMember 会得到适当的实现
  • 数据绑定后,通过gui,我可以清楚的看到combobox中的7项
  • combobox.DataSource.Count = 7combobox.Items.Count = 0

所以问题就在这里;因为在数据绑定之后,组合框的 ItemCollection 中没有任何项目;我无法搜索一个匹配并设置合适的。

这是一个更好理解的图像(但我很确定我错过了一些简单的东西)

【问题讨论】:

  • 您是否相应地设置了DataTextFieldDataValueField
  • DisplayMemberValueMember。 DataSource 中的数据类型是什么?
  • 是的,也许这个问题并不完全可以理解。数据绑定事件成功运行,我可以通过 gui 在组合中看到我的项目。问题是,在调试中;在数据源分配之后,组合框不包含 Items 集合中的某些内容。就像在渲染之后一样,所有的项目都显示出来了,但在那之前什么都没有。
  • 当您创建一个新的BindingSource 时,所有的绑定都会独立于使用相同数据源的位置发生。即使您已将数据源绑定到 4 个其他控件,如果每个控件都有自己的 BindingSource 实例,它们每个都有自己的内部 BindingContext 来处理与该特定控件相关的状态/位置/事件。您只是通过明确告诉 ComboBox 使用新的 BindingContext 而不是让 BindingSource 处理它来解决它。
  • 废话,抱歉,不是内部BindingContext,而是内部CurrencyManager。刚看了一下源码。无论哪种方式,它都应该为每个使用的BindingSource 单独处理事件,因为它有自己的CurrencyManager(同样,它在 BindingSource 本身中为指定的 DataSource 处理状态表示,即使 DataSource 在其他地方使用)。

标签: c# winforms combobox


【解决方案1】:

BindingSource 分配之前添加ddl.BindingContext = new BindingContext(); 后,一切正常。

【讨论】:

  • 第一次使用数据源时一切正常。一旦您第二次使用数据源,您还需要重用 bindingcontext 或像您一样创建一个新的。
【解决方案2】:

如果您在调试器中展开 DataSource 项,您可能会注意到列表中的第一个元素为空。这就是 DataSource 不呈现 ComboBox 项的原因。从列表中删除空项目应该完成所有工作;

【讨论】:

    【解决方案3】:

    我有同样的问题,但在我的情况下,它是由调用引起的

    combobox.Sorted = True
    

    InitializeComponent。我猜这个调用会初始化Items,然后阻止分配给DataSource 的更新它(Items)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 2016-06-12
      • 2019-10-10
      • 2015-03-03
      • 1970-01-01
      相关资源
      最近更新 更多