首页 > 解决方案 > 从winform中的子用户控件调用位于父用户控件中的函数

问题描述

这是我的父表格:

 public partial class ParentControl: UserControl
 {

    public ParentControl()
    {
        InitializeComponent();   
    }

     private void button1_Click(object sender, EventArgs e)
    {
        ChildForm child= new ChildForm ();
        child.Dock = DockStyle.Fill;
        TabPage tabNewChild= new TabPage("Child");
        tabNewChild.Controls.Add(child);

        tabDetails.TabPages.Add(tabNewChild);
        tabDetails.SelectedIndex = tabDetails.TabPages.IndexOf(tabNewChild);
    }
     void CloseTab()
     {
          \\Close the selected tab
     }
}

这是我的孩子用户控件:

public partial class ChildForm : UserControl
{
    public ChildForm ()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
         \\Call the CloseTab in parent user control.
    }
}

实现这一点的最佳和正确方法是什么?

我研究了代表和事件参数,但无法决定使用什么。

我有很多模块将以这种方式实现,这就是为什么我想知道正确的方法。多谢。

标签: c#winforms

解决方案


一个好的解决方案是在您的用户控件上创建一个在请求关闭时触发的事件:

public partial class ChildForm : UserControl
{
    public ChildForm ()
    {
        InitializeComponent();
    }

    public event EventHandler CloseTabRequested;

    protected virtual void OnCloseTabRequested(EventArgs e)
    {
         CloseTabRequested?.Invoke(this, EventArgs.Empty);
    }

    private void button1_Click(object sender, EventArgs e)
    {
         OnCloseTabRequested(EventArgs.Empty);
    }
}

您可以在父表单中处理事件:

 public partial class ParentControl: UserControl
 {

    public ParentControl()
    {
        InitializeComponent();   
    }

    private void button1_Click(object sender, EventArgs e)
    {
        ChildForm child= new ChildForm ();
        child.Dock = DockStyle.Fill;
        child.CloseTabRequested += ChildForm_CloseTabRequested;
        TabPage tabNewChild= new TabPage("Child");
        tabNewChild.Controls.Add(child);

        tabDetails.TabPages.Add(tabNewChild);
        tabDetails.SelectedIndex = tabDetails.TabPages.IndexOf(tabNewChild);
    }

    void ChildForm_CloseTabRequested(object sender, EventArgs e)
    {
        CloseTab((ChildForm)sender);
    }

    void CloseTab(ChildForm requestingForm)
    {
        \\Close the selected tab
    }
}

使用此解决方案,用户控件不会绑定到特定的父窗体以实现最大的可重用性。它还避免了子表单对父表单的依赖,这是一个很好的设计。


推荐阅读