2009-08-05 7 views
1

Ich habe eine Liste von Objekten, die einen zusammengesetzten Schlüssel enthalten, aufgrund der Legacy-Datenbank, die Multi-Tenancy unterstützt. Wie kann ich diese Liste dann an eine Checkbox-Liste in asp.net binden? Wir verwenden derzeit C# 3.5.Wie binde ich eine Liste von Objekten mit Composite-Key an eine Checkbox-Liste?

Hier ist die Klasse:

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; } 
} 

Mein Repository ein IList<Order> zurückgibt, das möchte ich dann auf eine Checkbox-Liste binden. Dieser Code:

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

richtig angezeigt, aber der Wert (chkList.Items[0].Value) Rückweg enthält einfach "MyAssemblyName.SiteKey" und nicht der Schlüssel.

Wie kann ich dies effektiv erreichen?

Danke!

Antwort

3

Aufschalten toString() auf SiteKey einen verketteten Zeichenfolge enthält Zeichenfolge Darstellungen der Eigenschaften zurückzugeben, die die Primärschlüssel bilden. Sie müssen dann die Value-Eigenschaft des Elements analysieren, um die Schlüssel abzurufen.

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

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

und in der Methode, die ruft den Schlüssel:

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

arbeitete wie ein Charme. Danke vielmals! –

0

Können Sie die Order-Klasse ändern? Wenn Sie SiteKey als Wertfeld verwenden, geben Sie den Typ zurück (sofern Sie die Methode ToString() nicht überschreiben).

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

Jamie Vorschlag ist gut, aber stattdessen ToString() zu überschreiben, würde ich Ihren IList < Bestellen Projekt nur> in IEnumerable < ListItem> vor der Bindung:

dh:

 
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 ... 

Ich bevorzuge das lieber als ToString() zu überschreiben, da ToString() generisch ist und überall verwendet wird und daher ein Schmerz im Arsch sein kann, während dies eine lokale Modifikation ist, die nichts anderes beeinflusst.

Verwandte Themen