выпадающий список DataTextField состоит из свойств? - PullRequest
10 голосов
/ 03 января 2009

Есть ли способ сделать свойство datatextfield раскрывающегося списка в asp.net через c #, состоящее из более чем одного свойства объекта?

public class MyObject
{
  public int Id { get; set; }
  public string Name { get; set; }
  public string FunkyValue { get; set; }
  public int Zip { get; set; }
}

protected void Page_Load(object sender, EventArgs e)
{
  List<MyObject> myList = getObjects();
  ddList.DataSource = myList;
  ddList.DataValueField = "Id";
  ddList.DataTextField = "Name";
  ddList.DataBind();
}

Я хочу, например, не использовать «Имя», но «Имя (Zip)», например.

Конечно, я могу изменить класс MyObject, но я не хочу этого делать (поскольку класс MyObject находится в классе модели и не должен делать то, что мне нужно в пользовательском интерфейсе).

Ответы [ 3 ]

22 голосов
/ 03 января 2009

Добавьте еще одно свойство в класс MyObject и привяжите его к этому свойству:

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

Или, если вы не можете изменить MyObject, создайте объект-оболочку на уровне представления (только для отображения). Это также можно сделать с помощью некоторого LINQ:

List<MyObject> myList = getObjects();
ddList.DataSource = (from obj in myList
                    select new
                    {
                      Id = obj.Id,
                      Name = string.Format("{0} ({1})", obj.Name, obj.Zip)
                    }).ToList();
ddList.DataValueField = "Id";
ddList.DataTextField = "Name";
ddList.DataBind();

(извините, у меня нет доступной Visual Studio, поэтому в коде могут быть ошибки)

4 голосов
/ 03 января 2009

Я бы порекомендовал прочитать это: http://martinfowler.com/eaaDev/PresentationModel.html

По сути, вы хотите создать класс, который представляет привязку к определенному пользовательскому интерфейсу. Таким образом, вы должны сопоставить вашу модель (мой объект в вашем примере) с объектом ViewModel, а затем связать выпадающий список таким образом. Это крутой способ думать о разделении интересов.

РЕДАКТИРОВАТЬ: Вот еще одна серия блогов на ViewModel: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

2 голосов
/ 13 июля 2009

Кстати, Попробуйте назначить «DataTextField» и «DataValueField» перед назначением источника данных. Это предотвратит запуск события «SelectedIndexChanged» при привязке данных ...

...