ComboBox Показать элемент на нескольких полях - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь установить свойство .DisplayMember для ComboBox в C #, но я хочу привязать его к нескольким столбцам в .DataSouce.

Мой SQL выглядит следующим образом:

SELECT PersNbr, PersFirstName, PersMiddleName, PersLastName
FROM Pers WHERE PersNbr = :persNbr;

Я сохраняю этот запрос в DataTable, поэтому каждый выбранный столбец имеет свой собственный столбец в Datatable.

Я хочу сделать .DisplayMember комбинациейPersFirstName + PersMiddleName + PersLastName поэтому их полное имя выглядит следующим образом:

comboBox.DisplayMemeber = "PersFirstName" + "PersMiddleName" + "PersLastName"

Я знаю, что могу просто ответить на вопрос:

SELECT PersNbr, (PersFirstName || PersMiddleName || PersLastName) PersName

, а затем просто сделать это:

comboBox.DisplayMember = "PersName";

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

Как еще можно добиться этого в Winforms?

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

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

dataTable.Columns.Add(
    "FullName", 
    typeof(string), 
    "PersFirstName + ' ' + PersMiddleName + ' ' PersLastName");

comboBox.DisplayMember = "FullName";
0 голосов
/ 22 ноября 2018

Не используйте тяжелые DataTable только для передачи данных из базы данных в код.Создайте класс, загрузите в него данные, после чего вы сможете форматировать данные с полной поддержкой используемого вами языка программирования (функций и т. Д.)

public class Person
{
    public int Number { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }

    public string Name => $"{FirstName} {MiddleName} {LastName}"; 
}

// Load data
var persons = new List<Person>();

using (var connection = new SqlConnection(connectionsString))
using (var command = connection.CreateCommand())
{
    command.CommandText = "SELECT PersNbr, PersFirstName, PersMiddleName, PersLastName FROM Pers";
    connection.Open();

    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            var person = new Person
            {
                Number = reader.GetInt32(0),
                FirstName = reader.GetString(1),
                MiddleName = reader.GetString(2),
                LastName = reader.GetString(3),
            };
            persons.Add(person);
        }
    }
}

combobox.DisplayMember = "Name";
combobox.DataSource = persons;
0 голосов
/ 27 августа 2018

Если вы используете таблицу данных, вы должны выполнить этот процесс на уровне базы данных.Я рекомендую вам сделать это с помощью классов POCO.Но если вы действительно хотите сделать это на прикладном уровне и с помощью datatable, вот следующий код:

dataTable.Columns.Add("PersName");
foreach(DataRow item in dataTable.Rows)
{
    item["PersName"] =  item["PersFirstName"] + item["PersMiddleName"] + ["PersLastName"]
}

Тогда вы можете установить для свойства DisplayMember значение «PersName».

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