UserControl的事件处理程序不会触发

时间:2012-01-19 10:28:32

标签: c# winforms visual-studio-2010

我的UserControl包含各种控件。我为其click事件创建了一个事件处理程序。我希望当用户点击我的用户控件上的任何地方时触发/调用事件处理程序。

这是我用来将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点击事件的事件处理程序触发?

2 个答案:

答案 0 :(得分:6)

您的用户控件的结构是什么?点击事件不会在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内部触发Click事件:

this.OnClick(e);

答案 1 :(得分:0)

您似乎走在正确的轨道上,但目前尚不清楚您的contact是什么。通常,对于具有要传递的参数的方法,使用委托(实质上是指向函数的指针):

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

您确定要删除预先存在的代理,否则他们将“堆叠”,在不需要时触发多个方法。

对于上面的方法,在我看来使用EventHandler是正确的方法,但正如我在上面所述,检查contact是否属于正确类型将不会被忽略:< / p>

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

我希望这会有所帮助。