Domanda

c'è un modo per rendere la proprietà datatextfield di un elenco a discesa in asp.net tramite c # composta da più di una proprietà di un oggetto?

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 cui ho bisogno nell'interfaccia utente).

È stato utile?

Soluzione

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

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

O se non è possibile modificare MyObject, creare un oggetto wrapper nel livello presentazione (solo per la visualizzazione). Questo può essere fatto anche usando 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();

(mi dispiace non ho Visual Studio disponibile, quindi potrebbero esserci degli errori nel codice)

Altri suggerimenti

Consiglio di leggere questo: http://martinfowler.com/eaaDev/PresentationModel.html

In sostanza, si desidera creare una classe che rappresenti l'associazione a un'interfaccia utente specifica. Quindi mapperesti il ??tuo Modello (Il mio oggetto nel tuo esempio) su un oggetto ViewModel, e poi legheresti l'elenco a discesa in quel modo. È un bel modo di 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

A proposito, Prova ad assegnare " DataTextField " e "DataValueField" prima di assegnare l'origine dati. In questo modo si eviterà l'attivazione di " SelectedIndexChanged " evento durante il databinding ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top