раскрывающийся список DataTextField, состоящий из свойств?
-
03-07-2019 - |
Вопрос
Есть ли способ сделать свойство datatextfield раскрывающегося списка в asp.net через С# состоящим из более чем одного свойства объекта?
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 находится в классе модели и не должен делать то, что мне нужно в пользовательском интерфейсе).
Решение
Добавьте еще одно свойство в класс 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, поэтому в коде могут быть ошибки)
Другие советы
Я бы рекомендовал прочитать это: http://martinfowler.com/eaaDev/PresentationModel.html
По сути, вы хотите создать класс, который представляет привязку к определенному пользовательскому интерфейсу.Итак, вы сопоставляете свою модель (в вашем примере «Мой объект») с объектом ViewModel, а затем таким образом привязываете раскрывающийся список.Это отличный способ подумать о разделении задач.
РЕДАКТИРОВАТЬ:Вот еще одна серия блогов о ViewModel: http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx
Кстати, попробуйте присвоить «Datatextfield» и «DataValuefield», прежде чем назначить дат данных.Это предотвратит запуск события SelectedIndexChanged во время привязки данных...