2016-05-19 23 views
1

LayoutPanelのフォームには、buttonsが動的に追加されています。実行時にbuttonsが追加されますが、textBoxが空の場合はbuttonsのいずれかにプロパティを設定して、textBoxが空でない場合は有効にしています。私は以下受け付けておりますエラーで動的に作成されたコントロールのプロパティを変更する

ここ

は、コード例です:

private void Form1_Load(object sender, EventArgs e) 
{ 

    // Create 3 buttons 

    Button button1 = new Button(); 
    button1.Name = "button1"; 
    tableLayoutPanel1.Controls.Add(button1, 0, 0); 

    Button button2 = new Button(); 
    button1.Name = "button2"; 
    tableLayoutPanel1.Controls.Add(button2, 0, 0); 

    Button button3 = new Button(); 
    button3.Name = "button1"; 
    tableLayoutPanel1.Controls.Add(button3, 0, 0); 
} 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    if (string.IsNullOrEmpty(textBox1.Text)) 
    { 
     button1.Enabled = false; 
    } 
    else 
    { 
     button1.Enabled = true; 
    } 
} 

CS0103名「ボタン1」は現在のコンテキストで

存在しない、私は宣言するべきボタンはどこか他の場所にあるので、コード全体が実際に存在しているか、他の場所の私の問題であることがわかりますか?ありがとう。

+0

あなたはjavascriptでできませんか? { $( "#<%%myTextBox.ClientID%>")。プロット( "disabled"、true);} else {$( "#<%= button1.ClientID%>" '"); } }); –

+1

@ user2744722いいえ、この質問は、ASP.netではなくC#Windows Formsアプリケーションに関するものです。 javascriptはオプションではありません –

答えて

1

あなたが他のメソッドから直接名前でボタンにアクセスしたい場合は、あなたのケースでボタンがForm1_Load方法でだけ利用できますので、あなたは、Form1_Load外のボタンを宣言する必要があります。

Button button1; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    // Create 3 buttons 
    button1 = new Button(); 
    button1.Name = "button1"; 
    tableLayoutPanel1.Controls.Add(button1, 0, 0); 
} 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    button1.Enabled = !string.IsNullOrEmpty(textBox1.Text); 
} 

たりしたい場合は別の方法として

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    var btn = tableLayoutPanel1.Controls.OfType<Button>().Where(x => x.Name == "button1").FirstOrDefault(); 
    (btn as Button).Enabled = !string.IsNullOrEmpty(textBox1.Text); 
} 
1

、あなたが動的にレイアウトパネルからコントロールを取得し、このような有効なプロパティを設定することができます:あなたはこのようにボタンにアクセスすることができ、Form1_Load内部のボタンを宣言します。

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
     Control button = tableLayoutPanel1.Controls["button1"]; 

     button.Enabled = string.IsNullOrEmpty(textBox1.Text) ? false : true; 
} 

このアプローチは、フォームレベルでボタンを宣言するほどの「安全」ではありませんが、私はあなたがコントロールを参照するで真に動的にする必要がある場合、時間について言及するのに有用であろうと思いました。

+0

これは便利です。ありがとうございました。 – Giovanni

1

これを行うにはいくつかの方法があります.1つは、このようなTableLayoutPanelのコントロールコレクションのFindメソッドを使用することです。

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    Button btn =(Button)tableLayoutPanel1.Controls.Find("button1", true)[0]; 

    if (string.IsNullOrEmpty(textBox1.Text)) 
    { 
     btn.Enabled = false; 
    } 
    else 
    { 
     btn.Enabled = true; 
    } 
} 

第使用するように制御するかを決定するためにボタンTagプロパティを使用することで、私は、動的に生成された制御のために、過去にこれを使用しています。

private void Form1_Load(object sender, EventArgs e) 
{ 
    // Create 3 buttons 
    Button button1 = new Button(); 
    button1.Name = "button1"; 
    button1.Tag = 1; //note the Tag property being used 
    tableLayoutPanel1.Controls.Add(button1, 0, 0); 

    Button button2 = new Button(); 
    button1.Name = "button2"; 
    button2.Tag = 2; 
    tableLayoutPanel1.Controls.Add(button2, 0, 0); 

    Button button3 = new Button(); 
    button3.Name = "button3"; 
    button3.Tag = 3; 
    tableLayoutPanel1.Controls.Add(button3, 0, 0); 

} 


private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    foreach (Control c in tableLayoutPanel1.Controls) //iterate through controls 
    { 
     if ((int)c.Tag == 1) //if Tag is equal then process 
     { 
      if (c is Button) 
      { 
       if (string.IsNullOrEmpty(textBox1.Text)) 
       { 
        ((Button)c).Enabled = false; 
       } 
       else 
       { 
        ((Button)c).Enabled = true; 
       } 
       break; //if you have multiple controls to process remove this 
      }   //and assign the same tag to the controls you want processed 
     } 
    } 
} 
関連する問題