我有一个 ComboBox,其项目是使用 DataSource 属性设置的。DataSource 是自定义对象的集合(具有字符串属性 'Value' 和 int 属性 'Id')。在初始化控件中,我将DisplayMember设置为Value并将ValueMember设置为Id。现在我试图通过调用清除数据源,
myComboBox.DataSource = null;
当我这样做时,我的 DisplayMember 会自动重置为“”。我是否正确清除了数据源?这是我应该表现的方式吗???
我有一个 ComboBox,其项目是使用 DataSource 属性设置的。DataSource 是自定义对象的集合(具有字符串属性 'Value' 和 int 属性 'Id')。在初始化控件中,我将DisplayMember设置为Value并将ValueMember设置为Id。现在我试图通过调用清除数据源,
myComboBox.DataSource = null;
当我这样做时,我的 DisplayMember 会自动重置为“”。我是否正确清除了数据源?这是我应该表现的方式吗???
我可以重现它......这不是我所期望的,但看起来你只需要在DisplayMember之后设置背部。
查看反射器,这是非常有意的:
if (value == null)
{
this.DisplayMember = "";
}
不确定其背后的原因,但很简单:
string oldDisplayMember = cbo.DisplayMember;
cbo.DataSource = null;
cbo.DisplayMember = oldDisplayMember;
不漂亮,但它会工作。
当抛出异常或 Datasource 值为 null 时,Displaymember 设置为空字符串。
使用 .NET 代码反编译器,代码中有关于其工作原理的注释。我会试着解释一下。
在以下情况下可能会抛出异常:
该评论还提到实际的异常被“吞下”以防止破坏预期的行为。
我个人遇到了这种行为,因为没有抛出异常,所以很难弄清楚这些条件中的哪一个导致了重置。可能有更好的方法,但现在我在自定义控件中使用它。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();
}
}