2009-01-03 16 views
10

esiste un modo per rendere la proprietà datatextfield di un elenco a discesa in asp.net tramite C# composto da più di una proprietà di un oggetto?dropdownlist DataTextField composto da proprietà?

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

Voglio ad es. non utilizzare "Nome", ma "Nome (Zip)" ad es.

Certo, posso cambiare la classe MyObject, ma non voglio farlo (perché la classe MyObject è in una classe modello e non dovrebbe fare qualcosa di ciò che ho bisogno nell'interfaccia utente).

risposta

22

Aggiungi un'altra proprietà alla classe MyObject e si legano a quella proprietà:

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

Oppure, se non è possibile modificare MyObject, creare un oggetto wrapper nel livello di presentazione (solo per la visualizzazione). Questo può anche essere fatto utilizzando alcuni LINQ:

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(); 

(scusate non ho Visual Studio disponibile, quindi ci potrebbero essere degli errori di codice)

4

mi sento di raccomandare la lettura di questo: http://martinfowler.com/eaaDev/PresentationModel.html

In sostanza, si desidera creare una classe che rappresenti il ​​binding a una particolare interfaccia utente. Quindi dovresti mappare il tuo Modello (il mio oggetto nell'esempio) a un oggetto ViewModel e quindi associare l'elenco a discesa in questo modo. È un modo interessante per pensare alla separazione delle preoccupazioni.

EDIT: Ecco un'altra serie di blog su ViewModel: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

+0

grazie, questo è un suggerimento utile per ottenere una migliore architettura, ma hai capito perfettamente la mia domanda. :) – karlis

2

BTW, provate ad assegnare il "DataTextField" e "DataValueField" prima di assegnare il DataSource. Ciò impedirà di attivare l'evento "SelectedIndexChanged" mentre l'associazione dati ...

Problemi correlati