2017-02-01 3 views
1

を変更されているかどうかをチェック - しかし、私は、テーブルのビジュアルを好きではない、よりを追加しようとしています対話性(ドラッグ/ドロップなど)C#Windowsフォーム:動的に作成したテキストボックスをループし、テキストは、私は一種のグラフィカルな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) 
    { 

    } 

だから、私は、実行時にテキストボックスを作成していますので、私は、実行時にこれを確認する方法をまわりで私の頭をラップすることはできませんね。

ありがとうございました!例えば

+0

'comboBox1_SelectedIndexChanged_1'メソッドでテキストボックスを作成する場合、そのテキストボックスのTextChangedパラメータにイベントハンドラを割り当てます。 I.E: 'textbox.TextChanged + = myEventHandler; ' –

答えて

1

:私はチェックしたい場合は、テキストは私がそうするでしょうフォームに置く テキストボックスのために変更された場合:

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 

} 

だから私は、私の周り私の頭をラップすることはできません推測実行時にTextboxesを作成しているので、私は 実行時にこれをどうチェックしますか?

あなたは同じことを行います!

最初のイベントを処理するメソッドを作成します。

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; 
+0

助けてくれてありがとう! 「フォームを初期化するときは、これを行う:」と言うとき。あなたはそれが意味することを説明してもらえますか?実際のテキストボックスを作成すると、そのことを宣言する必要がありますか? – user249784

+0

ドームデザイナーのように、テキストボックスのイベントに 'TextBoxTextChanged'というイベントハンドラを接続します。@ user249784 – Sweeper

+0

あなたは何を言っているのですか?ありがとう! – user249784

0

をあなたが落ちたかのようにあなたはこれを同じ方法で行うことができますテキストボックスを手動で配置します。あなただけのそれぞれの新しいTextBoxTextChangedイベントをサブスクライブする必要があります。

var x = new TextBox(); 

x.TextChanged += textBox1_TextChanged; 

古いバージョンの.Netでは、代理人を指定する必要があります。詳細については、MSDN on the subjectを参照してください。

+0

返信いただきありがとうございます! – user249784

0

あなたがコントロールを作成しているとき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 
    } 
+0

ありがとう - これは理にかなっています。私はそれを試してみる。 – user249784

関連する問題