C#ComboBox Selected Value从数据库返回Null、Item和Value

C#ComboBox Selected Value从数据库返回Null、Item和Value,c#,combobox,C#,Combobox,我将员工的姓氏和名字添加到一个正在工作的组合框中,例如LastName,FirstName。。该值应设置为EmpID,以便在选择项目时,EmpID将作为值返回 conn.Open(); using (SqlCommand cmd = new SqlCommand("Select (LastName + ', ' + FirstName) AS Employee,EmpID from Employee ", conn)) using (SqlDataReader rdr = cmd.Execut

我将员工的姓氏和名字添加到一个正在工作的组合框中,例如LastName,FirstName。。该值应设置为EmpID,以便在选择项目时,EmpID将作为值返回

conn.Open(); 
using (SqlCommand cmd = new SqlCommand("Select (LastName + ', ' + FirstName) AS Employee,EmpID from Employee ", conn))
using (SqlDataReader rdr = cmd.ExecuteReader())
{
    while (rdr.Read())
    {
        ListItem ComboItem = new ListItem();
        ComboItem.Text = rdr["Employee"].ToString();
        //ComboItem.Value = rdr["EmpID"].ToString();

        ComboItem.Value = rdr["EmpID"].ToString() ;
        GrpEmpCBox.Items.Add(ComboItem);  
        //GrpEmpCBox.Items.Add(rdr["Employee"].ToString());
    }
}
但是当我得到它的值时,它返回null

private void btnRunReport_Click(object sender, EventArgs e)
{
    EmployeeTimecardReport rptEmpTimecard = new EmployeeTimecardReport();
    rptEmpTimecard.Employee = GrpEmpCBox.SelectedValue.ToString(); //<--- this returns null
}
private void btnRunReport_单击(对象发送者,事件参数e)
{
EmployeeTimecardReport rptEmpTimecard=新的EmployeeTimecardReport();

rptpemptimecard.Employee=grpempbox.SelectedValue.ToString();//改用
DisplayMember
ValueMember
属性

有很多方法可以实现这一点……这里有一种:

comboBox1.ValueMember = "Item1";     // the value of the selected item
comboBox1.DisplayMember = "Item2";   // the field to display to the user

var emps = new List<Tuple<int, string>>();

while (rdr.Read())
    emps.Add(Tuple.Create(Convert.ToInt32(rdr["EmpID"]), rdr["Employee"].ToString()));

comboBox1.DataSource = emps;

我将添加第二个示例来演示这些属性的作用

假设您创建了一个Employee类

public class Employee
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime HireDate { get; set; }
}
然后从数据库中的Employee表中提取一组数据

var emps = new List<Employee>();

while (rdr.Read())
    emps.Add(new Employee(ID = Convert.ToInt32(rdr["EmpID"]),
                          Name = rdr["Employee"].ToString(),
                          Age = Convert.ToInt32(rdr["Age"]),
                          HireDate = Convert.ToDateTime(rdr["Hired"])));

comboBox1.DataSource = emps;

现在,您可以分别使用
comboBox1.SelectedValue
Combox1.Text
获取这些值。或者您也可以获取整个
Employee
记录,它存储在
Combox1.SelectedItem

中。它正在工作。我可以知道ValueMember和DisplayMember的用途吗??
var emps = new List<Employee>();

while (rdr.Read())
    emps.Add(new Employee(ID = Convert.ToInt32(rdr["EmpID"]),
                          Name = rdr["Employee"].ToString(),
                          Age = Convert.ToInt32(rdr["Age"]),
                          HireDate = Convert.ToDateTime(rdr["Hired"])));

comboBox1.DataSource = emps;
comboBox1.ValueMember = "ID";
comboBox1.DisplayMember = "Name";