【问题标题】:Event handler for a UserControl doesn't fireUserControl 的事件处理程序不会触发
【发布时间】:2013-02-13 07:45:35
【问题描述】:

我的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 的点击事件的事件处理程序?

【问题讨论】:

    标签: c# winforms visual-studio-2010


    【解决方案1】:

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

    编辑:

    最简单的解决方案是通过在您的用户控件中附加一个处理程序来手动从每个子项中冒泡事件:

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

    在 child_Click 内部触发您的 Click 事件:

    this.OnClick(e);
    

    【讨论】:

    • 既然如此,我应该怎么做,这样每当我点击我的 UserControl 中的控件时,就像我点击的是 UserControl 本身一样?
    【解决方案2】:

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

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

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

    对于上述方法,在我看来,使用EventHandler 是正确的方法,但正如我上面所说,检查contact 是否属于正确类型不会错过:

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

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多