如何将ComboBox文本设置为不在DataSource(C#)中的值?

时间:2014-02-03 20:55:53

标签: c# winforms combobox

我在表单上有多个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中提出了一个解决方案,但我找不到支持此行为的官方文档。出于这个原因,我宁愿避免它。

1 个答案:

答案 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);

我在内存中编写了上面的代码,因此可能包含错误。