質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

11138閲覧

buttonを配置したusercontrolのbuttonを個別に処理したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2015/12/21 08:32

いつもお世話になります。
C# Windows7 Formアプリケーションで、buttonを配置したusercontrolを複数のtabpage/formで共通にしようとしています。

[button1][button2]のようにしたusercontorlを作り、formに配置しました。

その配置したformでbutton1_Clickイベントに引数を渡す方法を知りたいです。

通常のbuttonの場合は、デザイナーでbuttonをclickすると、イベントハンドラができ、

private void button_Click(object sender, EventArgs e) {
Button button = sender as Button;
}

のようにして、senderのたとえばtagでボタンのイベントに引数を渡せますが、usercontrolのボタンはデザイナーでは選択できないのです。
念のため、usercontrolでbuttonをpublicにしてもだめでした。

はまってます。
ご教示願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ありがとうございます。

非常に単純で、たんにコードで、
UserControl1.button.Click +=
と書いたところ、intelliSenseでイベントハンドラを作成できました。

デザイナーで選択できないので、コードでも扱えないと思っていました。
無事、できました。

namespace Forms {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();

UserControl1.button.Click += button_Click; } void button_Click(object sender, EventArgs e) { } } public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } }

}

投稿2015/12/22 02:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

解釈が間違ってたらすみません。
後半の文章から「ユーザーコントロール内のボタンをサブスクライブできない」と勝手に読み替えました。
間違っていた場合は回答も直しますので言ってください。

WinFormsの場合はWPFのようにイベントが上位に昇っていかないので、
ユーザコントロール上に「ボタンが押されましたよイベント」を公開する必要があります。

そしてユーザーコントロール内部のボタンクリックイベントで上記イベントを発生させます。
その際のsenderにボタンコントロールを設定すればフォーム側でも押下されたボタンとして判定できると思います。

C#

1public partial class Form1 : Form 2{ 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void userControl11_InnerButtonClicked(object sender, EventArgs e) 9 { 10 var btn = sender as Button; 11 if (btn != null) 12 MessageBox.Show(btn.Name); 13 } 14} 15 16public partial class UserControl1 : UserControl 17{ 18 public UserControl1() 19 { 20 InitializeComponent(); 21 } 22 23 public event EventHandler InnerButtonClicked; 24 25 private void button1_Click(object sender, EventArgs e) 26 { 27 OnInnerButtonClicked(sender, e); 28 } 29 30 private void button2_Click(object sender, EventArgs e) 31 { 32 OnInnerButtonClicked(sender, e); 33 } 34 35 private void OnInnerButtonClicked(object sender, EventArgs e) 36 { 37 var h = this.InnerButtonClicked; 38 if (h != null) 39 { 40 h(sender, e); 41 } 42 } 43}

投稿2015/12/21 11:31

編集2015/12/21 11:32
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/12/22 02:43

ありがとうございます。 なんか微妙にずれている感じです。 わたしの質問があいまいすぎたのかもしれません。 やりたいことは、自己解決のコードのようにして実現できました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問