我在表单上有多个DropDown样式的ComboBox,用户可以在其中指定哪些单位与值相关联(想想米,英尺等)。为此,我在Settings.Settings中使用一个应用程序字符串集合,其中包含一些默认单元类型,这些单元类型绑定到ComboBox的DataSource,如下所示:
this.cboUnit.DataSource =
(System.Collections.Specialized.StringCollection)Properties.Settings.Default.Units;
用户可以成功选择一个单位或指定一个单位。
现在,当我将this.cboUnit.Text
保存到某个XML配置文件中时,我能够处理这两种情况。打开XML配置文件并执行this.cboUnit.Text = "NonExistentUnit";
将失败,并导致选择集合中的第一个项目。
如何修改ComboBox以支持我要求的行为,而不将项添加到ComboBox或修改DataSource本身?
Using ComboBox.Text when combobox is tied to DataSource中提出了一个解决方案,但我找不到支持此行为的官方文档。出于这个原因,我宁愿避免它。
答案 0 :(得分:1)
我找不到任何有效的方法将项插入绑定的DataSource。所以我最终做了以下事情:
BindingSource bindingSource = new BindingSource((System.Collections.Specialized.StringCollection)Properties.Settings.Default.Units, "");
if(!bindingSource.Contains(someSavedValue))
{
bindingSource.Insert(0, someSavedValue));
}
this.cboUnit.DataSource = bindingSource;
这将创建绑定源的新实例,可以在将其绑定到数据源之前进行修改。我将此代码包装在一个方法中,我可以传入一个字符串集合和存储的值(在这种情况下为savedUnit
),它返回一个新的BindingSource实例。这在我的情况下尤其有用,因为我现在可以简单地写一下:
this.cboLengthUnit.DataSource = CreateBindingSource(unitsCollection, savedLengthUnit);
this.cboWidthUnit.DataSource = CreateBindingSource(unitsCollection, savedWidthUnit);
this.cboHeightUnit.DataSource = CreateBindingSource(unitsCollection, savedHeightUnit);
我在内存中编写了上面的代码,因此可能包含错误。