代码之家  ›  专栏  ›  技术社区  ›  Jimenemex

组合框在多个字段上显示成员

  •  2
  • Jimenemex  · 技术社区  · 6 年前

    我在试着设置 .DisplayMember 财产 ComboBox 但我想将它绑定到 .DataSouce .

    我的SQL如下所示:

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

    我将此查询保存在 DataTable 因此,选定的每个列在 Datatable .

    我想把 .显示成员 组合 PersFirstName + PersMiddleName + PersLastName 所以他们的全名如下:

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

    我知道我可以问这个问题:

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

    然后这样做:

    comboBox.DisplayMember = "PersName";
    

    但我不想在数据库层中格式化数据,因为它不应该在那里。

    否则我怎么能在Winforms中实现呢?

    3 回复  |  直到 6 年前
        1
  •  5
  •   hardkoded    6 年前

    您可以创建 expression column 然后将其用作显示成员:

    dataTable.Columns.Add(
        "FullName", 
        typeof(string), 
        "PersFirstName + ' ' + PersMiddleName + ' ' PersLastName");
    
    comboBox.DisplayMember = "FullName";
    
        2
  •  2
  •   Fabio    6 年前

    不要用重的 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;
    
        3
  •  1
  •   DLL_Whisperer    6 年前

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

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

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