如何解决如何从子表单打开表单并在主表单面板中显示
我目前正在 C# Visual Studio 2017 中开发 Windows 窗体应用程序,并决定使用教程 seen here 实现侧面板菜单。
单击时显示子表单非常有用,但是我想知道如何在子表单代码中用新的子表单替换当前子表单。 IE。如何在子表单代码中访问主表单。
private Form activeForm = null;
private void openChildForm(Form childForm)
{
if (activeForm != null)
activeForm.Close();
activeForm = childForm;
childForm.TopLevel = false;
childForm.FormBorderStyle = FormBorderStyle.None;
childForm.Dock = DockStyle.Fill;
childFormPanel.Controls.Add(childForm);
childFormPanel.Tag = childForm;
childForm.BringToFront();
childForm.Show();
}
这就是在主窗体中打开子窗体的方式。如何通过子窗体访问此方法? 我相信这可能会令人困惑,但如果您快速浏览一下视频,就会明白我的意思。
谢谢!
解决方法
可以使用保留主窗体实例的静态类。当您加载主窗体时,在 FormController 类中设置 MainForm 静态属性。然后从您的子表单调用 FormControll.openChildForm(...);
public static FormController{
public static Form MainForm {get;set;}
private static Form activeForm = null;
public static void openChildForm(Form childForm)
{
if (activeForm != null)
activeForm.Close();
activeForm = childForm;
MainForm.childForm.TopLevel = false;
MainForm.childForm.FormBorderStyle = FormBorderStyle.None;
MainForm.childForm.Dock = DockStyle.Fill;
MainForm.childFormPanel.Controls.Add(childForm);
MainForm.childFormPanel.Tag = childForm;
MainForm.childForm.BringToFront();
MainForm.childForm.Show();
}
}
然后在您的子表单中,您可以调用该静态类来更改表单。
public class ChildForm{
private void btn_click(...){
FormController.openChildForm(<newChildForm>);
}
}
,
你可以使用事件来处理这个:
步骤 1) 创建一个继承自 Form 的新类。这将是您所有孩子表格的基类。你可以调用这个 ChildForm(继承自)Form。
第 2 步)定义一个新的公共事件,您可以从更改子表单的函数中绑定到该事件。
可能看起来像这样:
public event EventHandler OnRequestChildChange;
第 3 步)在您要申请更改的孩子中,您可以致电:
OnRequestChildChange?.Invoke(null); //这也会传入您的参数,因此您可以创建一个事件,允许您传入自定义参数并传入表单的名称或类型,并在您的事件处理程序中有一个 switch 语句。
第 4 步)绑定到主函数中的事件
private ChildForm activeForm = null;
private void openChildForm(ChildForm childForm)
{
if (activeForm != null){
activeForm.OnRequestChildChange -= Child_RequestChange;
activeForm.Close();
}
activeForm = childForm;
activeForm.OnRequestChildChange += Child_RequestChange;
childForm.TopLevel = false;
childForm.FormBorderStyle = FormBorderStyle.None;
childForm.Dock = DockStyle.Fill;
childFormPanel.Controls.Add(childForm);
childFormPanel.Tag = childForm;
childForm.BringToFront();
childForm.Show();
}
第 5 步)创建事件处理程序“Child_RequestChange”,它将在子进程请求时通过创建新实例或拉取所需新表单的本地实例并调用上述方法来处理交换表单。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。