Я пытаюсь связать два поля из списка для отображения в выпадающем. Ниже код, который я пытаюсь использовать. Я не хочу изменять модель своих продуктов, таким образом, я пытался сделать что-то как этот ниже, но я ничего не могу понять, не пристраивая мой собственный объект со связанными полями.
skuDropDown.DataSource = List<product>
skuDropDown.DataTextField = "ProductId" // want to combine with"Description";
skuDropDown.DataValueField = "ProductId";
skuDropDown.DataBind();
Спасибо любые идеи поможет.
Чтобы назначить источник с заданным методом, я бы использовал 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();
Создайте новый класс, который расширяет продукт, преобразуйте содержимое списка в расширенный класс, который содержит новое свойство, которое возвращает объединенные значения ProductID и Description.
Я думаю, что это должно работать ОТОМХ.
Я знаю, что вы не хотите изменять структуру продуктов, поэтому я предложил создать расширенный класс. Но, черт возьми, это невозможно без привязки к полю объекта.
Вы можете сделать следующее:
List<Product>.ForEach(
x => skuDropDown.Items.Add(
new Item(x.ProductId + " " x.ProductDescription, x.ProductId)
);
Просто пройдитесь циклом по списку и добавьте каждый элемент в выпадающий список. Это то, что .net сделает для вас за кулисами в вашем примере.
К сожалению, если вы используете привязку к базе данных, DataTextField должно быть именем поля в вашем источнике данных.
Единственное, что вы можете сделать, это перебрать элементы выпадающего списка после их привязки и изменить их свойства Text. Единственное, что еще можно сделать, это добавить конкатенированное поле в объект данных.
Все, что вам нужно сделать, это переопределить метод .ToString() продукта.
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();