如果使用DataBinding,Combobox不允许输入自定义文本

Stu*_*ens 16 c# data-binding combobox winforms


我有以下课程:

class Address
{
     public string City {get; set;}
     public string Street {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我有一个带有2个组合框的表格.我将这些组合框绑定到Address类:

CityComboBox.DataSource = GetCityDataSource();
StreetComboBox.DataSource = GetStreetDataSource();
Address address = new Address();
CityComboBox.DataBindings.Add("SelectedItem", address, "City");
StreetComboBox.DataBindings.Add("SelectedItem", address, "Street");
Run Code Online (Sandbox Code Playgroud)

城市和街道数据库不完整,因此有时用户应将自定义值写入组合框.问题是 - 组合框数据绑定不允许将自定义值写入此组合框.这种行为有解决方法吗?
提前致谢!

Sim*_*n S 14

这有效:(在您的情况下)

设置DrowdownStyleDropdown并绑定到ComboBox的Text属性而不是SelectedItem.

对于这两个组合框,你似乎想文本的约束CityStreet该实例的属性Address类.你似乎想要追加的任何物品List<string>被退回GetCityDataSource()GetStreetDataSource()方法.

因此,由于下面绑定的Text 目标属性不与与您的数据源关联的(不可更改的)项集合纠缠在一起,因此以下修改应使您的代码正常工作:(我已使用VS 2010验证了下面代码更改的本质).

 CityComboBox.DataSource = GetCityDataSource(); 
 StreetComboBox.DataSource = GetStreetDataSource(); 
 Address address = new Address(); 
 CityComboBox.DropDownStyle = ComboBoxStyle.DropDown
 CityComboBox.DataBindings.Add("Text", address, "City");
 StreetComboBox.DropDownStyle = ComboBoxStyle.DropDown
 StreetComboBox.DataBindings.Add("Text", address, "Street");
Run Code Online (Sandbox Code Playgroud)

PS!只有当您想要使用City和Street数据进行简单的UI 指导时,上述方法才有效.您没有在地址数据和注册地址的对象之间建立永久关系.如果要保持数据规范化,则希望将外键存储到City,Street(可能还有Zipcode)表中的条目.

随着用户定义的城市和街道名称,你会得到大量的模糊数据(例如Washington DC,WASHINGTON D.C.,St. Patricks rd.,Saint Patrick's road等),这在未来将难以利用执行SQL查询 WHERE Street = [something].使用标准化数据,您只需执行一次WHERE StreetID = [specificID].

编辑

如果您尝试在同一个UI对话框中同时执行两项操作(选择街道和城市,例如人员/公司资料以及 维护应用程序的内部街道和城市列表),那么您必须使用一种不同的方法.

最简单的可能是在组合框旁边添加"新城市"和"新街道"按钮,并在用户在对话框中提供正确的输入时更新组合框的数据源.

您还可以使用字符串"[add New]"向组合框数据源添加虚拟条目,并在选择此项目时使用特殊处理.由于这种方法涉及篡改组合的源列表,因此很容易变得有点混乱.

示例应用程序

带有List<string>数据绑定ComboBox的示例表单,它使用数据源

在此输入图像描述

选择预定义街道后的关键属性

在此输入图像描述

选择自定义街道后的关键属性

在此输入图像描述