2009-12-15 64 views
2

我有一些基本的下拉列表数据绑定代码。我需要在运行时修改数据源并插入一个新字段。动态添加字段到C#中的集合?

ddlPrimaryCarrier.DataSource = FinancialInstitutions; 
      ddlPrimaryCarrier.DataValueField = "EntityCode"; 
      ddlPrimaryCarrier.DataTextField = "EntityNameDesc"; 
      ddlPrimaryCarrier.DataBind(); 

我其实想要添加一个字段到描述和代码的格式化字符串集合。像...

var newField = string.Format("({0}) - {1}", "EntityCode", "EntityNameDesc"); 

然后

ddlPrimaryCarrier.DataTextField = "newField"; 

什么是做这种正确的方法是什么?我可以循环访问现有的集合并使用我需要的字段创建一个匿名类型的新列表吗?任何人都有如何做到这一点的例子?

感谢, 〜CK在圣地亚哥

+0

FinancialInstitutions是什么类型? – 2009-12-15 17:43:16

+0

什么类型的数据源/列表/集合是FinancialInstitutions?从数据库中选择实体代码+实体代码时,连接它们可能更容易。 – ZimSystem 2009-12-15 17:43:24

+0

VAR newDatasource = FinancialInstitutions.Select( C => 新 { 代码= c.EntityCode, 描述=的String.Format( “({0}) - {1}”,c.EntityCode,c.EntityNameDesc ) }); 我走了,这似乎是好的。 – Hcabnettek 2009-12-15 17:44:25

回答

0

假设FinancialInstitutionsFinancialInstitution对象的集合,一个新的属性添加到您的FinancialInstitution类:

public string DisplayName 
{ 
    get { return string.Format("({0}) - {1}", EntityCode, EntityNameDesc); 
} 

如果是DataTable,你可以添加一个计算列:

FinancialInstitutions.Columns.Add("DisplayName", typeof(string), "'(' + EntityCode + ') - ' + EntityNameDesc"); 

在两种情况下,设置ComboBoxDisplayMember改为“DisplayName”

1

这里最简单的方法是将一个属性添加到该类型。如果这是发生(也许EF等),然后使用partial class

namespace Whatever { 
    partial class FinancialInstitution { 
     public string EntityCaption { 
      get {return "(" + EntityCode + ") - " + EntityNameDesc; 
     } 
    } 
} 

如果这是一个DataTable,你可以添加一个计算列。如果这是您控制范围之外的类型,则可能使用(使用自定义类型描述符(通过TypeDescriptionProvider)直接执行此操作),但它非常困难。我不希望再封装例如,添加直通模仿封装类的属性,并添加新的:

class MyShim { 
    private readonly FinancialInstitution inner; 
    public MyShim(FinancialInstitution inner) {this.inner = inner;} 
    public string EntityCode { get {return inner.EntityCode;}} 
    public string EntityNameDesc { get {return inner.EntityNameDesc;}} 
    public string EntityCaption { 
     get {return "(" + EntityCode + ") - " + EntityNameDesc; 
    } 
} 

并绑定到垫片来代替。