2016-11-09 9 views
0

私はそれらを区別するために内部に多くのボタンがあるアプリケーションを持っています。 私のボタンがFlowLayoutPanelにあると言う必要があります。'System.Windows.Forms.FlowLayoutPanel'型のオブジェクトを 'System.Windows.Forms.Button'にキャストすることができません。C#

public static void SetButtonPos(Form f1,FlowLayoutPanel fk) 
     { 



      foreach (Button c in f1.Controls) 
      { 

       if(c.Name.Contains("BTN_Menu")) 
       { 
        c.Size= new Size(247, 45); 
        c.BackColor = ColorTranslator.FromHtml("#373737"); 
        c.ForeColor = ColorTranslator.FromHtml("#FFFFFF"); 
        c.FlatStyle = FlatStyle.Flat; 
        c.FlatAppearance.BorderSize = 0; 
        c.TextAlign = ContentAlignment.MiddleLeft; 
        c.TextImageRelation = TextImageRelation.ImageBeforeText; 
        c.Height = 45; 
        c.Width = fk.Width - 6; 

       } 
      } 

     } 

しかしタイトルに誤りがありますが、何か考えていますか?

型のオブジェクトをキャストすることができません 'System.Windows.Forms.FlowLayoutPanel'「System.Windows.Forms.Button

はあなたに感謝します。

+1

の可能性のある重複した[取得フォームにButtonコントロールをループしようとしたときにエラー「型のオブジェクトをキャストすることができません」](HTTP: //stackoverflow.com/questions/28468613/geループスルーボタンのタイプのエラーをキャストすることができません) – Sinatr

+0

検索するボタンの位置が明確ではありません。これは、FlowLayoutPanelコントロールコレクションまたはフォームコントロールコレクション内に含まれていますか? – Steve

+0

私のボタンはフローパネル内にあります – Sheva07

答えて

1

この行では、F1の各コントロールがボタンであることを考慮し、これもテキストボックスなどのコントロールがあなたのエラーがトリガされます。ここ

foreach (Button c in f1.Controls) 

間違っています。あなただけしたい場合代わりにボタンが

foreach (Button c in f1.Controls.OfType<Button>()) 

にあなたのコードを変更し、これは直接フォームのControlsコレクションに含まれている唯一のボタンを見つけることに注意してください。彼らは(グループボックスやパネルなど)別の容器の内側にある場合は上記の行は動作しませんし、あなたのボタンがある場合は、

EDIT

は、すべてのControlsコレクションを横断する適当な容器や再帰呼び出しを使用する必要がありますFlowLayoutPanelのControlsコレクション内で、コードは、そのコレクションにあなたのボタンを検索する必要があり

foreach (Button c in fk.Controls.OfType<Button>()) 
+0

子コントロールに再帰する必要があります。まあ、しかし、例えばhttp://stackoverflow.com/questions/1558127/how-can-i-get-all-controls-from-a-form-including-controls-in-any-container – stuartd

+0

私はちょうどそれについて書いていました。しかし、その答えはOfType拡張を使用しません。 dupeの検索,,,, – Steve

+0

OPによると、ボタンは 'f1'にはありません。彼らは 'fk'です。 – adv12

関連する問題