从自定义控件中调用父级

时间:2014-04-09 09:50:14

标签: c# winforms

我有一个表单,在这个表单上是一个带有多个自定义TextBox的flowlayoutpanel 该表单覆盖了基本方法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();

但有更清洁的方法吗?

1 个答案:

答案 0 :(得分:1)

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

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();
    }

    // ...
}

这样,父表单可以决定在用户​​控件请求刷新时要执行的操作。有关活动的详细信息,请参阅此link