WinForms - динамическое создание текстового поля на основе выбора ComboBox - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь создать TextBox на основе выбора ComboBox динамически на основе следующих шагов:

Первый шаг (выберите источник из ComboBox):

1st SS

Второй шаг (Textbox должно появиться на основе ComboBox.SelectedValue):

2ND SS

Последний шаг (новый ComboBox должен появиться ниже):

enter image description here

Я создал функцию createTextBox, используя следующий код:

public void createTextBox(int numPassenger)
{
    TextBox[] passengerBoxes = new TextBox[numPassenger];

    for (int u = 0; u < passengerBoxes.Count(); u++)
    {
        passengerBoxes[u] = new TextBox();
    }
    int i = 0;
    foreach (TextBox txt in passengerBoxes)
    {
        string name = "passenger" + i.ToString();

        txt.Name = name;
        txt.Text = name;
        txt.Location = new Point(244, 32 + (i * 28));
        txt.Visible = true;
        this.Controls.Add(txt);
        i++;
    }
}

Есть ли способ изменить мою текущую функцию, чтобы приспособиться к упомянутым шагам? Кроме того, как мне найти динамически созданный TextBox?

1 Ответ

0 голосов
/ 06 мая 2020

Вы можете попробовать следующий код:

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        createTextBox(sender as ComboBox);
    }
    private void createTextBox(ComboBox cmb)
    {
        TextBox passengerBoxes = new TextBox();
        string name = cmb.Text;
        if (Controls.Find(name, true).Length == 0)
        {
            passengerBoxes.Name = name;
            passengerBoxes.Text = name;
            int textBoxCount = GetTextBoxCount();
            passengerBoxes.Location = new Point(244, 32 + (textBoxCount * 28));
            passengerBoxes.Visible = true;
            this.Controls.Add(passengerBoxes);

            if (cmb.Items.Count != 1)//last item remaining then we should not create new combo box
            {
                ComboBox newCombo = new ComboBox
                {
                    Location = new Point(cmb.Location.X, 32 + ((textBoxCount + 1) * 28))
                };

                foreach (string str in cmb.Items)
                    if (cmb.Text != str)
                        newCombo.Items.Add(str);

                newCombo.SelectedIndexChanged += comboBox1_SelectedIndexChanged;

                this.Controls.Add(newCombo);
            }
        }
        else
            MessageBox.Show("Textbox Already for the selected source " + name);
    }

    private int GetTextBoxCount()
    {
        int i = 0;
        foreach (Control ctl in this.Controls)
        {
            if (ctl is TextBox) i++;
        }
        return i;
    }
...