Заполнение DropDownlist из строго типизированного списка

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

Это пример того, что я делаю.

private List<Customer> _CustomerList = new List<Customer>();

ddlCustomer.DataSource = _CustomerList;
ddlCustomer.DataTextField = "FirstName";
ddlCustomer.DataValueField = "CustomerKey";
ddlCustomer.DataBind();

это работает, но мне нужно первое и последнее вместе, и я не могу манипулировать этими данными в объекте Customer.


person Community    schedule 04.07.2009    source источник
comment
На самом деле самым простым решением здесь было бы просто создать новое свойство в Customer CompoundName и использовать его для DatatextField.   -  person Fiur    schedule 04.07.2009
comment
stackoverflow.com/questions/1006521/   -  person bendewey    schedule 04.07.2009


Ответы (6)


Попробуйте использовать перечисление анонимного объекта, созданного на лету.

var _CustomerList = customers.Select( c => new {
                                         Name = c.FirstName + " " + c.LastName,
                                         Key = c.CustomerKey
                                    });


ddlCustomer.DataSource = _CustomerList;
ddlCustomer.DataTextField = "Name";
ddlCustomer.DataValueField = "Key";
ddlCustomer.DataBind();

Возможно, вам придется добавить ToList() после Select, но я думаю, что вы можете привязать к IEnumerable<T>.

P.S. Для этого примера требуется .Net 3.5 Framework

person tvanfosson    schedule 04.07.2009
comment
Нет необходимости добавлять ToList(), потому что он будет пронумерован после привязки. - person Andreas Grech; 04.07.2009
comment
Я так и думал, но единственные примеры, которые я смог найти в MSDN, связаны с IList, List‹T›, Collection‹T› и т. д. - person tvanfosson; 04.07.2009
comment
Спасибо, tvanfosson ... пожалуйста, простите мое невежество (я из фона сценариев asp) var не похоже на ключевое слово в С#, я бы использовал объект здесь? и клиенты. Выберите, вы говорите, чтобы получить доступ к моему объекту клиента напрямую или к возвращаемому списку? падаван - person ; 04.07.2009
comment
Я предполагал .NET 3.5 и С# 3.0. Вы обнаружите, что var является ключевым словом в C# 3.0. Вам понадобится .NET 3.5, чтобы использовать метод расширения Select в IEnumerable‹T›. Результатом будет создание перечисления анонимных объектов, содержащих данные из вашего объекта Customer в свойствах Name и Key. - person tvanfosson; 04.07.2009
comment
Обновлен ответ, чтобы указать, что для этого примера требуется платформа 3.5. - person Andreas Grech; 06.07.2009
comment
Единственным недостатком этого является то, что вы в конечном итоге делаете этот точный код повсюду... может быть неплохо создать наследуемый класс с абстрактным методом. - person aronchick; 06.07.2009

Вы можете создать свойство в классе Customer, которое объединяет FirstName и LastName, и вы можете использовать это свойство в своем ddlCustomer.DataTextField.

person Ankit    schedule 04.07.2009
comment
В сообщении он говорит, что не может манипулировать данными в объекте Customer (я предполагаю, что у него нет возможности добавить новое свойство) - person Justin Niessner; 04.07.2009

Мне еще предстоит найти хорошее решение этой проблемы. Я нашел следующий подход для работы лучше всего:

  • Создайте класс-оболочку вокруг Customer (либо наследуйте от Customer, если это возможно, либо создайте совершенно новый класс, который содержит объект Customer и предоставляет дополнительные свойства.

  • Создайте свойство в своем НОВОМ классе, которое объединяет два поля, к которым вы хотите привязать данные.

  • Привяжите раскрывающийся список к списку вашего пользовательского объекта.

person Justin Niessner    schedule 04.07.2009

Чтобы отделить представление пользовательского интерфейса от базового объекта данных, вы можете создать объект-оболочку вокруг Customer, например CustomerForUI, с одним свойством, называемым FullName, а затем поместить список объектов CustomerForUI в пользовательский интерфейс.

Что-то типа:

public class CustomerForUI
{
    private string _FullName;

    public CustomerForUI(Customer c)
    {
       _FullName = c.FirstName + " " + c.LastName;
    }

    public string FullName
    {
       get {return _FullName;}
    }

    public string CustomerKey
    {  ... }
}

и создайте список объектов CustomerForUI с именем _UIList и:

ddlCustomer.DataSource = __UIList;
ddlCustomer.DataTextField = "FullName";
ddlCustomer.DataValueField = "CustomerKey";
ddlCustomer.DataBind();
person jean    schedule 04.07.2009

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

Просто перечислите свой бизнес-объект и используйте:

ddlCustomer.Items.Add(new ListItem("text" , "value"));

где текст — это имя и фамилия, соединенные вместе.

person ScottE    schedule 05.07.2009

Я согласен со Скоттом... это, казалось бы, самый простой способ, и у него будет на один объект меньше, за которым нужно следить.

person Nick DeMayo    schedule 05.07.2009