• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C# ユーザコントロール内のボタン押下を親で知る)

C#ユーザコントロール内のボタン押下の親への通知方法

このQ&Aのポイント
  • C#のユーザコントロール内のボタンをクリックした際に、親フォーム側でそのボタンの押下を検知する方法について質問です。
  • Form1.csにはInform_UserControlButton1Clickという関数があり、ユーザーコントロールのbutton1がクリックされた時にこの関数を実行したいです。
  • ただ、イベントの+=の部分でエラーが発生しており、正しい書き方がわかりません。どのようにすれば親フォームにボタンの押下を通知することができるでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> ((Button)ctrl[0]).Click += new EventHandler(Inform_UserControlButton1Click); > では、+=の左側にだけ~・・・というエラーが出ます。 えっと、動いたものを貼り付けたので、コンパイルエラーにはならないはずです。 で、上記コードは、質問時の記述だと左辺が (Button)ctrl[0].Click となっていると思います。これだと確かにエラーになります。 しかし ((Button)ctrl[0]).Click と、キャストを括弧で括って優先させるとエラーにならないと思いますが、 いかがでしょうか?

coelacanth9
質問者

お礼

うは;申し訳ございません。おっしゃるとおりでした。 ()のつけ方を見間違っていました。大変失礼致しました。 なるほどです。理解できました。 上記修正を行い、思ったとおりの動作にすることができました。 すばやい対応をしていただき、大変助かりました。ありがとうございました!

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

コメント全然読んでませんでした。 多分、こういうことですかね。 public partial class Form1 : Form {   public Form1()   {     InitializeComponent();   }   private void Form1_Load(object sender, EventArgs e)   {     //ユーザコントロールを設置     UserControl1 cps = new UserControl1();     this.Controls.Add(cps);     //ユーザコントロール内のbutton1を見つける     List<Control> ctrl = new List<Control>(cps.Controls.Find(@"button1", false));     //Form1が持っている変数を使う為の関数を通るようにしたい     ((Button)ctrl[0]).Click += new EventHandler(Inform_UserControlButton1Click);   }   private void Inform_UserControlButton1Click(object sender, EventArgs args)   {     Console.WriteLine("hoge");   } }

coelacanth9
質問者

補足

お世話になっております。 入れ違いで投稿してしまったようです。(No1のご回答のほうへ返信していました。) 内容的には、おっしゃるとおりです。そのような事をしたいのですが、No2でnaktakさんが書いてくださったような ((Button)ctrl[0]).Click += new EventHandler(Inform_UserControlButton1Click); では、+=の左側にだけ~・・・というエラーが出ます。 No1で教えて頂き、また、No1の返信で私が書いたように ((UserControl1)ctrl[0]).button1.Click += new EventHandler(Inform_UserControlButton1Click); //-----(1) とすればコンパイルは通りますが、実行時エラーでキャストできません、となってしまいました。

すると、全ての回答が全文表示されます。
回答No.1

こういうことですか? cps.Controls.Find("button1", false) cpsがどこからきたのか分かりません。 ctrl変数が重複しているのでよく分かりません。] 勘というか、やれる方法で書いてます。 UserControlを操作するんですから、UserControl内のButtonのModifiersプロパティはPublicか Internal、もしくはProtected Internalでないとダメです。 public partial class Form1 : Form {   public Form1()   {     InitializeComponent();   }   private void Form1_Load(object sender, EventArgs e)   {     //ユーザコントロールを設置     UserControl1 button = new UserControl1();     button.Name = @"button1";     this.Controls.Add(button);     //ユーザコントロール内のbutton1を見つける     List<Control> ctrl = new List<Control>(this.Controls.Find(@"button1", false));     //Form1が持っている変数を使う為の関数を通るようにしたい     ((UserControl1)ctrl[0]).userControlInnnerButton1.Click += new EventHandler(Inform_UserControlButton1Click);   }   private void Inform_UserControlButton1Click(object sender, EventArgs args)   {     Console.WriteLine("hoge");   } }

coelacanth9
質問者

お礼

早速のご回答、ありがとうございます。 参考コードの誤記について、申し訳ございません。 naktakさんの書いて下さった方を元にして修正しました。 また、ユーザコントロール内のボタンのModifireはprivateのままでしたので、publicに変更致しました。 -------------------------------------------------------------------- public partial class Form1 : Form {   public Form1()   {     InitializeComponent();   }   private void Form1_Load(object sender, EventArgs e)   {     //ユーザコントロールを設置     UserControl1 usrCntrl = new UserControl1();//ボタンはこのユーザコントロールにデザイナ上で元から設置してあります。     this.Controls.Add(usrCntrl);     //ユーザコントロール内のbutton1を見つける     List<Control> ctrl = new List<Control>(usrCntrl.Controls.Find(@"button1", false));     //Form1が持っている変数を使う為の関数を通るようにしたい     ((UserControl1)ctrl[0]).button1.Click += new EventHandler(Inform_UserControlButton1Click); //-----(1)   }   private void Inform_UserControlButton1Click(object sender, EventArgs args)   {     Console.WriteLine("hoge");   } } -------------------------------------------------------------------- -----(1) の所のキャストの仕方を上記にするとコンパイルは通るようになったのですが、実行時エラーで、----(1)の箇所で 型 'System.Windows.Forms.Button' のオブジェクトを型 'Application1.UserControl1' にキャストできません。 とエラーになってしまいました。 (Button)((UserControl1)ctrl[0]).button1.Click (Button)(((UserControl1)ctrl[0]).button1).Click のような書き方では、初めの、+=の左側にしか置けません、のコンパイルエラーになるようです。 そもそも無理な事をしようとしているのでしょうか・・・?

すると、全ての回答が全文表示されます。

関連するQ&A