2012-01-19 69 views
2

我的UserControl包含各种控件。我为它的click事件做了一个事件处理程序。我希望事件处理程序在用户点击用户控件上的任何位置时触发/被调用。UserControl的事件处理程序不会触发

这是我用来将我的UserControl添加到我的WinForms应用程序的方法。

private void addContact(some parameters here) 
{ 
    //This is my usercontrol 
    contactsListItem.contactsListItem contact = new contactsListItem.contactsListItem(); 

    // 
    //some codes here 
    // 

    //Adding an event handler for the click event 
    contact.Click += new EventHandler(contact_Click); 

    //Adding the UserControl to my application 
    flowLayoutPanel_contactsList.Controls.Add(contact); 
} 

contact_Click(...)事件处理程序应该改变我UserControl的背景。我尝试着进入代码,看看事件处理程序是否触发,并且我发现它不会触发,无论我点击我的UserControl

我已通过互联网搜索。我遇到了代表,订阅者和发布者等术语。

我应该怎么做才能让我的UserControl的click事件触发事件处理程序?

+1

Winforms或ASP.NET? –

+2

Windows窗体应用程序。 – Xel

回答

5

你的用户控件的结构是什么?点击事件不会在WindForms中冒泡,因此如果您在用户控件内点击某个控件,后者将不会触发任何Click事件。

enter image description here

编辑:

最简单的解决方案是通过在用户的控制连接的处理程序手动泡沫从每个孩子的事件:

child1.Click += new EventHandler(child_Click); 
child2.Click += new EventHandler(child_Click); 
child3.Click += new EventHandler(child_Click); 

和child_Click内火了你的点击事件:

this.OnClick(e); 
+0

既然是这样的话,我应该怎么做,以便每当我点击我的UserControl内的控件时,它会像我点击UserControl本身? – Xel

+0

@Xel请参阅我的编辑 – Strillo

+0

谢谢!有效 :) – Xel

0

你似乎是在正确的轨道上,但不清楚你在这里是什么contact。通常,您使用委托(主要是函数指针,)为有参数传递的方法:

if (bDeleteRdClick) 
    DeleteRD.Click -= delegate { DeleteRDClick(this.Object); }; 
DeleteRD.Click += delegate { DeleteRDClick(this.Object); }; 

你一定要删除预先存在的代表在哪里,否则会“叠加式”,发射多种方法时不是必需的。

对于上面的方法,使用EventHandler在我看来是正确的做法,但正如我上述的状态,是否contact检查是正确的类型不会去unmissed:

if (this.contact.GetType() == typeof(RibbonButton)) 
{ 
    RibbonButton Rb = (RibbonButton)contact; 
    Rb.Click += new EventHandler(contact_Click); 
} 

我希望这个对你有帮助。

相关问题