Возникли проблемы при попытке создать много комбо-боксов, которые содержат содержимое базы данных MySQL в качестве источника - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь сделать приложение WPF.У меня есть кнопка, которая генерирует 100 комбинированных списков в сетке.Я хочу, чтобы эти выпадающие списки наследовали значения в таблице MySQL.Поэтому я хочу, чтобы все эти 100 комбинированных списков имели одинаковые значения внутри комбинированных списков.Так, например, у меня есть таблица с именем test, которая имеет и ID (с автоматическим приращением) и число.Внутри этой таблицы я добавил 3 записи, 1,2 и 3. Я хочу, чтобы все мои выпадающие списки отображали под ней 1,2 и 3.

private void Add_New_Entry(object sender, RoutedEventArgs e)
        {
            grid.RowDefinitions.Clear();
            for (int x = 0; x < number; x++)
            {
                grid.RowDefinitions.Add(new RowDefinition());
                stekker1 = new ComboBox();
                stekker1.Name = "testkastComboBox" + number.ToString();
                stekker1.ItemsSource = multistore;




                Grid.SetRow(stekker1, x);
                Grid.SetColumn(stekker1, 0);

                aansluitpin1 = new ComboBox();
                Grid.SetRow(aansluitpin1, x);
                Grid.SetColumn(aansluitpin1, 1);

                sep = new Separator();
                Grid.SetRow(sep, x);
                Grid.SetColumn(sep, 2);

                lab1 = new Label();
                int labelnumber = x + 1;
                lab1.Content = labelnumber.ToString();
                lab1.HorizontalAlignment = HorizontalAlignment.Center;
                Grid.SetRow(lab1, x);
                Grid.SetColumn(lab1, 3);

                sep1 = new Separator();
                Grid.SetRow(sep1, x);
                Grid.SetColumn(sep1, 4);


                stekker2 = new ComboBox();
                Grid.SetRow(stekker2, x);
                Grid.SetColumn(stekker2, 5);


                aansluitpin2 = new ComboBox();
                Grid.SetRow(aansluitpin2, x);
                Grid.SetColumn(aansluitpin2, 6);

                grid.Children.Add(stekker1);
                grid.Children.Add(aansluitpin1);
                grid.Children.Add(sep);
                grid.Children.Add(lab1);
                grid.Children.Add(sep1);
                grid.Children.Add(stekker2);
                grid.Children.Add(aansluitpin2);
            }


        }

Это функция, которую я использую.Когда я нажимаю кнопку, эта функция вызывается.Я вижу сетку 7 на 100: enter image description here

Следующий код:

private void aanPinStekKast(object sender, EventArgs e)
        {
            //ClearTable();
            try
            {
                //multistore.Clear();
                AantalPinnenStekkersTestkast.Items.Clear();
                connection.Open();
                // Deze SQL string maakt een table aan met daarin de parameters.
                sqlstring = "SELECT * FROM test";
                MySqlCommand cmd = new MySqlCommand(sqlstring, connection);
                MySqlDataReader rdr;
                rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    AantalPinnenStekkersTestkast.Items.Add(rdr["number"]);
                }
                cmd.Dispose();

                connection.Close();
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message + connectionString);
                //button1.BackColor = Color.Red;
                connection.Close();
            }
        }

Работает, извлекает данные и добавляет их в выпадающий список.,Как я могу сделать так, чтобы каждый первый комбинированный список в строке добавлял данные, извлеченные из таблицы MySQL?Извините за мой английский, это не мой родной язык.

edit1: я использовал метод FillComboBox, указанный Брэдли Грейнджером, и добавил функции DropDownOpened и SelectionChanged для решения моих проблем.Работает отлично и работает без проблем.Мой компьютер может легко обрабатывать количество запросов MySQL.

private void Add_New_Entry()
        {
            connection.Open();
            for (int x = 0; x < number; x++)
            {
                grid.RowDefinitions.Add(new RowDefinition());
                stekker1 = new ComboBox();
                aansluitpin1 = new ComboBox();
                sep = new Separator();
                lab1 = new Label();
                sep1 = new Separator();
                stekker2 = new ComboBox();
                aansluitpin2 = new ComboBox();


                FillStekker1(stekker1,x);
                FillAansluitpin1(aansluitpin1,x);
                FillSeparator1(sep, x);
                FillLabel(lab1, x);
                FillSeparator2(sep1,x);
                FillStekker2(stekker2,x);
                FillAansluitpin2(aansluitpin2,x);

                grid.Children.Add(stekker1);
                grid.Children.Add(aansluitpin1);
                grid.Children.Add(sep);
                grid.Children.Add(lab1);
                grid.Children.Add(sep1);
                grid.Children.Add(stekker2);
                grid.Children.Add(aansluitpin2);
            }
            connection.Close();
        }
        #endregion
        #region set parameters van elementen in grid
        private void FillLabel(Label lab, int num)
        {
            lab.Height = 30;
            int labelnumber = num + 1;
            lab.Content = labelnumber.ToString();
            lab.HorizontalAlignment = HorizontalAlignment.Center;
            Grid.SetRow(lab, num);
            Grid.SetColumn(lab, 3);
        }

        private void FillStekker1(ComboBox comboBox, int num)
        {
            comboBox.ItemsSource = numlistTestkast;
            comboBox.SelectionChanged += Aansluitpin1_SelectionChanged;
            comboBox.Height = 30;
            Grid.SetRow(comboBox, num);
            Grid.SetColumn(comboBox, 0);
        }
        private void populateElement1(object sender, EventArgs e)
        {

            try
            {
                ComboBox cb = sender as ComboBox;
                cb.Items.Clear();
                connection.Open();
                string num = aPin1;
                sqlstring = string.Format("SELECT * FROM testkastpins WHERE stekkernummer = {0}",num);
                MySqlCommand cmd = new MySqlCommand(sqlstring, connection);
                MySqlDataReader rdr;
                rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    cb.Items.Add(rdr["pinnummer"]);
                }
                cmd.Dispose();

                connection.Close();
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message + connectionString);
                connection.Close();
            }
        }
        private void populateElement2(object sender, EventArgs e)
        {

            try
            {
                ComboBox cb = sender as ComboBox;
                cb.Items.Clear();
                connection.Open();
                string num = aPin2;
                sqlstring = string.Format("SELECT * FROM testpaneelpins WHERE stekkernummer = {0}", num);
                MySqlCommand cmd = new MySqlCommand(sqlstring, connection);
                MySqlDataReader rdr;
                rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    cb.Items.Add(rdr["pinnummer"]);
                }
                cmd.Dispose();

                connection.Close();
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message + connectionString);
                connection.Close();
            }
        }
        private void FillStekker2(ComboBox comboBox, int num)
        {
            comboBox.Height = 30;
            comboBox.SelectionChanged += Aansluitpin2_SelectionChanged;
            comboBox.ItemsSource = numlistTestpaneel;
            Grid.SetRow(comboBox, num);
            Grid.SetColumn(comboBox, 5);
        }
        private void FillAansluitpin1(ComboBox comboBox, int num)
        {
            comboBox.Height = 30;
            //comboBox.ItemsSource = store1;
            comboBox.DropDownOpened += new EventHandler(populateElement1);
            Grid.SetRow(comboBox, num);
            Grid.SetColumn(comboBox, 1);
        }
        private void Aansluitpin1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox cb = sender as ComboBox;
            aPin1 = cb.SelectedValue.ToString();
            debug.Text += aPin1;
        }
        private void Aansluitpin2_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox cb = sender as ComboBox;
            aPin2 = cb.SelectedValue.ToString();
            debug.Text += aPin2;
        }

        private void FillAansluitpin2(ComboBox comboBox, int num)
        {
            comboBox.Height = 30;
            comboBox.DropDownOpened += new EventHandler(populateElement2);
            Grid.SetRow(comboBox, num);
            Grid.SetColumn(comboBox, 6);
        }
        private void FillSeparator1(Separator separator, int num)
        {
            separator.Height = 30;
            Grid.SetRow(separator, num);
            Grid.SetColumn(separator, 2);
        }

        private void FillSeparator2(Separator separator, int num)
        {
            separator.Height = 30;
            Grid.SetRow(separator, num);
            Grid.SetColumn(separator, 4);
        }

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Внутри метода создайте список и добавьте свои значения в список, который вам нужен в комбинированных полях.Затем создайте другой метод, чтобы назначить этот список всем вашим комбинированным спискам.Затем вызовите обе функции в событии загрузки формы.

Я думаю, что это самый простой способ.

0 голосов
/ 13 октября 2018

Ваш цикл в Add_New_Entry создает 100 полей со списком.Что вам нужно сделать, это заполнить каждое поле со списком в каждой итерации цикла.

Вы можете изменить (или скопировать) свой метод aanPinStekKast, чтобы взять ComboBox в качестве параметра и добавить к его .Items collection.

private void Add_New_Entry(object sender, RoutedEventArgs e)
{
    grid.RowDefinitions.Clear();
    for (int x = 0; x < number; x++)
    {
        grid.RowDefinitions.Add(new RowDefinition());

        // ...

        aansluitpin1 = new ComboBox();
        Grid.SetRow(aansluitpin1, x);
        Grid.SetColumn(aansluitpin1, 1);

        // THIS IS THE CHANGE
        // fill each combo box as you create it
        FillComboBox(aansluitpin1);

        // ...
    }
}

private void FillComboBox(ComboBox comboBox)
{
    // same code as aanPinStekKast
    // but modify 'comboBox' instead of AantalPinnenStekkersTestkast
}

Обратите внимание, что если вы хотите, чтобы в каждом поле со списком была одна и та же коллекция элементов, выполнение одного запроса для каждого поля со списком стоит дорого (и может привести к зависанию пользовательского интерфейса).Чтобы это исправить, создайте коллекцию (например, List<string>) элементов из базы данных один раз, а затем используйте эту коллекцию в памяти для инициализации каждого ComboBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...