如何绑定ComboBox,以便displaymember是源数据表的2个字段的连续符号?

我想将ComboBox绑定到DataTable (我无法改变其原始架构)

 cbo.DataSource = tbldata; cbo.DataTextField = "Name"; cbo.DataValueField = "GUID"; cbo.DataBind(); 

我想要ComboBox show tbldata.Name + tbldata.Surname

当然可以在绑定之前将新名称+姓氏作为字段添加到tbldata ,但我希望有一个更优雅的解决方案(伪代码)

 cbo.DataTextField = "Name"; cbo.DataTextField += "Surname"; 

计算出的列解决方案可能是最好的。 但是,如果您无法更改数据表的架构以添加该架构,则可以遍历该表并填充将用作数据源的新集合。

 var dict = new Dictionary(); foreach (DataRow row in dt.Rows) { dict.Add(row["GUID"], row["Name"] + " " + row["Surname"]); } cbo.DataSource = dict; cbo.DataTextField = "Value"; cbo.DataValueField = "Key"; cbo.DataBind(); 

显然这不像直接绑定到DataTable那样高效,但我不担心,除非表有数千行。

最简单的方法是使用Expression属性在DataTable中创建一个新的计算列:

 tbldata.Columns.Add("FullName", typeof(string), "Name + ' ' + Surname"); ... cbo.DataTextField = "FullName"; 

我会在您的数据对象上创建一个属性,然后将其映射到DataTextField

数据对象

 public string FullName { get { return Name + " " + Surname; } } 

代码隐藏

 cbo.DataSource = tbldata; cbo.DataTextField = "FullName"; cbo.DataValueField = "GUID"; cbo.DataBind(); 

在你的class级中有一个属性,名称和姓氏的连续性。 并将DataTextField绑定到此属性。

如果要将其绑定到DataTable,则可以向DataTable添加一个新列,其值为Name和Surname的concat,并将其绑定到组合。

或者像这样实现’Format’事件:

 DataRow r = ((DataRowView)e.ListItem).Row; e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ]; 

使用DataColumn的Expression属性查看计算列。

您可以注册组合绑定事件并迭代项目,使用combobox项目数据项将每个项目文本设置为所需的字段。