Все значения-члены ComboBoxItem являются последним элементом DataReader - PullRequest
0 голосов
/ 14 марта 2012

Я добавляю элементы в 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();

Может кто-нибудь мне помочь?

Ответы [ 4 ]

3 голосов
/ 14 марта 2012

DisplayMember и ValueMember относятся к именам свойств в объекте, а не к значениям, как в вашем коде. Поскольку вы не заполняете элементы каким-либо объектом, а просто значениями, вам вообще не нужно их устанавливать.

Но в целом ваш подход нуждается в работе! Лучше создавать объекты, в которых вы сохраняете оба значения из вашего считывателя в двух свойствах и определяете одно как ValueMember, а другое - DisplayMember.

2 голосов
/ 14 марта 2012

Если вы хотите использовать ValueMember и DisplayMember в вашей ситуации, вы должны заполнить DataTable и установить для DataSource значение ComboBox:

 DataTable dt = new DataTable();
 dt.Columns.Add("ID");
 dt.Columns.Add("CategoryName");

 cmbcat.DisplayMember = "CategoryName";
 cmbcat.ValueMember = "ID";
 cmbcat.DataSource = dt;
1 голос
/ 14 марта 2012

Каждый раз, когда вы просматриваете элемент из читателя в цикле while, вы добавляете элемент в ComboBox.Пока все хорошо, но затем вы устанавливаете Display - и ValueMember ComboBox на последний элемент, который читается читателем.Таким образом, в конце ComboBox Display - и ValueMember равны последнему прочитанному элементу.

Редактировать:

Чтобы найти правильное решение, посмотрите на уже готовые ответы.предоставлено @ionden en @PraVn: использование DataTable / Source или просто добавление элементов в цикл.

1 голос
/ 14 марта 2012

Вам не нужно использовать значение элемента во время цикла

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();
...