所有ComboBoxItem ValueMembers都是DataReader的最后一项

时间:2012-03-14 08:11:37

标签: c# combobox sqldatareader

我在运行时将项添加到ComboBox。一切正常但问题是ValueMember只显示所有项目中最后一条记录的值。我想要ValueMember中的当前项目。

string qr1 = "select * from categorymaster";
SqlCommand cmd1 = new SqlCommand(qr1, con);
con.Open();
SqlDataReader dr1 = cmd1.ExecuteReader();
cmbcat.Items.Clear();

while (dr1.Read())
{
    cmbcat.Items.Add(dr1[1].ToString());
    cmbcat.DisplayMember = dr1[1].ToString();
    cmbcat.ValueMember = dr1[0].ToString();
}
con.Close();

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

DisplayMemberValueMember引用对象中属性的名称,而不是代码中的值。由于您不使用任何对象填充项目,而只使用值,因此根本不需要设置它们。

但总的来说你的方法需要工作!最好创建一个对象,将两个属性中的读取器值保留在两个属性中,并将其定义为ValueMember,将另一个定义为DisplayMember

答案 1 :(得分:1)

循环时不需要使用值成员

string qr1 = "select * from categorymaster";
        SqlCommand cmd1 = new SqlCommand(qr1, con);
        con.Open();
        SqlDataReader dr1 = cmd1.ExecuteReader();
        cmbcat.Items.Clear();
        while (dr1.Read())
        {
            cmbcat.Items.Add(new Item(dr1[1].ToString(), dr1[0].ToString()));

        }
        con.Close();

答案 2 :(得分:1)

每次在while循环中浏览阅读器中的项目时,都会向ComboBox添加项目。到目前为止一切顺利,但是你将ComboBox的Display - 和ValueMember设置为从阅读器读取的最后一项。所以最后ComboBox的Display - 和ValueMember等于读取的最后一项。

修改

要获得正确的解决方案,请查看@ionden @PraVn已经给出的答案:使用DataTable / Source或只是在循环中添加项目。