我的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
点击事件的事件处理程序触发?
答案 0 :(得分:6)
您的用户控件的结构是什么?点击事件不会在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);
答案 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);
}
我希望这会有所帮助。