从用户控件更新主窗体中的标签

Sch*_*oof 0 .net c# user-controls label winforms

在我目前的应用程序中,我有main form: frmMain一个statusstrip和一个label: lblStatus内部.我想从我的用户控件中更新该标签,当我点击相关按钮时,我将其添加到我的主窗体中:

ucBeheer ucBeheer = new ucBeheer();
splitContainer1.Panel2.Controls.Add(ucBeheer);
Run Code Online (Sandbox Code Playgroud)

从我内心usercontrol做的时候,我想更新lblStatus.我尝试将以下属性添加到我的主窗体:

    public string updateStatus
    {
        get { return lblStatus.Text; }
        set { lblStatus.Text = value; }
    }
Run Code Online (Sandbox Code Playgroud)

然后在我的用户控件中访问这样的方法:

        frmMain mainForm = new frmMain();
        mainForm.updateStatus = "This is a test";
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我知道这是因为我正在制作我的新对象frmMain,但我不知道如何解决这个问题呢?

我也发现了以下方式,Event Handler但是我不能这样做,因为我的用户控件实际上还没有在我的mainForm中,直到我在那里添加它,点击按钮,所以我没有引用它.

所以我有点想法,我希望有人可以帮助我.谢谢,托马斯

编辑:所以我设法通过以下方式完成:

        frmMain owningForm = (frmMain)this.Parent.Parent.Parent.Parent;
        owningForm.updateStatus = "This is a test";
Run Code Online (Sandbox Code Playgroud)

this.Parent.Parent.Parent.Parent...对我来说似乎不是很好的编码,有没有其他方法可以获得最顶级的父母?

Jen*_*und 5

您可以将这样的属性添加到usercontrol,这样您就可以访问usercontrol所在的frmMain.

public frmMain MainForm
{
    get
    {
        var parent = Parent;
        while (parent != null && (parent as frmMain) == null)
        {
            parent = parent.Parent;
        }
        return parent as frmMain;
    }
} 
Run Code Online (Sandbox Code Playgroud)

更新: 如果你只想要最顶级的父母,你可以使用这样的东西:

public Control TopMostParent
{
    get
    {
        var parent = Parent;
        while (parent.Parent != null)
        {
            parent = parent.Parent;
        }
        return parent;
    }
} 
Run Code Online (Sandbox Code Playgroud)

甚至做一个扩展方法:

public static Control TopMostParent(this Control control)
{
    var parent = control.Parent;
    while (parent.Parent != null)
    {
        parent = parent.Parent;
    }
    return parent;
} 
Run Code Online (Sandbox Code Playgroud)