DisplayMember在DataSource上重置= null

时间:2009-03-13 08:13:42

标签: c# controls user-interface combobox datasource

我有一个ComboBox,其项目是使用DataSource属性设置的。 DataSource是自定义对象的集合(具有字符串属性'Value'和int属性'Id')。在初始化控件中,我将 DisplayMember 设置为,将 ValueMember 设置为 Id 。现在我尝试通过调用

来清除DataSource
myComboBox.DataSource = null;

当我这样做时,我的DisplayMember会自动重置为“”。我正确清理DataSource吗?这是我应该表现的方式吗?

2 个答案:

答案 0 :(得分:3)

我可以重现它......这不是我期望的,但看起来你只需要事后再设置DisplayMember

看着反射器,这是非常有意的:

        if (value == null)
        {
            this.DisplayMember = "";
        }

不确定背后的推理,只是简单地说:

string oldDisplayMember = cbo.DisplayMember;
cbo.DataSource = null;
cbo.DisplayMember = oldDisplayMember;

不漂亮,但它会起作用。

答案 1 :(得分:0)

当抛出异常或数据源值为null时,Displaymember将设置为空字符串。

使用.NET代码反编译器,代码中有关于其工作原理的注释。我会试着解释一下。

在下列情况下可能会引发例外情况:

  1. DataSourceChanged上的应用程序代码
  2. 在格式化显示数据时绑定期间
  3. 如果DisplayMember值在新数据源中无效。
  4. 该评论还提到,实际的例外是“吞下”以防止破坏预期的行为。

    我个人遇到了这种行为,因为没有抛出异常,所以很难弄清楚这些条件中的哪一个导致重置。可能有更好的方法,但现在我在我的自定义控件中使用它。 数据源属性在重置后设置DisplayMember时有效,所以我真的不确定它为什么会失败:

        public new object DataSource
        {
            get { return base.DataSource; }
            set
            {
                string displayMem = this.DisplayMember;
                base.DataSource = value;
                if (string.IsNullOrEmpty(this.DisplayMember) && string.IsNullOrEmpty(displayMem)) 
                    this.DisplayMember = displayMem;
                DetermineDropDownWidth();
            }
        }