2012-02-09 13 views
3

私はちょうど10個のボタンと最後の2個のボタン、btn_greenとbtn_redを作成しました。タイプ 'ASP.site_master'のオブジェクトをキャストして 'System.Web.UI.WebControls.Button'と入力できません。 asp.net

緑色と赤色のボタンをクリックすると、すべてのボタンの色を緑色と赤色に変更したいと考えています。未処理の例外が 現在のWeb要求の実行中に発生しました:

私のC#コードは

protected void btn_green_Click(object sender, EventArgs e) 
     { 
      foreach (Button btn in this.Controls) 
      { 
       btn.BackColor = Color.DarkGreen; 
      } 
     }  

     protected void btn_red_Click(object sender, EventArgs e) 
     { 
      foreach (Button btn in this.Controls) 
      { 
       btn.BackColor = Color.Red; 
      } 
     } 

が、私のベッドの運である私は、エラー

説明しました。エラーについての詳細とコード内のどこで発生したのかについては、スタックトレースを参照してください。

例外の詳細:System.InvalidCastException:型 'ASP.site_master'のオブジェクト をキャストして 'System.Web.UI.WebControls.Button'と入力できません。私はこの問題を逃れる方法

Line 20:    foreach (Button btn in this.Controls) 

?。

答えて

1
foreach (Button btn in this.Controls) 

戻り、ページ内のすべての制御だけでなく、あなたのボタン。あなたはボタンにキャストするか、そのタイプにアクセスする前にそのタイプを試す必要があります。

foreach (Control control in Controls) 
{ 
    var btn = control as Button; 
    if (btn != null) 
    { 
     ... 
    } 
} 
+0

をお試しください – balexandre

1

'foreach'はすべてのボタンを返すようにコントロールをフィルタリングしません。むしろ、すべてのコントロールをループし、ボタンにキャストしようとします。それがボタンでないなら、それは失敗します。

プラス(これは問題ではない可能性があります)this.Controlsは、「this」の下に直接コントロールを返しますが、一部のコンテナにはネストされません。より深いレバーでコントロールを使用する場合は、再帰的な機能が必要です。あなたは再帰を必要としない場合は

、あなたはLINQを使用することができます:

foreach(Button btn in Controls.OfType<Button>()) 
{ 
    btn.BackColor = Color.Red; 
} 
0

あなたはForm.Controlは、フォーム内のすべてのコントロールを返しますので、ボタンとしてそれを使用する前に、コントロールの種類を確認する必要があります。

(コントロールがボタンである)場合には、同様に ``使用することができ、次のコードブロック

foreach (Control objControl in this.Controls) 
    { 
     if (objControl is Button) 
     { 
      (objControl as Button).BackColor = Color.DarkGreen; 

     } 
    } 
関連する問題