簡體   English   中英

父控件上的子控件的事件預覽

[英]Events preview of child controls on Parent control

有沒有辦法在父控件上觸發子控件事件?

示例:名為ControlA的自定義用戶控件,其中包含其他控件,例如PictureBox和Label。 將ControlA添加到窗體,並設置MouseClick事件。 如果用戶單擊控件的空白區域,則會觸發該事件,但是如果用戶單擊子控件(如PictureBox和Label),則不會發生任何事情。 這是因為子控件位於后台,並且將處理事件。

我發現的解決方案是添加:

    public new event MouseEventHandler MouseClick
    {
        add
        {
            base.MouseClick += value;
            foreach (Control control in Controls)
            {
                control.MouseClick += value;
            }
        }
        remove
        {
            base.MouseClick -= value;
            foreach (Control control in Controls)
            {
                control.MouseClick -= value;
            }
        }
    }

但是我將需要對所有要使用的事件執行此操作,是否還有其他方法可以解決該問題,例如在子控件上設置一些屬性,因此我不需要“覆蓋”許多事件?

我也有類似的情況。 我使用了此解決方案,但對其進行了修改以處理我擁有的對象。 區別在於我有幾種不同類型的用戶組件,這些用戶組件由用戶組件和常規組件組成,但是我需要父組件來處理DragDrop的相關事件,這是因為父組件可以訪問所需的所有信息。 我將此解決方案修改為遞歸的((我不確定這是最佳解決方案,但是…),這為我節省了工作量。 我可以將其復制並粘貼到其他組件上,並根據特定情況修改事件處理程序。 它是這樣的:

    private void HookChildrenEvents(Control control)
    {
        foreach (Control child in control.Controls)
        {
            if (child.Controls.Count > 0)
            {
                HookChildrenEvents(child);
            }
            child.DragEnter += child_DragEnter;
            child.MouseHover += child_MouseHover;
            child.MouseDown += child_MouseDown;
            child.DragDrop += child_DragDrop;
            child.AllowDrop = true;
        }
    }

創建一種方法來為所有子級關聯所需事件。 如果需要,可以創建一個反方法:UnhookChildEvents。

public void HookChildEvents()
{
    foreach (Control child in this.Controls)
    {
        child.MouseClick += ChildOnMouseClick;
        child.DragEnter += ChildOnDragEnter;
        // ... add one for each event you care for.
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM