24

Вопрос по c# – Как связать 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";
  • Поскольку это просто одноразовое использование, использование класса в качестве основы для этого является излишним.

    от callisto
  • Мне это нравится намного лучше, чем предложения людей по поводу изменения объекта данных и создания нового свойства.

    от
  • я согласен, не могу думать о другом

    от
  • Я имел в виду, если класс уже используется.

    от
  • Только то, что мне нужно, спасибо.

    от callisto
  • элегантное решение

    от
  • Наиболее полезный ! Благодарю.

    от
7 ответов
  • 1

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

    выражение свойство DataColumn.

  • 3

    Или внедрить «Формат» событие как это:

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

  • 5

    Я хотел бы создать свойство для вашего объекта данных

    а затем сопоставить его с DataTextField

    Data Object

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

    Code-behind

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

  • 18

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

    используя свойство Expression:

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

  • 0

    Вы можете зарегистрировать событие связывания комбо и выполнять итерац

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

  • 2

    Имейте собственность в своем классе

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

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

  • 26

    Рассчитанное решение столбца

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

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