2010-05-26 45 views
15

Estoy tratando de concatenar dos campos de una lista para mostrarlos en un menú desplegable. A continuación se muestra el código que estoy tratando de usar. No quiero cambiar el modelo de mis productos, así que estaba tratando de hacer algo como eso a continuación, pero no puedo entender nada sin construir mi propio objeto con los campos concatenados.Concatenar dos campos para mostrar en la lista desplegable

  skuDropDown.DataSource = List<product> 
      skuDropDown.DataTextField = "ProductId" // want to combine with"Description"; 
      skuDropDown.DataValueField = "ProductId"; 
      skuDropDown.DataBind(); 

Thanks any ideas will help.

+0

Me temo que no tiene otra opción que ampliar el dominio –

Respuesta

26

Para asignar la fuente con su método dado, me gustaría utilizar LINQ para crear un tipo anónimo con las propiedades que desea. Algo así como

List<Product> products = new List<Product>(); 
products.Add(new Product() { ProductId = 1, Description = "Foo" }); 
products.Add(new Product() { ProductId = 2, Description = "Bar" }); 

var productQuery = products.Select(p => new { ProductId = p.ProductId, DisplayText = p.ProductId.ToString() + " " + p.Description }); 

skuDropDown.DataSource = productQuery; 
skuDropDown.DataValueField = "ProductId"; 
skuDropDown.DataTextField = "DisplayText"; 
skuDropDown.DataBind(); 
+0

Gracias, esto funcionó como un amuleto una vez que lo agregué – Locke12

0

Cree una nueva clase que amplíe el producto, eche los contenidos de la lista como clase extendida, que contiene una nueva propiedad, que devuelve los valores concatenados de ProductID y descripción.

Creo que debería funcionar OTOMH.

Sé que no desea cambiar la estructura de los productos, por lo que sugerí hacer una clase extendida. Pero afaik no es posible sin vincularlo a un campo del objeto.

0

Desafortunadamente, si usa enlace de datos, DataTextField debe ser el nombre de un campo en su fuente de datos.

Una cosa que puede hacer es repetir los elementos en la lista desplegable después de haberlos enlazado y modificar sus propiedades de Texto. La única otra cosa que hacer es obtener el campo concatenado agregado al objeto de datos.

1

Usted puede hacer esto:

List<Product>.ForEach(
    x => skuDropDown.Items.Add(
    new Item(x.ProductId + " " x.ProductDescription, x.ProductId) 
); 

Sólo bucle a través de la lista y añadir a cada elemento de la lista desplegable. Es lo que .net hará por ti detrás de escena en tu ejemplo.

0

Todo lo que necesita hacer es reemplazar el método ToString() del producto.

public override string ToString() 
{ 
    return ProductID + " " + ProductDescription; 
} 

Luego, todo lo que tiene que hacer es enlazar a la lista desplegable. Según tengo entendido, las etiquetas desplegables están ligadas al tostring() de los objetos de la colección a la que está vinculado.

en otras palabras, haz esto.

List<Product> products = new List<Product>();  
products.Add(new Product() { ProductId = 1, Description = "Foo" });  
products.Add(new Product() { ProductId = 2, Description = "Bar" });  

var productQuery = products.Select(p => new { ProductId = p.ProductId, DisplayText = p.ProductId.ToString() + " " + p.Description });  

skuDropDown.DataSource = productQuery;  
skuDropDown.DataBind(); 
4

si tiene una clase para representar un producto, basta con crear una propiedad que se extienden a su clase y volver combinó, por ejemplo:

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

y, en su desplegable databind referencia a su propiedad

skuDropDown.DataSource = productQuery;  
skuDropDown.DataValueField = "ProductId";  
skuDropDown.DataTextField = "ID_Description";  
skuDropDown.DataBind(); 
Cuestiones relacionadas