9

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

myComboBox.DataSource = null;

当我这样做时,我的 DisplayMember 会自动重置为“”。我是否正确清除了数据源?这是我应该表现的方式吗???

4

2 回答 2

4

我可以重现它......这不是我所期望的,但看起来你只需要在DisplayMember之后设置背部。

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

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

不确定其背后的原因,但很简单:

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

不漂亮,但它会工作。

于 2009-03-13T08:19:51.900 回答
0

当抛出异常或 Datasource 值为 null 时,Displaymember 设置为空字符串。

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

在以下情况下可能会抛出异常:

  1. DataSourceChanged 上的应用程序代码
  2. 在数据被格式化以显示时的绑定期间
  3. 如果 DisplayMember 值在新数据源中无效。

该评论还提到实际的异常被“吞下”以防止破坏预期的行为。

我个人遇到了这种行为,因为没有抛出异常,所以很难弄清楚这些条件中的哪一个导致了重置。可能有更好的方法,但现在我在自定义控件中使用它。Datasource 属性在重置后设置 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();
        }
    }
于 2015-07-06T21:51:42.470 回答