【问题标题】:C# ComboBox Selected Value returns Null, Item and Value both from DatabaseC# ComboBox Selected Value 从数据库返回 Null、Item 和 Value
【发布时间】:2016-08-27 21:19:33
【问题描述】:

我将员工姓氏和名字添加到一个正在工作的组合框中,例如。 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
}

这可能吗?我正在尝试不使用数据绑定

我的组合框属性:

数据源:无

显示成员:无

值成员:无

DropDownStyle:下拉列表

【问题讨论】:

    标签: c# combobox


    【解决方案1】:

    请改用DisplayMemberValueMember 属性。

    您可以通过多种方式实现这一点...这里有一个:

    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;
    

    然后显示选中项的值:

    var selectedValue = comboBox1.SelectedValue.ToString();
    

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

    假设您创建了一个 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;
    

    您可以从您的类中选择两个属性来 (1) 向用户显示 (DisplayMember) 和 (2) 充当基础值 (ValueMember)。

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

    现在您可以分别使用comboBox1.SelectedValuecomboBox1.Text 获取这些值。或者您可以直接获取整个Employee 记录,该记录存储在comboBox1.SelectedItem 中。

    【讨论】:

    • 它正在工作..我可以知道 ValueMember 和 DisplayMember 的用途吗??
    【解决方案2】:

    如果您使用了 DisplayMember 和 ValueMember 属性,但仍然出现 Null 错误

    如果要使用 DisplayMember 和 ValueMember 属性,则必须设置 Combobox 控件的 DataSource 属性。 代码示例

    List<(int,string)> F = new List<(int,string)>();
             
               
                DataTable d = ConnandDisConnMode.Program.DisConnectedMode();
                for (int i = 0; i < d.Rows.Count; i++)
                {
                    F.Add(((int)d.Rows[i]["id"], d.Rows[i]["Name"].ToString()));
                }
    
                comboBox1.DisplayMember = "Text";
                comboBox1.ValueMember = "Value";
                foreach (var item in F)
                {
                    ComboboxItem i = new ComboboxItem();
                    i.Text = item.Item2;
                    i.Value = item.Item1;
                    comboBox1.Items.Add(i);
                }
    

    这将使 Combobox.SelectedValue 返回 NUll 您必须将代码更改为这样

    comboBox1.DisplayMember = "Text";
                comboBox1.ValueMember = "Value";
                List<ComboboxItem> z = new List<ComboboxItem>();
                foreach (var item in F)
                {
                    ComboboxItem i = new ComboboxItem();
                    i.Text = item.Item2;
                    i.Value = item.Item1;
                    z.Add(i);
                    //comboBox1.Items.Add(i);
                }
                comboBox1.DataSource = z;
    

    【讨论】:

      【解决方案3】:

      在我的例子中,这个问题是由于不小心调用整个表单的InitializeComponent() 两次,一次之前和一次之后设置了组合框的ValueMemberDisplayMember

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 1970-01-01
        • 2020-12-11
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多