みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C# 子のコントロールからイベントを送る方法?

毎度お世話になっております。

何の手も加えていないフォームに自分で作った
ユーザコントロールを張り付け、そのコントロールからイベントが
発生したら、親フォームを閉じるようにしたいと思っています。

下記にサンプルを記述します。

フォーム側(using文、Designer文は省略)

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private string[] stLines =
{
"こんにちは。",
"こんばんは。",
"おはよう。",
"さようなら。",
"おやすみなさい。",
};
public Form1()
{
InitializeComponent();  // 省略

JLabel j = new JLabel(stLines);
j.Dock = DockStyle.Fill;
this.Controls.Add(j);
}
}
}

ユーザコントロール側(Labelを継承)

namespace WindowsFormsApplication1
{
public class JLabel : Label
{
private string[] stLines = null;
private int lineNo = 0;

public JLabel(string[] Lines)
{
this.Click += new System.EventHandler(this.Jlabel_Click);
this.stLines = Lines;
this.lineNo = 0;
}
private void Jlabel_Click(object sender, EventArgs e)
{
this.lineNo++;
if (this.stLines.Length > this.lineNo)
{
this.Text = this.stLines[this.lineNo];
}
else
{
//ここでイベントを発生させたい
//this.lineNo = 0;
}
}
}
}

上記のように、渡された文字列をもとに、クリックするごとに次の行を
表示するプログラムですが、行番号が行数を超えた場合にイベントを
発生させて、それを親のフォームが監視し、受け取った際にフォームを
閉じるといった処理をさせたいのです。

親のフォームにクリックイベントを仕掛ければ楽ではありますが、
子供のコントロールからの信号を、親が受け取る…といった流れにしたいのです。

以上、よろしくお願いいたします。

投稿日時 - 2013-10-19 14:49:40

QNo.8311906

すぐに回答ほしいです

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

C#の文法書を読めば,イベントの作成方法は書いていませんか。

推奨される手順は,次のような感じでしょうか。
・イベントをメンバーとして定義する
public event EventHandler Foo;
・イベントを呼び出すメソッドを定義する
protected virtual void OnFoo (EventArgs e)
{
if (Foo != null)
{
Foo(this, e);
}
}
あとは,イベントを発生させたいところでOnFooを呼び出せばよいです。
イベント引数に情報を載せたいのであれば,EventArgsを派生させたHogeEventArgsを用意して,
イベントの型をEventHadnler<HogeEventArgs>にします。
ref) http://msdn.microsoft.com/ja-jp/library/vstudio/w369ty8x(v=vs.110).aspx
ref) http://msdn.microsoft.com/ja-jp/library/vstudio/hy3sefw3(v=vs.110).aspx

投稿日時 - 2013-10-19 18:23:16

お礼

ありがとうございます。

おかげで実現できました。

解り易い説明、ありがとうございました。

投稿日時 - 2013-10-21 10:20:56

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問