dropdownlist DataTextField composé de propriétés?

existe-t-il un moyen de rendre la propriété datatextfield d’une liste déroulante dans asp.net via c # composée de plusieurs propriétés d’un object?

public class MyObject { public int Id { get; set; } public ssortingng Name { get; set; } public ssortingng FunkyValue { get; set; } public int Zip { get; set; } } protected void Page_Load(object sender, EventArgs e) { List myList = getObjects(); ddList.DataSource = myList; ddList.DataValueField = "Id"; ddList.DataTextField = "Name"; ddList.DataBind(); } 

Je veux par exemple ne pas utiliser “Nom”, mais “Nom (Zip)” par exemple.

Bien sûr, je peux changer la classe MyObject, mais je ne veux pas le faire (car la classe MyObject est dans une classe de modèle et ne devrait pas faire ce dont j’ai besoin dans l’interface utilisateur).

Ajoutez une autre propriété à la classe MyObject et liez-la à cette propriété:

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

Ou si vous ne pouvez pas modifier MyObject, créez un object wrapper dans la couche de présentation (uniquement pour l’affichage). Cela peut aussi être fait avec un peu de LINQ:

 List myList = getObjects(); ddList.DataSource = (from obj in myList select new { Id = obj.Id, Name = ssortingng.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 pourrait y avoir des erreurs dans le code)

Je recommanderais de lire ceci: http://martinfowler.com/eaaDev/PresentationModel.html

En gros, vous voulez créer une classe qui représente la liaison à une interface utilisateur particulière. Vous devez donc mapper votre modèle (Mon object dans votre exemple) vers un object ViewModel, puis lier la liste déroulante de cette façon. C’est une bonne façon de penser à la séparation des préoccupations.

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

BTW, essayez d’atsortingbuer le “DataTextField” et le “DataValueField” avant d’affecter le DataSource. Cela évitera de déclencher l’événement “SelectedIndexChanged” lors de la liaison de données …