从自定义控件调用父控件

本文关键字:控件 调用 自定义控件 | 更新日期: 2023-09-27 17:57:29

我有一个表单,这个表单上有一个带有多个自定义TextBox的流程布局面板该表单重写了基方法Refresh(),还做了一些其他事情。现在,我正在深入研究家长,以便最终出现在表单上并刷新

this.Parent.Parent.Parent.Refresh();

我想在其他表单上重复使用控件,那么有其他方法吗?

我知道一段时间(真的)是可能的:

Boolean diggToParent = true;
var parent = this.Parent;
while (diggToParent)
{
    if (parent.Parent != null)
    {
        parent = parent.Parent;
    }
    else
        break;
}
parent.Refresh();

但是有没有更干净的方法呢?

从自定义控件调用父控件

您可以通过创建并引发由父窗体处理的事件来解决此问题:

public class MyUserControl : UserControl
{
    // ...
    public event EventHandler RequestRefresh;
    // Call this method whenever you want the parent to refresh
    private void OnRequestRefresh()
    {
        if (RequestRefresh != null)
            RequestRefresh(this, EventArgs.Empty);
    }
}

在父窗体(或应该刷新的容器)中,添加一个事件处理程序,例如

public class MyParentForm : Form
{
    public MyParentForm()
    {
        InitializeComponent();
        userCtrl.RequestRefresh += userCtrl_RequestRefresh;
    }
    // Do whatever the parent thinks is necessary to refresh.
    public void userCtrl_RequestRefresh(object sender, EventArgs e)
    {
        Refresh();
    }
    // ...
}

这样,当用户控件请求刷新时,父窗体可以决定要做什么。有关事件的详细信息,请参阅此链接。