C# 如何在C中的combobox显示成员中附加两个字段值

C# 如何在C中的combobox显示成员中附加两个字段值,c#,winforms,combobox,C#,Winforms,Combobox,在我的表中,我有一个名为firstname和lastname的字段,现在我想把firstname和lastname设置为组合框中的displaymember,但我不知道怎么做 像这样的 cmbEmployees.DataSource = GetEmployees(); //something like below line which doesn't work cmbEmployees.DisplayMember = "lastname, first_name"; cmbEmploye

在我的表中,我有一个名为firstname和lastname的字段,现在我想把firstname和lastname设置为组合框中的displaymember,但我不知道怎么做

像这样的

cmbEmployees.DataSource = GetEmployees();
//something like below line which doesn't work
cmbEmployees.DisplayMember = "lastname, first_name";     
cmbEmployees.ValueMember = "id";

我怎样才能做到这一点?这样lastname和firstname都将显示在组合框中

假设您有这样一个类:

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。

尝试以下方法之一:

将串联字段作为值的新词典- 计算列-
在GetEmployees函数中,您的查询应该是这样的

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

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

本例将指导您如何在不修改基类的情况下执行此操作

首先,您可以将DisplayMember保留为一个属性,例如:

cmbEmployees.DisplayMember = "lastname";
现在,以[设计]模式进入表单, 右键单击组合框->属性

在属性窗口顶部,单击事件闪电图标

在下面的Property Changed(属性更改)下的events(事件)列表中查找格式,并在其中键入一些事件名称,例如: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;
}

就这样,

在C 6中,在Employee类中创建只读属性

public string FullName=>$"{lastname} {firstname}";
然后


创建视图[dbo]。[获取视图] 像 选择CONCATsell_tb.Name、extra_tb.Name、purchase_tb.Name作为名称,从sell_tb FULL JOIN extra_tb ON extra_tb.E_ID=sell_tb.E_ID 购买时完全加入购买\u tb.S\u ID=出售\u tb.S\u 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();
    }

您可以添加一个组合这两个名称的属性。默认情况下,控件将显示ToString方法返回的内容,因此您可以覆盖它。这是一个令人惊讶的解决方案非常干净的解决方案!请注意,即使源类不是您的类,它也可以正常工作。例如,我需要它用于System.IO.SerialPort枚举,现在我不需要创建一个特殊的继承类。Eliran,你能解释一下如何设置它吗?你从哪里得到名字的,我不知道这个字段在这个例子中是什么意思。我使用datatable创建databind组合框,并根据datatable列名设置Display和ValueMember。请解释您的答案。
      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();
    }
// 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);