C# 如何绑定组合框,使displaymember是源datatable的两个字段的集合?

C# 如何绑定组合框,使displaymember是源datatable的两个字段的集合?,c#,data-binding,combobox,C#,Data Binding,Combobox,我想将组合框绑定到数据表(我无法更改其原始架构) 我想要组合框显示tbldata.Name+tbldata.姓氏 当然,在绑定成为可能之前,将新的名称+姓氏作为字段添加到tbldata,但我希望有一个更优雅的解决方案(伪代码) 我会在数据对象上创建一个属性,然后将其映射到DataTextField 数据对象 public string FullName { get { return Name + " " + Surname; } } 代码隐藏 cbo.DataSource = tbldat

我想将
组合框
绑定到
数据表
(我无法更改其原始架构)

我想要
组合框
显示
tbldata.Name+tbldata.姓氏

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


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

数据对象

public string FullName
{
  get { return Name + " " + Surname; }
}
代码隐藏

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

在类中有一个属性,它是名称和姓氏的concat。并将DataTextField绑定到此属性


如果要将其绑定到DataTable,可以向DataTable添加一个新列,该列的值为名称和姓氏的concat,并将其绑定到组合。

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

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

使用DataColumn属性查看计算列。

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

计算列解决方案可能是最好的解决方案。但是,如果您不能通过更改数据表的模式来添加它,那么您可以在该表中循环并填充一个新的集合,该集合将用作数据源

var dict = new Dictionary<Guid, string>();
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();
var dict=newdictionary();
foreach(数据行中的数据行)
{
dict.Add(行[“GUID”]、行[“Name”]+“”+行[“姓氏]);
}
cbo.DataSource=dict;
cbo.DataTextField=“值”;
cbo.DataValueField=“Key”;
cbo.DataBind();

显然,这不如直接绑定到DataTable的性能好,但我不会担心这一点,除非该表有数千行。

或实现如下“格式”事件:

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

我同意,想不出其他方法,因为这只是一个简单的用途,使用类作为基础是过分的。我喜欢这比人们不断提出的关于修改数据对象和创建新属性的建议要好得多。非常有用!谢谢。格式化事件在哪里?@Tangmank,格式化事件在ComboBox类中。请看这里:
var dict = new Dictionary<Guid, string>();
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();
DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];