如何在C#中将两个字段值附加到组合框显示成员

18
在我的表中,有一个名为firstnamelastname的字段,现在我想将它们设置为组合框中的displaymember,但我不知道该怎么做。
类似于这样:
cmbEmployees.DataSource = GetEmployees();
//something like below line which doesn't work
cmbEmployees.DisplayMember = "lastname, first_name";     
cmbEmployees.ValueMember = "id";

我该如何实现这个功能?使得lastnamefirstname都能在combobox中显示。

1
你可以添加一个属性来将这两个名称合并。 - JosephHirn
默认情况下,控件将显示ToString方法返回的内容,因此您可以覆盖它。 - Russell Horwood
8个回答

64

这个示例将会指导你如何在不修改基类的情况下实现这一点。

首先,你可以保留你的DisplayMember属性,并仅使用一个属性,比如:

cmbEmployees.DisplayMember = "lastname";

现在,以[设计]模式打开你的表单, 右键点击ComboBox -> 属性。

在属性窗口的顶部,点击事件(闪电图标),

在下面的事件列表中查找“格式”(在“属性更改”下面),并在其中输入一些事件名称,比如:ComboBoxFormat,并按Enter键。你会看到这个:

private void ComboBoxFormat(object sender, ListControlConvertEventArgs e)
{

}

现在在内部编写如下几行:

private void ComboBoxFormat(object sender, ListControlConvertEventArgs e)
{
    // Assuming your class called Employee , and Firstname & Lastname are the fields
    string lastname = ((Employee)e.ListItem).Firstname;
    string firstname = ((Employee)e.ListItem).Lastname;
    e.Value = lastname + " " + firstname;
}

就这样了 ;)


那是一个惊人的解决方案。 - Romil Kumar Jain
非常干净的解决方案!请注意,即使源类不是您自己的类,它也可以正常工作。例如,我需要对System.IO.SerialPort枚举进行操作,现在我不必创建 "ad hoc" 继承类。 - tedebus
Eliran,你能解释一下如何设置吗?你从哪里得到了FirstName,我不知道在这种情况下field是什么意思。我使用datatable绑定combobox,并根据datatable列名设置Display和ValueMember。 - LuckyLuke82

31

假设您有一个像这样的类:

class Person
{
    public string FirstName
    {
        get;
        set;
    }

    public string LastName
    {
        get;
        set;
    }

    public string FullName
    {
        get
        {
            return LastName + ", " + FirstName;
        }
    }

    public Person(string firstname, string lastname)
    {
        FirstName = firstname;
        LastName = lastname;
    }
}

如果您没有FullName属性,只需按照您希望显示姓名的格式创建一个。然后将DisplayMember设置为FullName


19

GetEmployees() 函数中,你的查询应该是这样的。

"SELECT id,(lastname + ' ' + first_name) AS NAME FROM TABLE"

cmbEmployees.DataSource = GetEmployees();
cmbEmployees.DisplayMember = "NAME"; 
cmbEmployees.ValueMember = "id";

3
在C# 6中,可以在你的Employee类中创建只读属性。
public string FullName=>$"{lastname} {firstname}";

然后
cmbEmployees.DataSource = GetEmployees();
//something like below line which doesn't work
cmbEmployees.DisplayMember = "FullName";     
cmbEmployees.ValueMember = "id";

2

0
    public void alldata1()
    {
        var Person= context.Person.Select(s => new { 
            display = s.surName+" "+s.name,
            value = s.studentID
        });
        comboBoxStudentNom.DataSource = Person.ToList();
        comboBoxStudentNom.ValueMember = "value";
        comboBoxStudentNom.DisplayMember = "display";
    }

0
// Declare a class
private class ComboRec
   {
     public string ID { get; set; }
     public string FirstName { get; set; }
     public string LastName { get; set; }
     public string FullName { get; set; }
     public string Department { get; set; }
   }

   

    // Fill the Combo Items
    private void FillMyComboList()
            {
                EmployeesCombo.Items.Clear();
                EmployeesCombo.ValueMember = "ID";
                EmployeesCombo.DisplayMember = "FullName";
    
                MySqlCommand cmd = new MySqlCommand("select id, firstname, lastname, department from employees order by lastname, firstname", MyConnection);
                cmd.Transaction = myTransaction;
                MySqlDataReader rdr = cmd.ExecuteReader();
    
                ComboRec comborec;
    
                while (rdr.Read())
                {
                    comborec = new ComboRec();
                    comborec.ID = rdr["id"].ToString();
                    comborec.FirstName = rdr["firstname"].ToString();
                    comborec.LastName = rdr["lastname"].ToString();
                    comborec.FullName = rdr["lastname"].ToString() + ", " + rdr["firstname"].ToString();
                    comborec.Department = rdr["department"].ToString();
    
                    EmployeesCombo.Items.Add(comborec);
                }
    
                rdr.Close();
            }   
       
       
    // Get the values from combo
    string id = ((ComboRec)EmployeesCombo.SelectedItem).ID);
    string firstname = ((ComboRec)EmployeesCombo.SelectedItem).FirstName);
    string lastname = ((ComboRec)EmployeesCombo.SelectedItem).LastName);
    string fullname = ((ComboRec)EmployeesCombo.SelectedItem).FullName);
    string department = ((ComboRec)EmployeesCombo.SelectedItem).Department);

-1

创建视图 [dbo].[get_view] AS SELECT CONCAT(sell_tb.Name,extra_tb.Name,purchase_tb.Name) AS Name FROM sell_tb FULL JOIN extra_tb ON extra_tb.E_ID = sell_tb.E_ID FULL JOIN purchase_tb ON purchase_tb.S_ID = sell_tb.S_ID;

      private void alldata1()
    {
        conn.Open();
        SqlCommand cmd = conn.CreateCommand();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "select * from [get_view]";
        cmd.ExecuteNonQuery();
        DataTable dt = new DataTable();
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        sda.Fill(dt);
        comboBox1.DataSource = dt;
        comboBox1.DisplayMember = "Name";
        conn.Close();
    }

2
请解释一下你的答案是做什么的。 - Ctrl S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接