Объединить два поля для отображения в раскрывающемся списке - PullRequest
15 голосов
/ 27 мая 2010

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

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

Спасибо, любые идеи помогут.

Ответы [ 6 ]

28 голосов
/ 27 мая 2010

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

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

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

и в раскрывающемся списке данных укажите вашу собственность

skuDropDown.DataSource = productQuery;     
skuDropDown.DataValueField = "ProductId";     
skuDropDown.DataTextField = "ID_Description";     
skuDropDown.DataBind(); 
1 голос
/ 27 мая 2010

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

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

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

0 голосов
/ 27 мая 2010

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

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

Тогда все, что вам нужно сделать, это привязаться к выпадающему. Насколько я понимаю, выпадающие списки привязаны к 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();  
0 голосов
/ 27 мая 2010

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

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

0 голосов
/ 27 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...