2013-02-25 49 views
3

我有一个UserControl其中包含一些内部控件。是这样的:我如何使内部控制不包括主要控件的事件?

enter image description here

现在,当我在我的项目中使用它,我想每一个我的控制提出同样的单击事件,如果点击,就像其他控件。

但问题是:我的处理程序在另一个项目,处理点击事件,当我点击背景上的某处,而不是button1或label1。

我可以解决它通过设置内部控件的每个事件引发主控制另一个事件,但它有点奇怪。

如何让内部控件不覆盖主控件的事件?

+0

它有点奇怪,你会怎么触发按钮点击?为什么你需要一个按钮? – 2013-02-25 21:39:58

+0

@NikolaDavidovic那么,你可以有一个处理程序在整个UC内进行任何点击操作,而另一个处理程序在点击按钮时运行。每个事件可以有多个处理程序,所以没有什么可以阻止它。 – Servy 2013-02-25 21:46:27

+0

@Servy True,但我期待OP的回答,这样他就可以澄清问题,我们可以提供更好的答案。 – 2013-02-25 21:51:58

回答

2

我建议借力UserControl的Load事件遍历所有子控件在您的项目和程序添加一个处理每一个的mouseMoved事件。这将足够强大以处理添加的任何新的子控件。例如;

private void UserControl1_Load(object sender, EventArgs e) 
    { 
     foreach (Control c in Controls) 
     { 
      c.MouseMove += Control_Move; 
     } 
    } 

    protected void Control_Move(object sender, MouseEventArgs e) 
    { 
     // do stuff here 
    } 

而且不要忘了你的用户控件的MouseMove事件挂接到同一Control_Move方法

+0

只有每个孩子的控制都一样,他们才不会这样做。 – Servy 2013-02-25 21:41:59

+0

@Servy true ...我能想到的唯一方法就是深入研究Win32 API并添加消息钩子。如果.NET没有公开必要的事件,那么除了有效地创建自己的 – DiskJunky 2013-02-25 21:45:21

+0

@DiskJunky谢谢,所以我应该添加每个事件,即MouseMove,MouseClick,Load, , 这条路? – Blazi 2013-02-25 22:03:52

2

我做了这样的事情在Delphi中。诀窍是不添加标签,而是添加标签,按钮等的子类,以调用事件上的父母事件。

子类只是覆盖Click,Move等并调用父类。简单,如果你有很多这样的话,可以节省很多时间。

+0

您能否介绍一下如何重写一个事件? – Blazi 2013-02-26 07:27:23

+0

class ParentUserControl:UserControl {0} {0} public override void OnMouseDown } } //你的新控件源于此............ \t类ParentClickButton:按钮 \t { 保护覆盖无效onmousedown事件(MouseEventArgs mevent) { ((ParentUserControl)this.Parent).OnMouseDown(mevent); base.OnMouseDown(mevent); } \t} //你新的控制增加了这些,而不是按钮... – CharlesW 2013-02-26 15:52:20

+0

另外,看看这个帖子的另一种方法,我以前用过:http://stackoverflow.com/questions/547172/pass-through- mouse-events-to-parent-control – CharlesW 2013-02-26 15:52:40