ComboBox显示成员在多个字段上

时间:2018-08-26 23:13:27

标签: c# winforms data-binding combobox formatting

我正在尝试在C#中设置.DisplayMember的{​​{1}}属性,但是我想将其绑定到ComboBox中的多个列。

我的SQL看起来像这样:

.DataSouce

我将此查询保存在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

但是我不想对数据库层中的数据进行格式化,因为它不应该在那里存在。

我还能如何在Winforms中实现这一目标?

3 个答案:

答案 0 :(得分:5)

您可以创建一个expression column,然后将其用作DisplayMember:

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

comboBox.DisplayMember = "FullName";

答案 1 :(得分:1)

如果使用数据表,则应在数据库层上执行此过程。我建议您通过使用POCO类来做到这一点。但是,如果您真的想在应用程序层上使用数据表来执行此操作,则以下代码:

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

然后,您可以将DisplayMember属性设置为“ PersName”。

答案 2 :(得分:0)

不要仅使用繁重的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;