アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。ユーザーコントロール内のボタンをクリックした時、そのユーザーコントロールをおいている親フォーム側で、それを知るにはどのようにすればよいでしょうか?

----------------------------------------------------------------------
[Form1.cs]

void Inform_UserControlButton1Click()
{
//親が持っている変数を使って処理を行いたい
}

void Form1_Load(....)
{
//ユーザコントロールを設置
UserControl1 ctrl = new UserControl1();
this.Controls.Add(ctrl);

  //ユーザコントロール内のbutton1を見つける
List<Control> ctrl = new List<Control>(cps.Controls.Find("button1", false));

//Form1が持っている変数を使う為の関数を通るようにしたい
(Button)ctrl[0].Click += new System.EventHandler(Inform_UserControlButton1Click); //←エラー
}
----------------------------------------------------------------------
[UserControl.cs]
button1が配置されています。

----------------------------------------------------------------------
こんな感じにしてできないかなー?と思っていたのですが、//←エラーのところで、

イベント 'System.Windows.Forms.Control.Click' は += または -= の左側にのみ表示されます。

となってしまい上手くいきません。
どのようにすればよいでしょうか?

A 回答 (3件)

> ((Button)ctrl[0]).Click += new EventHandler(Inform_UserControlButton1Click);


> では、+=の左側にだけ~・・・というエラーが出ます。

えっと、動いたものを貼り付けたので、コンパイルエラーにはならないはずです。

で、上記コードは、質問時の記述だと左辺が
(Button)ctrl[0].Click
となっていると思います。これだと確かにエラーになります。
しかし
((Button)ctrl[0]).Click
と、キャストを括弧で括って優先させるとエラーにならないと思いますが、
いかがでしょうか?
    • good
    • 2
この回答へのお礼

うは;申し訳ございません。おっしゃるとおりでした。
()のつけ方を見間違っていました。大変失礼致しました。

なるほどです。理解できました。
上記修正を行い、思ったとおりの動作にすることができました。

すばやい対応をしていただき、大変助かりました。ありがとうございました!

お礼日時:2013/01/21 16:43

コメント全然読んでませんでした。


多分、こういうことですかね。

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");
  }
}

この回答への補足

お世話になっております。
入れ違いで投稿してしまったようです。(No1のご回答のほうへ返信していました。)

内容的には、おっしゃるとおりです。そのような事をしたいのですが、No2でnaktakさんが書いてくださったような

((Button)ctrl[0]).Click += new EventHandler(Inform_UserControlButton1Click);

では、+=の左側にだけ~・・・というエラーが出ます。

No1で教えて頂き、また、No1の返信で私が書いたように
((UserControl1)ctrl[0]).button1.Click += new EventHandler(Inform_UserControlButton1Click); //-----(1)
とすればコンパイルは通りますが、実行時エラーでキャストできません、となってしまいました。

補足日時:2013/01/21 16:04
    • good
    • 0

こういうことですか?



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");
  }
}
    • good
    • 0
この回答へのお礼

早速のご回答、ありがとうございます。
参考コードの誤記について、申し訳ございません。

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
のような書き方では、初めの、+=の左側にしか置けません、のコンパイルエラーになるようです。

そもそも無理な事をしようとしているのでしょうか・・・?

お礼日時:2013/01/21 15:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A