ComboBox Display Member on multiple fields

Viewed 10269

I'm trying to set the.DisplayMember property of a ComboBox in C#, but I want to bind it to multiple columns in the .DataSouce.

My SQL looks like this:

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

I'm saving this query in a DataTable so each column selected has it's own column in the Datatable.

I want to make the .DisplayMember a combination of PersFirstName + PersMiddleName + PersLastName so their full name appears like this:

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

I know I can just to this on the query:

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

and then just do this:

comboBox.DisplayMember = "PersName";

but I don't want to do the formatting of data in the database layer since it's not supposed to be there.

How else can I achieve this in Winforms?

3 Answers

You can create an expression column and then use it as a DisplayMember:

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

comboBox.DisplayMember = "FullName";

Don't use heavy DataTable only for transporting data from database to the code. Create a class, load data in it then you will be able format data with full support of programming language you are using (functions and etc.)

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;

If you are using a datatable you should do this process on database layer. I've recommend you to do this by using POCO classes. But if you really want to do this on application layer and by using datatable here is the following code:

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

Then you can set the DisplayMember propert to "PersName".

Related