C#Windows窗体:循环浏览dynamic创build的文本框,并检查是否已更改文本

我正在尝试创build一个graphics化的SQL编辑器 – 但我不喜欢表格的视觉效果,并试图添加更多的交互性(拖放等)。

我已经完成并创build了基于每条logging的面板,并根据我的表中的每条logging向每个面板添加了文本框。 我现在卡住的是循环dynamic创build的控件,检查它们的状态或与它们交互的概念。

请让我知道,如果你看到我如何构造这个问题。

我的代码如下:

生成面板的代码:

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) { } 

所以我想我不能包装我的头,因为我在运行时创build文本框,所以我会在运行时检查它。

谢谢你的帮助!

例如:如果我想检查文本是否改变了我放在窗体上的文本框,我会这样做:

 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; 

您可以以同样的方式执行此操作,就像手动将文本框放入位置一样。 你只需要订阅每个新的TextBoxTextChanged事件。

 var x = new TextBox(); x.TextChanged += textBox1_TextChanged; 

在旧版本的.Net中,您可能需要指定委托。 有关更多信息,请参阅有关主题的MSDN 。

在创建控件时,您需要在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 }