dポイントプレゼントキャンペーン実施中!

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

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

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

フォーム側(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;
}
}
}
}

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

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

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

A 回答 (1件)

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/ …
ref) http://msdn.microsoft.com/ja-jp/library/vstudio/ …
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

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

お礼日時:2013/10/21 10:20

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