C# 多个字段上的组合框显示成员

C# 多个字段上的组合框显示成员,c#,winforms,data-binding,combobox,formatting,C#,Winforms,Data Binding,Combobox,Formatting,我试图在C中设置ComboBox的.DisplayMember属性,但我想将其绑定到.DataSouce中的多个列 我的SQL如下所示: SELECT PersNbr, PersFirstName, PersMiddleName, PersLastName FROM Pers WHERE PersNbr = :persNbr; comboBox.DisplayMemeber = "PersFirstName" + "PersMiddleName" + "PersLastName" 我将此查询

我试图在C中设置ComboBox的.DisplayMember属性,但我想将其绑定到.DataSouce中的多个列

我的SQL如下所示:

SELECT PersNbr, PersFirstName, PersMiddleName, PersLastName
FROM Pers WHERE PersNbr = :persNbr;
comboBox.DisplayMemeber = "PersFirstName" + "PersMiddleName" + "PersLastName"
我将此查询保存在DataTable中,以便选定的每个列在DataTable中都有自己的列

我想将.DisplayMember设置为PersFirstName+PersMiddleName+PersLastName的组合,使其全名如下所示:

SELECT PersNbr, PersFirstName, PersMiddleName, PersLastName
FROM Pers WHERE PersNbr = :persNbr;
comboBox.DisplayMemeber = "PersFirstName" + "PersMiddleName" + "PersLastName"
我知道我可以在查询中找到这一点:

SELECT PersNbr, (PersFirstName || PersMiddleName || PersLastName) PersName
然后就这样做:

comboBox.DisplayMember = "PersName";
但是我不想在数据库层中格式化数据,因为它不应该在那里


在Winforms中如何实现这一点?

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

dataTable.Columns.Add("PersName");
foreach(DataRow item in dataTable.Rows)
{
    item["PersName"] =  item["PersFirstName"] + item["PersMiddleName"] + ["PersLastName"]
}
然后,您可以将DisplayMember属性设置为PersName。

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

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

comboBox.DisplayMember = "FullName";
不要只使用重数据表将数据从数据库传输到代码。创建一个类,在其中加载数据,然后您将能够在使用函数等编程语言的完全支持下格式化数据

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;

@zambonee的可能副本为XAML。他要了一张windows窗体。据我所知,您无法在windows窗体中设置组合框项目模板。可能在DataPopulated上触发了一个事件或类似的事件。但是我们不应该这么做哇,我不知道有什么东西像表达式专栏。有趣的是,可以在表达式中使用函数吗?如果my DB中的PersMiddleName为null,则会添加一个额外的空格。是否有一种快速的方法来解决这个问题,或者我需要计算单个行的值。@Jimenemex您在文档中有可用选项的列表