C#winforms / UserControls - 如何从UserControl1触发事件到UserControl2

时间:2011-11-06 18:44:16

标签: c# winforms global-variables

我正在尝试从UserControl1触发位于UserControl2中的Button1_Click事件。

从我的主窗体

动态加载控件
//UserControl2
public partial  class ItemsModule : UserControl
{
        private void ButtonRefreshProperties_Click(Object sender, EventArgs e)
        {
            RefreshControls();
        }
        public void RefreshControls()
        {
            SomeCode();
        }
}

/// MainForm this is how i add the Control from the Main Form

ItemsModule im = new ItemsModule();
im.Name = "ItemsModule";
flpModules.Controls.Add(im);

//UserControl1
public partial class TreeViewControl :  UserControl
{
    private void ItemTreeView_MouseDoubleClick(Object sender, MouseEventArgs e)
    {
        String ItemId = ItemTreeView.SelectedNode.Name;
        Variables.CurrentItemID = ItemId;
        if (LoadedModules.Items)
        {
            //Here I would like a way to trigger ItemsModule.ButtonRefreshProperties_Click
        }
    }

}  

1 个答案:

答案 0 :(得分:2)

UserControl1需要引用UserControl2。获得引用后UserControl1应调用UserControl2上导致事件被引发的方法。

您可以通过构造函数,子属性或属性将UserContro2的引用传递给UserControl1,具体取决于应用程序的结构。您应该将引用存储在UserControl1的私有字段中,以便您可以从DoubleClick事件处理程序访问它。

也可以通过其他方式进行设置。您可以将UserControl2设置为父窗体上的属性,然后UserControl1可以将其.Parent属性强制转换为正确的类型,并将该属性用作参考。

您还可以将第3课设为singleton,并引用UserControl2

所有这些解决方案的共同之处在于,某种方式UserControl1需要引用UserControl2才能对其执行任何操作。

通过让UserControl1引发父窗体侦听的事件,可以避免引用问题。由于父表单应该已经引用了它上面的所有控件,因此您可以让表单代理调用UserControl2中的调用。