
こんにちは。ユーザーコントロール内のボタンをクリックした時、そのユーザーコントロールをおいている親フォーム側で、それを知るにはどのようにすればよいでしょうか?
----------------------------------------------------------------------
[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' は += または -= の左側にのみ表示されます。
となってしまい上手くいきません。
どのようにすればよいでしょうか?
No.3ベストアンサー
- 回答日時:
> ((Button)ctrl[0]).Click += new EventHandler(Inform_UserControlButton1Click);
> では、+=の左側にだけ~・・・というエラーが出ます。
えっと、動いたものを貼り付けたので、コンパイルエラーにはならないはずです。
で、上記コードは、質問時の記述だと左辺が
(Button)ctrl[0].Click
となっていると思います。これだと確かにエラーになります。
しかし
((Button)ctrl[0]).Click
と、キャストを括弧で括って優先させるとエラーにならないと思いますが、
いかがでしょうか?
うは;申し訳ございません。おっしゃるとおりでした。
()のつけ方を見間違っていました。大変失礼致しました。
なるほどです。理解できました。
上記修正を行い、思ったとおりの動作にすることができました。
すばやい対応をしていただき、大変助かりました。ありがとうございました!
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");
}
}
この回答への補足
お世話になっております。
入れ違いで投稿してしまったようです。(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");
}
}
早速のご回答、ありがとうございます。
参考コードの誤記について、申し訳ございません。
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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
ユーザコントロールのイベント取得について(C#)
その他(プログラミング・Web制作)
-
C#で親にイベントを投げる方法
C言語・C++・C#
-
C# ログイン画面からメイン画面への画面遷移について
C言語・C++・C#
-
4
c# 文字列の最後から1文字削除したい
C言語・C++・C#
-
5
ユーザーコントロールを動的に切り替えたい
その他(プログラミング・Web制作)
-
6
C# ReadOnlyのTextBoxで
C言語・C++・C#
-
7
C# Controls.Addで動的に配置したコントロールのRemoveについて
C言語・C++・C#
-
8
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
9
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
10
C#で起動時のフォームを非表示にした後、Showで表示したいのですが
その他(プログラミング・Web制作)
-
11
C#でButtonのフォーカス枠を消したいのですが
C言語・C++・C#
-
12
C# 子のコントロールからイベントを送る方法?
C言語・C++・C#
-
13
C#にて別クラスの関数を使いたい
C言語・C++・C#
-
14
【C#】 あるイベントから別イベントを呼び出す。
その他(プログラミング・Web制作)
-
15
C#で通常のbuttonコントロールを継承したbuttonを作りたいのですが、、、
C言語・C++・C#
-
16
同じソリューション内の別のプロジェクトのメソッド呼び出し
C言語・C++・C#
-
17
C#でフォームのオブジェクト名を変数名で指定
C言語・C++・C#
-
18
C#で角が丸いテキストボックス
その他(プログラミング・Web制作)
-
19
別のフォームで記述している関数を実行するには?C#
C言語・C++・C#
-
20
C#において、同じインスタンスを何度もnewしてよいでしょうか。
その他(プログラミング・Web制作)
関連するQ&A
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
エクセルのチェックボックスに...
-
5
vb.netで画面のコントロールId...
-
6
これの直し方を教えてください
-
7
Property Letについて
-
8
ユーザーフォームで動的(Me.Con...
-
9
VBAのカレンダーコントロールに...
-
10
イメージコントロールに 読み込...
-
11
VBAでドラッグ・アンド・ドロップ
-
12
コントロール配列と同じような...
-
13
チェックボックスをオンにした...
-
14
エクセル・VBA CheckBoxのオブ...
-
15
コントロールを移動できない
-
16
VBAのフォームでTextBoxがいっ...
-
17
Labelコントロールの(左右)余...
-
18
VB.NET開発。ラジオボタンとコ...
-
19
C#で角が丸いテキストボックス
-
20
ExcelVBAのコントロールの種類...
おすすめ情報