Установите несколько полей со списком в один и тот же источник данных

#c# #combobox

#c# #поле со списком

Вопрос:

У меня есть несколько списков со списком в моей форме в panel1. Я использую этот код для добавления одних и тех же источников данных в выпадающие списки panel1;

 foreach (Control x in this.Panel1.Controls)
{
    if (x is ComboBox)
    {
        ((ComboBox)x).DataSource = new BindingSource(tblbatteryBindingSource, null);
        ((ComboBox)x).DisplayMember = "description";
    }
}
  

Использование нового источника привязки связано с использованием того же источника данных.

Но здесь есть проблема: в моей таблице источников данных у меня есть такие столбцы: Id — Name — Count

Когда я добавляю две строки с одинаковым именем в поле со списком, он возвращает только первое значение и игнорирует другие.

Пример для большего понимания:

 Id     Name     Count
1      first    10
2      second   10
3      third    10
4      first    12
5      first    5
  

Это моя таблица ^

но теперь в поле со списком, когда я выбираю значение, в метке отображаются счетчики:

 Id-> 1       cmb1.SelectedItem = "first"      label1.Text = "10"
Id-> 2       cmb1.SelectedItem = "second"     label1.Text = "10"
Id-> 3       cmb1.SelectedItem = "third"      label1.Text = "10"
Id-> 4       cmb1.SelectedItem = "first"      label1.Text = "10"
Id-> 5       cmb1.SelectedItem = "first"      label1.Text = "10"
  

это то, что случилось со мной. но это не так. это должно быть так:

 Id-> 1       cmb1.SelectedItem = "first"      label1.Text = "10"
Id-> 2       cmb1.SelectedItem = "second"     label1.Text = "10"
Id-> 3       cmb1.SelectedItem = "third"      label1.Text = "10"
Id-> 4       cmb1.SelectedItem = "first"      label1.Text = "12"
Id-> 5       cmb1.SelectedItem = "first"      label1.Text = "5"
  

Извините за мой плохой английский и плохое объяснение.

Пожалуйста, скажите мне, что делать? Я уже везде искал!

Ответ №1:

Вам необходимо указать правильные имена столбцов для DisplayMember и ValueMember в поле со списком. В соответствии с вашей таблицей примеров проверьте следующее:

 (ComboBox)x).DisplayMember = "Name";
(ComboBox)x).ValueMember = "Count";
  

Я протестировал следующий код, чтобы проверить ваши результаты:

     private void Form1_Load(object sender, EventArgs e)
    {           

        label1.Text = label2.Text = label3.Text = String.Empty;

        // strCon is connection string
        SqlConnection con = new SqlConnection(strCon);
        SqlCommand cmd = new SqlCommand("Select * from testTable", con);
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = cmd;

        con.Open();
        da.Fill(dt);
        con.Close();

        foreach (Control x in this.Panel1.Controls)
        {
            if (x is ComboBox)
            {
                ((ComboBox)x).DataSource = new BindingSource(dt, null);
                ((ComboBox)x).DisplayMember = "Name";
                ((ComboBox)x).ValueMember = "Count";
            }
        }
    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        label1.Text = comboBox1.SelectedValue.ToString();
    }

    private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
    {
        label2.Text = comboBox2.SelectedValue.ToString();
    }

    private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
    {
        label3.Text = comboBox3.SelectedValue.ToString();
    }
  

Надеюсь, это поможет 🙂