プロジェクト用に作成したカスタム コントロールがあります。このコントロールには、Label、PictureBox、LinkLabel などのいくつかの子コントロールがあります。LinkLabel 以外では、現在親コントロール上にあるマウス オーバー イベントが必要で、コントロールがマウス オーバーに応答するようにします。コントロールの上にカーソルを置くと背景色が変わりますが、子コントロールの上では背景色は変わりません。これは、子コントロールに MouseEnter および MouseLeave イベントがないためです。親コントロールのデリゲート メソッドを子コントロールに追加することで、この問題を解決しました。親コントロールでクリック イベントをサブスクライブすると、子コントロールでもクリック イベントが無視されるという問題が残ります。個々の子コントロールをサブスクライブできますが、親コントロールのクリック イベントを強制するにはどうすればよいですか? 私という用語 検索で見つかったのは Event Bubbling ですが、これは ASP.NET テクノロジとフレームワークにのみ適用されるようです。助言がありますか?
4 に答える
あなたの説明は、子コントロールと親コントロールの両方が子コントロールのクリックに応答することを望んでいると私に信じさせます。
あなたの質問を正しく理解できれば、子コントロールのクリック イベントをサブスクライブし、それらのイベント ハンドラーで、親 UserControl の状態を希望する方法で操作する一般的なメソッドを呼び出すことをお勧めします (たとえば、背景を変更する)。色)。
すべての子コントロールで Click イベントを処理する際にも同様の問題がありました。コードは VB.NET ですが、簡単に調整できるはずです。
Public Shared Sub RelayEvents(ByVal usrcon As Windows.Forms.Control, ByVal del As System.EventHandler, Optional ByVal includeChildren As Boolean = True)
For Each con As Windows.Forms.Control In usrcon.Controls
AddHandler con.Click, del
If includeChildren Then
RelayEvents(con, del)
End If
Next
End Sub
必要なカスケードが必要な場合はいつでも、次の行をクラスのコンストラクターに追加できます。
CustomMethods.RelayEvents(Me, New EventHandler(AddressOf Me_Click))
他の誰かが私のためにそれを解決したようです。友人は、C# コントロールが InvokeOnClick(Control, EventArgs); というメソッドをサポートしていると説明しました。
イベント デリゲート メソッドを各子コントロールに追加し、クリック イベント用に、子コントロールごとに使用するメソッドを 1 つ作成しました。これは InvokeOnClick(this, new EventArgs()); を呼び出します。
private void Control_Click(object sender, EventArgs e)
{
// this is the parent control.
InvokeOnClick(this, new EventArgs());
}
private void IFLVControl_MouseEnter(object sender, EventArgs e)
{
this.BackColor = Color.DarkGray;
}
private void IFLVControl_MouseLeave(object sender, EventArgs e)
{
this.BackColor = Color.White;
}
CodeProject の Peter Rilling には、winform (および C#) でイベントのバブリング/ブロードキャストを行うためのシンプルで効果的なコードがいくつかあります。使い方はとても簡単です。