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