2009-08-05 71 views
1

由于支持多租户的遗留数据库,我有一个包含复合键的对象列表。那么我如何将该列表绑定到asp.net中的复选框列表?我们目前使用c#3.5。如何将复合键对象列表绑定到复选框列表?

这里的类:

public class SiteKey 
{ 
    public int Id { get; set; } 
    public int CustomerId { get; set; } 
} 
public class Order 
{ 
    public SiteKey Key { get; set; } 
    public string Name { get; set; } 
} 

我的仓库返回,我想,然后绑定到一个复选框列表的IList<Order>。 此代码:

chkList.DataValueField = "Key"; 
chkList.DataTextField = "Name"; 

正常显示,但回来的值(chkList.Items[0].Value)只包含“MyAssemblyName.SiteKey”,而不是重点。

我该如何有效地完成这项工作?

谢谢!

回答

3

重写SiteKey上的ToString()以返回包含组成主键的属性的字符串表示形式的连接字符串。然后,您必须解析项目的Value属性以检索密钥。

public class SiteKey 
{ 
    public int Id { get; set; } 
    public int CustomerId { get; set; } 

    public override string ToString() 
    { 
     return Id.ToString() + "|" + CustomerId.ToString(); 
    } 
} 

,并在方法检索关键:

string[] siteKey = chkList.Items[0].Value.Split('|'); 
int id = int.Parse(siteKey[0]); 
int customerId = int.Parse(siteKey[1]); 
+0

像一个魅力工作。非常感谢! – 2009-08-05 02:46:04

0

您是否可以修改订单类?使用SiteKey作为值字段返回类型(除非您重写ToString()方法)。

public class Order 
{ 
    public SiteKey Key { get; set; } 
    public int KeyId { get{return Key.Id;} } 
    public string Name { get; set; } 
} 

chkList.DataValueField = "KeyId"; 
chkList.DataTextField = "Name"; 
2

杰米的建议是好的,但并不是覆盖的ToString(),我只是想突出你的IList <订单>到IEnumerable的<列表项>之前绑定:

即:

 
var items = 
    from o in dataList // dataList being IList returned from repository 
    select new ListItem(o.Name, 
         String.Format("{0}|{1}", 
             o.Key.Id, o.Key.CustomerId)); 

// ... bind items to dropdown ... 

我更喜欢这个,而不是重写ToString(),因为ToString()是通用的并且在任何地方都可以使用,因此可以是屁股疼痛,而这是本地修改,不会影响其他任何内容。

相关问题