
こんにちは。ユーザーコントロール内のボタンをクリックした時、そのユーザーコントロールをおいている親フォーム側で、それを知るにはどのようにすればよいでしょうか?
----------------------------------------------------------------------
[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も見ています
-
C#で親にイベントを投げる方法
C言語・C++・C#
-
ユーザコントロールのイベント取得について(C#)
その他(プログラミング・Web制作)
-
C# 子のコントロールからイベントを送る方法?
C言語・C++・C#
-
-
4
データグリッドビューの一番最初の行に列を追加したい
Visual Basic(VBA)
-
5
テーブルタグの中にdivを含めてはダメ?
HTML・CSS
-
6
DataTableに入っているデータを全てinsertしたい!(C#)
Microsoft ASP
-
7
DataGridViewの、選択されている行を取り出したい
Visual Basic(VBA)
-
8
ユーザーコントロールを動的に切り替えたい
その他(プログラミング・Web制作)
-
9
GridviewとDataGridviewの違い
Microsoft ASP
-
10
Loadイベント中にほかのイベントを発生したくない
その他(プログラミング・Web制作)
-
11
インスタンス参照でアクセスできない。代わりに型名?
C言語・C++・C#
-
12
C# 超初心者です。 this.Refresh();という文を使いたいです
C言語・C++・C#
-
13
C#でbyte配列から画像を表示させたい
C言語・C++・C#
-
14
visual studio でインデントを自動的に揃えるショートカットキー
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAのコントロールの種類...
-
複数のコマンドボタン(VBAで)...
-
全てのオブジェクトのプロパテ...
-
Pictureコントロールの...
-
winndws セキュリティ
-
VBAのカレンダーコントロールに...
-
VB.net webアプリケーションで...
-
WEBユーザーコントロール
-
エクセルVBAユーザーフォーム・...
-
エクセルVBAでオプションボタン...
-
C#で角が丸いテキストボックス
-
JavaScriptからVBAの関数を呼び...
-
Excel VBA 動的に作成したチェ...
-
エクスプローラ風のフォルダ選...
-
ユーザーフォームにランプをつ...
-
ASP.NET(C#)実体のないコントロ...
-
行方不明になるコントロール
-
カメラスクロールするのを動画...
-
MSFlexGridのようなコントロール
-
ユーザーコントロールのイベン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelVBAのコントロールの種類...
-
EXCELでactivexコントロールを...
-
ExcelVBAでListViewが使用できない
-
'ckbl' コントロールは作成され...
-
カメラスクロールするのを動画...
-
VBA ユーザーフォームの Keypre...
-
vb.netで画面のコントロールId...
-
エクセル・VBA CheckBoxのオブ...
-
chr関数の呼び出しで「プロ...
-
エクセルVBAでオプションボタン...
-
Groupboxの配下のコントロール...
-
エクセル コントロールツール...
-
Labelコントロールの(左右)余...
-
チェックボックスをオンにした...
-
Excel VBA で Richtextboxを使...
-
アクセス特有の書き方?
-
(VBA)スピンボタンの大量...
-
ActiveX DLL と ActiveXコント...
-
C# ユーザコントロール内のボタ...
-
Excel VBA 動的に作成したチェ...
おすすめ情報