2017-02-01 2 views
1

J'essaie de créer un éditeur SQL graphique de sortes - mais je n'aime pas les visuels d'une table et j'essaie d'ajouter plus interactivité (glisser/déposer, etc).C# Formulaire Windows: Boucle dans TextBoxes dynamiquement créé et vérifier si le texte a changé

J'ai parcouru et créé des panneaux basés sur chaque enregistrement et ajouté des zones de texte à chaque panneau en fonction de chaque enregistrement de ma table. Ce que je suis bloqué maintenant est le concept de bouclage à travers les contrôles créés dynamiquement et de vérifier leur état ou d'interagir avec eux.

S'il vous plaît laissez-moi savoir si vous voyez des problèmes avec la façon dont je structurer cela.

Mon code est le suivant:

code qui génère les panneaux:

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 !"); 
     } 

    } 

Le code qui est censé être vérifier les panneaux:

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

Par exemple: si je voulu vérifier si le texte a changé pour une zone de texte que j'ai mis sur le formulaire que je le ferais:

 private void textBox1_TextChanged(object sender, EventArgs e) 
    { 

    } 

Donc je suppose que je ne peux pas comprendre comment je vérifierais cela au moment de l'exécution puisque je crée les Textbox à l'exécution.

Merci pour toute aide!

+0

Lors de la création dans votre méthode Encadrés 'comboBox1_SelectedIndexChanged_1', attribuez un gestionnaire d'événements au paramètre TextChanged de cette zone de texte. I.E: 'textbox.TextChanged + = myEventHandler;' –

Répondre

1

Par exemple: si je voulais vérifier si le texte a changé pour une zone de texte que je mis sur la forme que je le ferais:

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 

} 

Donc je suppose que je ne peux pas envelopper ma tête comment je voudrais vérifier cela à runtime depuis que je crée les Textboxes à l'exécution.

Vous faites pareil!

Créez une méthode pour gérer l'événement premier:

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

Lorsque vous initialisez votre formulaire, vous faites ceci:

textbox.TextChanged += TextBoxTextChanged; 
textboxAM.TextChanged += TextBoxTextChanged; 
textboxAMSet.TextChanged += TextBoxTextChanged; 
+0

Merci pour l'aide! Quand vous dites "Quand vous initialisez votre formulaire, vous faites ceci:". Cela vous dérange-t-il d'expliquer ce que vous entendez par là? Est-ce que cela signifie quand je crée les textboxes réels - je devrais déclarer cela? – user249784

+0

Vous raccordez le gestionnaire d'événements 'TextBoxTextChanged' aux événements des zones de texte afin qu'il soit appelé, tout comme dans le concepteur de dortoirs @ user249784 – Sweeper

+0

Oh, je comprends ce que vous dites. Merci! – user249784

0

Vous pouvez le faire de la même façon que si vous aviez laissé tomber le les zones de texte en place manuellement. Vous devez simplement vous abonner à chaque nouvel événement TextBoxTextChanged.

var x = new TextBox(); 

x.TextChanged += textBox1_TextChanged; 

Dans les versions antérieures de .Net, vous devrez peut-être spécifier le délégué. Voir MSDN on the subject pour plus d'informations.

+0

Gotcha merci pour la réponse! – user249784

0

Vous devez vous inscrire sur le délégué TextChanged lorsque vous créez les contrôles.

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 

Ensuite, dans le gestionnaire d'événements, utilisez le paramètre sender jeter à l'instance du contrôle qui a déclenché l'événement.

private void(object sender, EventArgs e) 
    { 
     //get name of textbox 
     var tb = (TextBox) sender; 
     // do whatever with text box 
    } 
+0

Merci - cela a du sens. Je vais l'essayer. – user249784