2010-05-26 2 views
15

Я пытаюсь объединить два поля из списка для отображения в выпадающем списке. Ниже приведен код, который я пытаюсь использовать. Я не хочу менять модель своих продуктов, поэтому я пытался сделать что-то вроде этого ниже, но я ничего не могу понять, не строя свой собственный объект с конкатенированными полями.Объединить два поля для отображения в раскрывающемся списке

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

Спасибо за любые идеи.

+0

Я боюсь, что у вас нет другого выбора, кроме расширения домена –

ответ

26

Чтобы назначить источник с помощью данного метода, я хотел бы использовать LINQ для создания анонимного типа с требуемыми свойствами. Что-то вроде

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

Спасибо, это сработало понравилось очарование, как только я .tolisted it – Locke12

0

Создайте новый класс, который расширяет продукт, накладывает содержимое списка как расширенный класс, который содержит новое свойство, которое возвращает конкатенированные значения ProductID и Description.

Я думаю, что это должно работать OTOMH.

Я знаю, что вы не хотите менять структуру продуктов, поэтому я предложил сделать расширенный класс. Но afaik невозможно без привязки к полю объекта.

0

К сожалению, если вы используете привязку данных, DataTextField должен быть именем поля в вашем источнике данных.

Одна вещь, которую вы можете сделать, это перебрать элементы в раскрывающемся списке после того, как вы связали их и изменили их свойства текста. Единственное, что нужно сделать, это получить добавленное конкатенированное поле к объекту данных.

1

Вы можете сделать это:

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

Просто цикл по списку и добавить каждый элемент в раскрывающемся списке. Это то, что .net сделает для вас за кулисами в вашем примере.

0

Все что вам нужно сделать, это переопределить метод .ToString() продукта.

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

Тогда все, что вам нужно сделать, это привязать к выпадающему. По моему мнению, выпадающие таблицы ar привязаны к tostring() объектов в коллекции, к которой она привязана.

другими словами, сделайте это.

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

Если у вас есть класс, чтобы представить продукт, просто создать свойство, расширить свой класс и вернуть его в сочетании, например:

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

и в вашем DataBind выпадающего списка ссылки вашу собственность

Смежные вопросы