2009-06-17 29 views
21

我想绑定ComboBoxDataTable(我不能改变其原来的架构)如何绑定ComboBox,以便displaymember是源数据表的2个字段的连续字符串?

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

我想ComboBox显示tbldata.Name + tbldata.Surname

过程中添加的新名称+姓作为一个领域的tbldata只是结合之前是可能的,但我希望为沿(伪)的线条更为优雅的解决方案

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

回答

25

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

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的高性能,但我不会担心,除非表有几千行。

5

我会创造您的数据对象上的属性,然后是映射到DataTextField

数据对象

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

代码隐藏

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

有在你的类中的属性是名和姓的CONCAT。并将DataTextField绑定到此属性。

如果你将它绑定到一个DataTable,你可以添加一个新的列到DataTable,它的值是Name和Surname的连接并将它绑定到组合。

+0

我同意,不能想别的办法 – AlexDrenea 2009-06-17 11:54:25

+0

由于这是一个简单的只使用,使用类作为基础,这是矫枉过正。 – callisto 2009-06-17 12:17:59

+0

我的意思是如果一个班级已经在使用。 – 2009-06-17 12:37:31

17

最简单的方法是创建在数据表中的新计算列,使用表达式属性:

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

我比人们对修改数据对象和创建新属性的建议要好得多。 – TheTXI 2009-06-17 12:10:19

0

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

2

或实施“格式”事件是这样的:

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