Подтвердить что ты не робот

Как связать ComboBox, чтобы displaymember был concat из двух полей источника данных?

Я хотел бы привязать 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";
4b9b3361

Ответ 1

Вычисленное решение столбцов, пожалуй, самое лучшее. Но если вы не можете изменить схему таблиц данных, чтобы добавить это, вы можете пропустить таблицу и заполнить новую коллекцию, которая будет служить источником данных.

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, но я бы не стал беспокоиться об этом, если в таблице нет тысяч строк.

Ответ 2

Самый простой способ - создать новый вычисляемый столбец в DataTable, используя свойство Expression:

tbldata.Columns.Add("FullName", typeof(string), "Name + ' ' + Surname");
...
cbo.DataTextField = "FullName";

Ответ 3

Я бы создал свойство на вашем объекте данных, а затем сопоставил его с DataTextField

Объект данных

public string FullName
{
  get { return Name + " " + Surname; }
}

Code-за

cbo.DataSource = tbldata;
cbo.DataTextField = "FullName";
cbo.DataValueField = "GUID";
cbo.DataBind();

Ответ 4

У вас есть свойство в вашем классе, которое является конкатеном имени и фамилии. И привяжите DataTextField к этому свойству.

Если вы привязываете его к DataTable, вы можете добавить новый столбец в DataTable, значения которого совпадают с именем и фамилией и привязать его к комбо.

Ответ 5

Или реализуйте событие "Формат" следующим образом:

DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];

Ответ 6

Посмотрите на вычисленные столбцы, используя свойство Expression свойства DataColumn.

Ответ 7

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