Как связать ComboBox, чтобы отображаемый элемент соответствовал 2 полям источника данных? - PullRequest
24 голосов
/ 17 июня 2009

Я бы хотел связать 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 ]

26 голосов
/ 17 июня 2009

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

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

18 голосов
/ 17 июня 2009

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

tbldata.Columns.Add("FullName", typeof(string), "Name + ' ' + Surname");
...
cbo.DataTextField = "FullName";
5 голосов
/ 17 июня 2009

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

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

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

Код-за

cbo.DataSource = tbldata;
cbo.DataTextField = "FullName";
cbo.DataValueField = "GUID";
cbo.DataBind();
3 голосов
/ 04 декабря 2009

Или реализовать событие «Формат» следующим образом:

DataRow r = ((DataRowView)e.ListItem).Row;
e.Value = r[ "FirstName" ] + " - " + r[ "LastName" ];
2 голосов
/ 17 июня 2009

Имейте свойство в своем классе, которое совпадает с Именем и Фамилией. И привяжите DataTextField к этому свойству.

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

1 голос
/ 17 июня 2009

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

0 голосов
/ 17 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...