Как связать ComboBox, чтобы отображаемый элемент соответствовал 2 полям источника данных?
Я хотел бы связать ComboBox
к DataTable
(Я не могу изменить его оригинальную схему)
cbo.DataSource = tbldata;
cbo.DataTextField = "Name";
cbo.DataValueField = "GUID";
cbo.DataBind();
Я хочу ComboBox
шоу tbldata.Name + tbldata.Surname
,
Конечно, добавив новое имя + фамилию в качестве поля к tbldata
как раз перед тем, как связывание возможно, но я надеюсь на более элегантное решение в духе (псевдокод)
cbo.DataTextField = "Name";
cbo.DataTextField += "Surname";
7 ответов
Рассчитанное решение столбца, вероятно, является лучшим. Но если вы не можете изменить схему таблицы данных, чтобы добавить ее, вы можете перебрать таблицу и заполнить новую коллекцию, которая будет служить источником данных.
var dict = new Dictionary<Guid, string>();
foreach (DataRow row in dt.Rows)
{
dict.Add(row["GUID"], row["Name"] + " " + row["Surname"]);
}
cbo.DataSource = dict;
cbo.DataTextField = "Value";
cbo.DataValueField = "Key";
cbo.DataBind();
Очевидно, что это не так эффективно, как привязка непосредственно к DataTable, но я бы не стал беспокоиться об этом, если в таблице нет тысяч строк.
Самый простой способ - создать новый вычисляемый столбец в DataTable, используя свойство Expression:
tbldata.Columns.Add("FullName", typeof(string), "Name + ' ' + Surname");
...
cbo.DataTextField = "FullName";
Или реализуйте событие "Формат" так:
DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];
Я хотел бы создать свойство для вашего объекта данных, а затем сопоставить его с DataTextField
Объект данных
public string FullName
{
get { return Name + " " + Surname; }
}
Код-за
cbo.DataSource = tbldata;
cbo.DataTextField = "FullName";
cbo.DataValueField = "GUID";
cbo.DataBind();
Имейте собственность в своем классе, которая является конкатетой Имени и Фамилии. И привяжите DataTextField к этому свойству.
Если вы привязываете его к DataTable, вы можете добавить новый столбец в DataTable, значения которого совпадают с именем и фамилией, и связать его со списком.
Посмотрите на вычисляемые столбцы, используя свойство Expression объекта DataColumn.
Вы можете зарегистрировать событие связывания со списком и выполнить итерации элементов, задав для каждого текста элемента нужные поля, используя элемент данных элемента комбинированного списка.