【问题标题】:DisplayMember not always being set in the CheckedListBoxDisplayMember 并不总是在 CheckedListBox 中设置
【发布时间】:2012-07-27 07:30:24
【问题描述】:

我有一个 CheckedListBox,我使用自定义“DBitemtype”对象列表填充,我首先设置 DataSource,然后设置 CheckedListBox“clbItemType”的 DisplayMember 和 ValueMember 属性。现在在运行时,用户可以选择更改项目,所以我有一个事件,通过首先将 DataSource 设置为 null,然后将 DataSource 设置为新列表,将 CheckedListBox 与相同“DBitemtype”对象的不同列表重新绑定,然后将 DisplayMember 和 ValueMember 属性再次设置为完全相同的值,如下所示:

clbItemType.DataSource = null;
clbItemType.DataSource = _SelectedItemTypes;  // A List<DBitemtype>
clbItemType.DisplayMember = DBitemtype.Columns.ItemName;  // String constant - value "ItemName"
clbItemType.ValueMember = DBitemtype.Columns.ID;          // String constant - value "ID"
clbItemType.Refresh();

用于 DisplayMember 和 ValueMember 的字符串常量都描述了 DBitemtype 类中的公共字符串属性。

我遇到的问题是,有时 DisplayMember 会设置为“ItemName”,有时它不会设置为“”,当我单步执行代码时它会保持为“”。我似乎无法找到一种模式来解释为什么它只偶尔发生。没有错误或异常被抛出。

我能找到的是“如果无法设置 DisplayMember 的新值,则保留以前的值。”来自这里的msdn文章CheckedListBox.DisplayMember Property

所以我猜这是一个两部分的问题:

1) 有其他人遇到过这个问题吗?

2) 哪些条件会导致 DisplayMember 无法设置?

【问题讨论】:

  • 当您尝试键入“DisplayMember”时,您是否注意到 IntelliSense 不太配合?查看 CheckedListBox.DisplayMember 的 MSDN 文章并阅读“注意”:You cannot bind data to a CheckedListBox
  • @HansPassant 是的,我注意到 IntelliSense 不合作。但是,这些属性确实存在,如果您阅读 MSDN 文章 CheckedListBox.DisplayMember for .NET Framework 4.0 或 3.5(不是 3.0 或更早版本),您所指的注释不存在。

标签: c# visual-studio-2010 checkedlistbox


【解决方案1】:

可能看起来一样,但是:

clbItemType.DataSource = _SelectedItemTypes;  // A List<DBitemtype>
clbItemType.DisplayMember = DBitemtype.Columns.ItemName;  // String constant - value "ItemName"
clbItemType.ValueMember = DBitemtype.Columns.ID;          // String constant - value "ID"

不等于:

clbItemType.DisplayMember = DBitemtype.Columns.ItemName;  // String constant - value "ItemName"
clbItemType.ValueMember = DBitemtype.Columns.ID;          // String constant - value "ID"
clbItemType.DataSource = _SelectedItemTypes;  // A List<DBitemtype>

首先设置您的成员,然后更改您的数据源。更改数据源将触发事件触发器,然后返回代码块。

【讨论】:

  • 这对我不起作用,只要在建议的最后一行中设置了 DataSource,它就有效地将 DisplayMember 的值清除为 ""。
【解决方案2】:

我不确定这是否有帮助,但我确实发现 DisplayName 不喜欢公共字段 (public int x;),只喜欢公共属性 (public int x { get; set; };)。

因此,我会尝试确保 ItemName 或任何其他潜在的 DisplayName 值实际上是 DBitemtype 的公共属性。

【讨论】:

    猜你喜欢
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2012-09-18
    • 2012-01-18
    • 2019-04-04
    • 1970-01-01
    相关资源
    最近更新 更多