2009-01-03 11 views
10

¿Hay alguna manera de hacer que el campo de texto de datos sea propiedad de una lista desplegable en asp.net a través de C# compuesto por más de una propiedad de un objeto?lista desplegable DataTextField compuesto de propiedades?

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

Quiero, por ej. no use "Nombre", sino "Nombre (Zip)", por ejemplo.

Claro, puedo cambiar la clase MyObject, pero no quiero hacer esto (porque la clase MyObject está en una clase modelo y no debería hacer lo que necesito en la interfaz de usuario).

Respuesta

22

agregar otra propiedad a la clase MiObjeto y se unen a esa propiedad:

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

O si no se puede modificar MiObjeto, cree un objeto contenedor en la capa de presentación (sólo para mostrar). Esto también se puede hacer uso de algún 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(); 

(lo siento no tengo Visual Studio disponible, por lo que puede haber errores en el código)

4

Yo recomendaría leer esto: http://martinfowler.com/eaaDev/PresentationModel.html

Básicamente, desea crear una clase que represente el enlace a una IU particular. Entonces, asignaría su Modelo (Mi Objeto en su ejemplo) a un objeto de ViewModel y luego vincularía la lista desplegable de esa manera. Es una forma genial de pensar acerca de la separación de preocupaciones.

EDIT: Aquí hay otra serie blog el modelo de vista: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

+0

gracias, esta es una sugerencia útil para obtener una mejor arquitectura, pero entendió mi pregunta perfectamente. :) – karlis

2

Por cierto, prueba de asignar el "DataTextField" y "DataValueField" antes de asignar el origen de datos. Si lo hace, evitará disparar el evento "SelectedIndexChanged" mientras enlaza datos ...

Cuestiones relacionadas