2009-01-03 20 views
10

Gibt es eine Möglichkeit, die Eigenschaft datatextfield einer Dropdown-Liste in asp.net über C# aus mehr als einer Eigenschaft eines Objekts zu machen?Dropdownliste DataTextField besteht aus Eigenschaften?

public class MyObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string FunkyValue { get; set; } 
    public int Zip { get; set; } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    List<MyObject> myList = getObjects(); 
    ddList.DataSource = myList; 
    ddList.DataValueField = "Id"; 
    ddList.DataTextField = "Name"; 
    ddList.DataBind(); 
} 

Ich möchte z.B. Verwenden Sie nicht "Name", sondern "Name (Zip)" z.

Sicher, ich kann die MyObject-Klasse ändern, aber ich möchte dies nicht tun (weil die MyObject-Klasse in einer Modellklasse ist und etwas tun sollte, was ich in der Benutzeroberfläche brauche).

Antwort

22

eine andere Eigenschaft auf die MyObject-Klasse hinzufügen und binden an diese Eigenschaft:

public string DisplayValue 
{ 
get { return string.Format("{0} ({1})", Name, Zip); } 
} 

Oder wenn Sie nicht MyObject ändern kann, ein Wrapper-Objekt in der Präsentationsschicht (nur zur Anzeige) erstellen. Dies kann auch mit einigen LINQ getan werden:

List<MyObject> myList = getObjects(); 
ddList.DataSource = (from obj in myList 
        select new 
        { 
         Id = obj.Id, 
         Name = string.Format("{0} ({1})", obj.Name, obj.Zip) 
        }).ToList(); 
ddList.DataValueField = "Id"; 
ddList.DataTextField = "Name"; 
ddList.DataBind(); 

(leider habe ich nicht Visual Studio zur Verfügung, so dass es möglicherweise Fehler im Code sein)

4

Ich empfehle das Lesen würde: http://martinfowler.com/eaaDev/PresentationModel.html

Im Wesentlichen möchten Sie eine Klasse erstellen, die die Bindung an eine bestimmte Benutzeroberfläche darstellt. Sie würden also Ihr Modell (Mein Objekt in Ihrem Beispiel) einem ViewModel-Objekt zuordnen und dann die Dropdown-Liste auf diese Weise binden. Es ist eine coole Art, über die Trennung von Sorgen nachzudenken.

EDIT: Hier ist eine weitere Blog-Serie auf Ansichtsmodell: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

+0

Vielen Dank, dies ist ein nützlicher Hinweis für eine bessere Architektur, aber Sie haben meine Frage perfekt verstanden. :) – karlis

2

BTW, Versuchen Sie, die „Datatextfield“ und „Datavaluefield“ zuweisen, bevor Sie die Datasource zuweisen. Dadurch wird verhindert, dass das Ereignis "SelectedIndexChanged" während der Datenbindung ausgelöst wird.

Verwandte Themen