c# - dropdownlist DataTextField compuesto de propiedades?
asp.net data-binding (3)
¿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?
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 ejemplo, no usar "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 de modelo y no debería hacer lo que necesito en la interfaz de usuario).
Agregue otra propiedad a la clase MyObject y vincule a esa propiedad:
public string DisplayValue
{
get { return string.Format("{0} ({1})", Name, Zip); }
}
O si no puede modificar MyObject, cree un objeto contenedor en la capa de presentación (solo para mostrar). Esto también se puede hacer usando algunos 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 podría haber errores en el código)
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.
EDITAR: Aquí hay otra serie de blog en ViewModel: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx
Por cierto, intente asignar el "DataTextField" y "DataValueField" antes de asignar el DataSource. Al hacerlo, evitará que se active el evento "SelectedIndexChanged" mientras se enlaza la información ...