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

时间:2012-04-03 07:32:57

标签: c# .net winforms user-controls label

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

ucBeheer ucBeheer = new ucBeheer();
splitContainer1.Panel2.Controls.Add(ucBeheer);

当我执行操作时,从usercontrol内部,我想更新lblStatus。我尝试将以下属性添加到我的主窗体中:

    public string updateStatus
    {
        get { return lblStatus.Text; }
        set { lblStatus.Text = value; }
    }

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

        frmMain mainForm = new frmMain();
        mainForm.updateStatus = "This is a test";

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

我还找到following wayEvent Handler,但是我不能这样做,因为我的用户控件实际上还不在我的mainForm中,直到我在那里添加它,点击按钮,所以我没有对它的引用。

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

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

        frmMain owningForm = (frmMain)this.Parent.Parent.Parent.Parent;
        owningForm.updateStatus = "This is a test";

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

3 个答案:

答案 0 :(得分: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;
    }
} 

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

public Control TopMostParent
{
    get
    {
        var parent = Parent;
        while (parent.Parent != null)
        {
            parent = parent.Parent;
        }
        return parent;
    }
} 

甚至可以制作一个扩展方法:

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

答案 1 :(得分:1)

你的控制和形式必须沟通,所以人们需要“了解”另一个。实际上,这意味着提供一个,另一个。所以你有两个选择:控件需要对表单的引用,或者表单需要对控件的引用。

我这样做的方式是让表单订阅控件发布的事件。这个表单只提供了一个控制方法。

class StatusChangedEventArgs : EventArgs
{
    public string Text { get; set; }
}

partial class MyControl : UserControl
{
    public event EventHandler<StatusChangedEventArgs> StatusChanged = delegate { };

    public void RaiseStatusChanged( string message )
    {
        StatusChanged( this, new StatusChangedEventArgs { Text = "message" } );
    }
}

然后,在您的表单中,订阅该活动:

...
ucBeheer ucBeheer = new ucBeheer();
ucBeheer.StatusChanged += HandleStatusChanged;
splitContainer1.Panel2.Controls.Add(ucBeheer);
...

partial class MyForm : Form
{
    void HandleStatusChanged( object sender, StatusChangedEventArgs args )
    {
        lblStatus.Text = args.Text;
    }
}

答案 2 :(得分:-1)

您可以使用Application.OpenForms FormCollection按名称引用应用程序的主窗体:

frmMain owningForm =(frmMain)Application.OpenForms [“frmMain”];

owningForm.updateStatus =“这是一个测试”;