Daniel Vero Ответов: 1

Создание поля со списком и динамическое заполнение элементов


У меня есть поле со списком (cboTable), которое содержит список таблиц базы данных. Когда я выбираю таблицу, она должна генерировать несколько полей со списком, содержащих имя столбцов таблицы. Если таблица содержит 4 столбца, то следует создать 4 поля со списком, имя каждого из которых будет использоваться по умолчанию.

Я хочу изменить текущие коды, чтобы я мог создавать поля со списком и динамически заполнять их элементы. Может ли кто-нибудь помочь мне сделать это? Спасибо.

private void cboTable_SelectedIndexChanged(object sender, EventArgs e)
    {
        TableID = cboTable.SelectedItem.ToString();
        SqlCommand cmd;
        SqlDataReader dr;

        SqlConnection CS = new SqlConnection();
        CS.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conel"].ConnectionString;
        cmd = new SqlCommand("select Column_name from Information_schema.columns where Table_name = @TableID");
        CS.Open();
        cmd.Connection = CS;
        cmd.Parameters.AddWithValue("@TableID", cboTable.SelectedItem.ToString());
        dr = cmd.ExecuteReader();
        

        cboON1.Items.Clear();
        cboON2.Items.Clear();
        cboON3.Items.Clear();
        cboON4.Items.Clear();

        while (dr.Read())
        {
            cboON1.Items.Add(dr["Column_name"]);
            cboON2.Items.Add(dr["Column_name"]);
            cboON3.Items.Add(dr["Column_name"]);
            cboON4.Items.Add(dr["Column_name"]);
        }

        cboON1.SelectedIndex = 0;
        cboON2.SelectedIndex = 1;
        cboON3.SelectedIndex = 2;
        cboON4.SelectedIndex = 3;

        CS.Close();

    }


Что я уже пробовал:

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

for (int i = 1; i < 5; i++)
                {
                    ComboBox cb = new ComboBox();
                    cb.Location = new Point(475, 25 * i + 210);
                    switch (i)
                    {
                        case 0:
                            cb.Click += new EventHandler(ButtonClick2);
                            break;

                    }

                    this.Controls.Add(cb);
                    while (dr.Read()) 
                    {
                         cb.Items.Add(dr["Column_name"]);
                    }
                    
                }

BillWoodruff

Если есть четыре таблицы данных, и вы выбираете одну из них ... и вы хотите, чтобы второй ComboBox показывал имена столбцов выбранной таблицы: почему вам нужно показывать четыре дополнительных ComboBox, а не один ?

Daniel Vero

Потому что мне нужно сравнить каждое поле со списком с другими полями со списком, которые показывают имя столбца из файла excel.

BillWoodruff

Мне все еще неясно, каковы ваши намерения здесь. Вы выбираете DataTable в одном ComboBox; затем вы создаете новые ComboBoxes для каждого столбца в выбранном DataTable. Вы добавляете имя столбца в новые выпадающие списки.

1. имеет ли каждая таблица данных одинаковое количество столбцов ? Всегда #4 ?

2. тогда что: что еще входит во вновь созданные комбо-боксы ?

1 Ответов

Рейтинг:
1

Maciej Los

Следуйте инструкциям из MSDN: Добавление элементов управления в Windows forms с помощью Visual C# - C# | Microsoft Docs[^]

[РЕДАКТИРОВАТЬ]

Прежде всего, добавьте эту строку в верхней части формы:

//this is needed for later use
List<ComboBox> comboBoxes  = new List<ComboBox>();


Во-вторых, добавьте эту процедуру:
private void RemoveExistingComboBoxes()
{
    foreach (ComboBox cb in comboBoxes)
        this.Controls.Remove(cb);
    comboBoxes.Clear();
}


Наконец, в cboTable_SelectedIndexChanged событие:

DataTable dt = new DataTable();
string tid = cboTable.SelectedItem.ToString();
string connString  = CS.ConnectionString = ConfigurationManager.ConnectionStrings["conel"].ConnectionString;

using(SqlConnection CS = new SqlConnection(connString))
	using(SqlCommand cmd = new SqlCommand("select Column_name from Information_schema.columns where Table_name = @TableID", CS))
	{
		CS.Open();
	    cmd.Parameters.AddWithValue("@TableID", tid);
		using(SqlDataReader reader = cmd.ExecuteReader())
			dt.Load(reader);
	}
RemoveExistingComboBoxes();
for(int i = 0; i<dt.Rows.Count; i++)
{
	
	ComboBox cb = new ComboBox();
	//populate other properties here
	cb.Parent = this;
	comboBoxes.Add(cb);
}


Это все. Удачи вам!


BillWoodruff

Мой голос №1: код OP показывает, что он знает, как добавлять элементы управления в форму.

Maciej Los

Билл, взгляни на код операции. Его cboTable_SelectedIndexChanged процедура не ссылается на код, в котором создаются comboboxes. Он звонит Clear() метод для постоянного набора comboboxes {cboON1, cboON2, cboON3, cboON3}.
Что касается меня, то ОП использует несколько фрагментов кода, не имея ни малейшего представления о том, как связать их друг с другом.

BillWoodruff

этот.Управления.Добавить(cb);

Он знает, как добавить элементы управления в форму.

- Что касается меня, то ОП использует несколько фрагментов кода, не имея ни малейшего представления о том, как связать их друг с другом."

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

Maciej Los

Вы пытаетесь привлечь меня, чтобы улучшить мой ответ, но я ленив... ;)

BillWoodruff

Лень гарантирует отрицательное голосование :)

Maciej Los

Билл, ты дал мне мотивацию, чтобы улучшить мой ответ. Теперь это приемлемо?

Sandeep Mewara

5!

Maciej Los

Спасибо, Сандип.