С# Windows Form: циклический просмотр динамически созданных текстовых полей и проверка того, изменился ли текст

Я пытаюсь создать своего рода графический редактор SQL, но мне не нравятся визуальные эффекты таблицы, и я пытаюсь добавить больше интерактивности (перетаскивание и т. д.).

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

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

Мой код выглядит следующим образом:

Код, который генерирует панели:

  private void comboBox1_SelectedIndexChanged_1(object sender, EventArgs e)
    {
        groupBox1.Controls.Clear();
        string pDBString = null;
        SqlConnection cnn;
        pDBString = "Data Source=localhost\\" + Form1.host + ";Initial Catalog=" + Form1.db + ";Integrated Security=SSPI;";
        cnn = new SqlConnection(pDBString);
        string sqlForProps = "select * from PROPS where user_id_txt ='" + comboBox1.SelectedItem.ToString() + "'";
        try
        {
            using (cnn)
            {
                cnn.Open();
                SqlCommand cmd = new SqlCommand(sqlForProps, cnn);
                SqlDataReader sqlReader = cmd.ExecuteReader();

                int x = 0;
                int count = 0;
                while (sqlReader.Read())
                {
                    Panel panel = new System.Windows.Forms.Panel();
                    panel.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
                    x += 30;
                    panel.Location = new System.Drawing.Point(3, x);
                    panel.Name = "panel" + count;
                    panel.Size = new System.Drawing.Size(519, 30);
                    panel.TabIndex = 3;
                    PropsPanels.Add(panel);
                    groupBox1.Controls.Add(panel);

                    TextBox textbox = new System.Windows.Forms.TextBox();
                    panel.Controls.Add(textbox);
                    textbox.Location = new System.Drawing.Point(1, 3);
                    textbox.Name = "textBox" + count;
                    textbox.Size = new System.Drawing.Size(100, 20);
                    textbox.TabIndex = 4;
                    textbox.Text = sqlReader["USER_ID_TXT"].ToString();

                    TextBox textboxAM = new System.Windows.Forms.TextBox();
                        panel.Controls.Add(textboxAM);
                        textboxAM.Location = new System.Drawing.Point(126, 3);
                        textboxAM.Name = "textBoxAM" + count;
                        textboxAM.Size = new System.Drawing.Size(100, 20);
                        textboxAM.TabIndex = 4;
                        textboxAM.Text = sqlReader["PROP_TXT"].ToString();

                    TextBox textboxAMSet = new System.Windows.Forms.TextBox();
                        panel.Controls.Add(textboxAMSet);
                        textboxAMSet.Location = new System.Drawing.Point(232, 3);
                        textboxAMSet.Name = "textBoxAM" + count;
                        textboxAMSet.Size = new System.Drawing.Size(100, 20);
                        textboxAMSet.TabIndex = 4;
                        textboxAMSet.Text = sqlReader["VAL_TXT"].ToString();
                    count++;
                }
                sqlReader.Close();
                cnn.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Can not open connection !");
        }

    }

Код, который должен проверять панели:

        public AMMain()
    {

        InitializeComponent();
        string pDBString = null;
        SqlConnection cnn;
        pDBString = "Data Source=US7-AHACKETT\\SQLEXPRESS;Initial Catalog=OrchestroConfigurationDB;Integrated Security=SSPI;";
        MessageBox.Show(pDBString);
        cnn = new SqlConnection(pDBString);
        try
        {
            using (cnn)
            {
                SqlCommand sqlForUserList = new SqlCommand("select UserName from users a join Company b on a.CompanyID = b.CompanyID where CompanyCode='" + Form1.company + "'", cnn);
                cnn.Open();
                MessageBox.Show("Connection Open !");
                SqlDataReader sqlReader = sqlForUserList.ExecuteReader();
                while (sqlReader.Read())
                {
                    comboBox1.Items.Add(sqlReader["UserName"].ToString());
                }
                sqlReader.Close();
                cnn.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Can not open connection !");
        }

        foreach (Panel p in PropsPanels)
        {
            foreach (Control c in p.Controls)
            {
                if(c is TextBox)
                {
                    object sender = new object();
                    EventArgs e = new EventArgs();
                    if(c.TextChanged()??????)
                    {
                     //DOSOMETHING   
                    }
                }
            }
        }
    }

Например: если бы я хотел проверить, изменился ли текст для текстового поля, которое я поместил в форму, я бы сделал так:

        private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

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

Спасибо за любую помощь!


person ahackit    schedule 01.02.2017    source источник
comment
При создании текстовых полей в методе comboBox1_SelectedIndexChanged_1 назначьте обработчик событий для параметра TextChanged этого текстового поля. ИЭ: textbox.TextChanged += myEventHandler;   -  person Ryan C    schedule 01.02.2017


Ответы (3)


Например: если бы я хотел проверить, изменился ли текст для текстового поля, которое я поместил в форму, я бы сделал так:

private void textBox1_TextChanged(object sender, EventArgs e)
{

}

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

Ты делаешь тоже самое!

Сначала создайте метод для обработки события:

private void TextBoxTextChanged(object sender, EventArgs e) {
    // you can use the sender argument to check exactly which text box's text changed
}

Когда вы инициализируете свою форму, вы делаете это:

textbox.TextChanged += TextBoxTextChanged;
textboxAM.TextChanged += TextBoxTextChanged;
textboxAMSet.TextChanged += TextBoxTextChanged;
person Sweeper    schedule 01.02.2017
comment
Спасибо за помощь! Когда вы говорите, когда вы инициализируете свою форму, вы делаете это:. Не могли бы вы пояснить, что вы имеете в виду? Означает ли это, что когда я создаю настоящие текстовые поля, я должен объявить это? - person ahackit; 01.02.2017
comment
Вы подключаете обработчик событий TextBoxTextChanged к событиям текстовых полей, чтобы он вызывался, как в конструкторе общежитий @user249784. - person Sweeper; 01.02.2017
comment
О, я понимаю, что вы говорите. Спасибо! - person ahackit; 01.02.2017

Вы можете сделать это так же, как если бы вы вручную поместили текстовые поля на место. Вам просто нужно подписаться на каждое новое событие TextChanged TextBox.

var x = new TextBox();

x.TextChanged += textBox1_TextChanged;

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

person CDove    schedule 01.02.2017

Вам необходимо зарегистрироваться в делегате TextChanged при создании элементов управления.

TextBox textbox = new System.Windows.Forms.TextBox();
panel.Controls.Add(textbox);
textbox.Location = new System.Drawing.Point(1, 3);
textbox.Name = "textBox" + count;
textbox.TextChanged += TextBox_TextChanged

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

  private void(object sender, EventArgs e)
    {
        //get name of textbox
        var tb = (TextBox) sender;
        // do whatever with text box
    }
person Cam Bruce    schedule 01.02.2017
comment
Спасибо - это имеет смысл. Я это попробую. - person ahackit; 01.02.2017