C# Winform アプリケーションで。内部にいくつかのラベルを持つ Panel があるとします。
パネルクリックイベントでこのラベルからすべてのクリックイベントをリッスンするにはどうすればよいですか?
Form_Load
これは、イベント ハンドラーまたはその他の適切なイベント ハンドラーで次のコードを呼び出すことにより、プログラムで行うことができます。
foreach (Label label in panel1.Controls.OfType<Label>())
{
label.Click += LabelOnClick;
}
そして、イベント ハンドラーで操作を実行します。
private void LabelOnClick(object sender, EventArgs eventArgs)
{
MessageBox.Show("Label In Panel Clicked");
}
ラベルがパネルの子である場合、パネルのクリック イベントのリスナーは、子の再定義されていないすべてのリスナーをリッスンします。
コード例:
{
//Form init
panel1.Click += new System.EventHandler(this.panel1_Click);
....
}
private void panel1_Click(object sender, EventArgs e)
{
//The clicked label will be sender.
Label l = (Label) sender; //Should be a safe cast. Will crash if sender is not a label
}
Panel 内のすべての Control of Type Button に追加のイベント ハンドラを追加しないのはなぜですか?
サンプルコード:
private void SetupButtonClickListenerForPanel1()
{
panel1.Click += ListenForAllButtonClickOnPanel1;
foreach (Control control in panel1.Controls)
{
var tb = control as Button;
if (tb != null)
{
tb.Click += ListenForAllButtonClickOnPanel1;
}
}
}
private void ListenForAllButtonClickOnPanel1(object sender, EventArgs eventArgs)
{
//
Button tb = (Button) sender; // casting will fail if click is on Panel1 itself!
MessageBox.Show(tb.Name);
}
Handler を追加するLinqの方法:
private void SetupButtonClickListenerForPanel1()
{
panel1.Click += ListenForAllButtonClickOnPanel1;
foreach (var tb in panel1.Controls.OfType<Button>())
{
tb.Click += ListenForAllButtonClickOnPanel1;
}
}