2009-01-03 7 views
10

Y at-il un moyen de rendre la propriété datatextfield d'une liste déroulante dans asp.net via C# composé de plus d'une propriété d'un objet?dropdownlist DataTextField composé de propriétés?

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

Je veux par ex. pas utiliser "Nom", mais "Nom (Zip)" par exemple. Bien sûr, je peux changer la classe MyObject, mais je ne veux pas le faire (parce que la classe MyObject est dans une classe modèle et ne devrait pas faire ce dont j'ai besoin dans l'interface utilisateur).

Répondre

22

Ajouter une autre propriété à la classe MyObject et se lient à cette propriété:

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

Ou si vous ne pouvez pas modifier MyObject, créer un objet wrapper dans la couche de présentation (juste pour l'affichage). Cela peut aussi être fait en utilisant certains 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(); 

(désolé je n'ai pas Visual Studio disponible, donc il peut y avoir des erreurs dans le code)

4

Je recommande la lecture de ceci: http://martinfowler.com/eaaDev/PresentationModel.html

Essentiellement, vous voulez créer une classe qui représente la liaison à une interface utilisateur particulière. Vous mappez donc votre modèle (Mon objet dans votre exemple) à un objet ViewModel, puis liez la liste déroulante de cette manière. C'est une façon cool de penser à la séparation des préoccupations.

EDIT: Voici une autre série de blog sur ViewModel: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

+0

merci, c'est un indice utile pour obtenir une meilleure architecture, mais vous avez parfaitement compris ma question. :) – karlis

2

BTW, Essayez d'attribuer le "DataTextField" et "DataValueField" avant d'affecter le DataSource. Cela empêchera de déclencher l'événement "SelectedIndexChanged" lors de la connexion de données ...