我想将ComboBox
绑定到DataTable
(我无法更改其原始架构)
cbo.DataSource = tbldata;
cbo.DataTextField = "Name";
cbo.DataValueField = "GUID";
cbo.DataBind();
我希望ComboBox
显示tbldata.Name + tbldata.Surname
。
当然可以在绑定之前将新名称+姓氏作为字段添加到tbldata
,但我希望有更优雅的解决方案(伪代码)
cbo.DataTextField = "Name";
cbo.DataTextField += "Surname";
答案 0 :(得分:26)
计算出的列解决方案可能是最好的。但是,如果您无法更改数据表的架构以添加该架构,则可以遍历该表并填充将用作数据源的新集合。
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();
显然,这不像直接绑定到DataTable一样高效,但我不担心,除非该表有数千行。
答案 1 :(得分:18)
最简单的方法是使用Expression属性在DataTable中创建一个新的计算列:
tbldata.Columns.Add("FullName", typeof(string), "Name + ' ' + Surname");
...
cbo.DataTextField = "FullName";
答案 2 :(得分:5)
我会在您的数据对象上创建一个属性,然后将其映射到DataTextField
数据对象
public string FullName
{
get { return Name + " " + Surname; }
}
<强>代码隐藏强>
cbo.DataSource = tbldata;
cbo.DataTextField = "FullName";
cbo.DataValueField = "GUID";
cbo.DataBind();
答案 3 :(得分:3)
或者像这样实现'Format'事件:
DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];
答案 4 :(得分:2)
在您的班级中拥有一个属性,即Name和Surname的连接。并将DataTextField绑定到此属性。
如果要将其绑定到DataTable,可以向DataTable添加一个新列,其值为Name和Surname的concat,并将其绑定到组合。
答案 5 :(得分:1)
使用DataColumn的Expression属性查看计算列。
答案 6 :(得分:0)
您可以注册组合绑定事件并迭代项目,使用组合框项目数据项将每个项目文本设置为所需的字段。