4

これは現在かなり繰り返されています。これに対処するためのより DRY な方法を探していますが、私が見つけた各ソリューションは実際にはそれほど優れていません。問題は、イベントを親の SearchResultItem に作用させたい場合です。たとえば、ラベルが親コントロールの一番端にある場合、親コントロールは、その子ラベル内で発生した場合、マウスが離れたり入ったりするのを認識しません。だから私もそれぞれの子へのメソッドです。ただし、子供が追加された場合は、イベントごとに覚えて追加する必要があります。ダブルクリックとクリックのイベントもあります。これを行うより良い方法を知っていますか?

これが私のコードで、関連するものだけを示すために簡略化されています:

public partial class SearchResultItem : UserControl
{
    public SearchResultItem()
    {
        SetupForm();
    }

    private void SetupForm()
    {
        //Setup the back color change on mouse enter
        SetupMouseEnter();
        //Setup the original back color when mouse leave
        SetupMouseLeave();
    }

    private void SetupMouseLeave()
    {
        this.MouseLeave += SearchResultItem_MouseLeave;
        this.lblRight.MouseLeave += SearchResultItem_MouseLeave;
        this.lblBottom.MouseLeave += SearchResultItem_MouseLeave;
        this.lblColor.MouseLeave += SearchResultItem_MouseLeave;
        this.lblTop.MouseLeave += SearchResultItem_MouseLeave;
        this.picture.MouseLeave += SearchResultItem_MouseLeave;
    }

    void SearchResultItem_MouseLeave(object sender, EventArgs e)
    {
        this.BackColor = Color.FromKnownColor(KnownColor.Control);
    }

    private void SetupMouseEnter()
    {
        this.MouseEnter += SearchResultItem_MouseEnter;
        this.lblRight.MouseEnter += SearchResultItem_MouseEnter;
        this.lblBottom.MouseEnter += SearchResultItem_MouseEnter;
        this.lblColor.MouseEnter += SearchResultItem_MouseEnter;
        this.lblTop.MouseEnter += SearchResultItem_MouseEnter;
        this.picture.MouseEnter += SearchResultItem_MouseEnter;
    }

    void SearchResultItem_MouseEnter(object sender, EventArgs e)
    {
        this.BackColor = Color.BlanchedAlmond;
    }
}
4

1 に答える 1

4

Controlsフォームのコレクション内のすべてのコントロールにこのイベントハンドラーを追加できます。

foreach (Control c in this.Controls)
{
    c.MouseLeave += SearchResultItem_MouseLeave;
}

フォームのコンテナコントロール内のコントロールからのイベントが必要な場合に、これを再帰的にする必要がある場合があることに注意してください。また、実行時にコントロールを動的に追加していないことも前提としています。

于 2013-01-04T18:40:44.333 に答える