Объединение двух полей для отображения в раскрывающемся списке

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

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

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

Ответы

Ответ 1

Чтобы назначить источник с помощью данного метода, я хотел бы использовать 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();

Ответ 2

ЕСЛИ у вас есть класс для представления продукта, просто создайте свойство, которое расширяет ваш класс и возвращает его в сочетании, например:

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

и в раскрывающемся списке вашей привязки укажите свое свойство

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Все, что вам нужно сделать, это переопределить метод .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();