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...对我来说似乎不是很好的编码,有没有其他方法可以获得最顶级的父母?
您可以将这样的属性添加到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)