在我当前的应用程序中,我有一个main form: frmMain
,其中包含statusstrip
和label: 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 way,Event Handler
,但是我不能这样做,因为我的用户控件实际上还不在我的mainForm中,直到我在那里添加它,点击按钮,所以我没有对它的引用。
所以我有点想法,我希望有人可以帮助我。 谢谢, 托马斯
编辑:所以我设法通过以下方式完成:
frmMain owningForm = (frmMain)this.Parent.Parent.Parent.Parent;
owningForm.updateStatus = "This is a test";
但是this.Parent.Parent.Parent.Parent...
对我来说似乎不是很好的编码,有没有其他方法可以获得最顶级的父母?
答案 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 =“这是一个测试”;