c# - 如何在 mdi 父窗体中的另一个子窗体上使用按钮打开子窗体
问题描述
我有 3 种形式 MainForm、 Child1 和 Child2 。MainForm 是 mdi 容器。在运行时,子 1 会自动加载到 MainForm 中。我正在尝试从 child1 上的按钮打开表单 child2,但我似乎无法做到。我做了我能做的一切。请帮忙。
我尝试使用 hide show 和 activate 方法,但没有任何效果。child1 和 child2 表单是单独构建的。
public partial class Form1 : Form
{
public child1 c1;
public child2 c2;
public void LoadChild2()
{
if (c2 == null)
{
c2 = new child2() ;
c2.MdiParent = this;
c2.FormClosed += c2_FormClosed;
c2.FormBorderStyle = FormBorderStyle.None;
c2.Dock = DockStyle.Fill;
c2.Show();
}
else { c2.Activate(); }
}
void c2_FormClosed(object sender, FormClosedEventArgs e)
{
c2 = null;
}
public void LoadChild1()
{
if (c1 == null)
{
c1 = new child1();
c1.MdiParent = this;
c1.FormClosed += c1_FormClosed;
c1.FormBorderStyle = FormBorderStyle.None;
c1.Dock = DockStyle.Fill;
c1.Show();
}
else { c1.Activate(); }
}
void c1_FormClosed(object sender, FormClosedEventArgs e)
{
c1 = null;
//throw new NotImplementedException();
}
public Form1()
{
InitializeComponent();
LoadChild1();
// c2 = new child2();
// c1 = new child1();
// c2.MdiParent = this;
// c1.MdiParent = this;
//c1.WindowState = FormWindowState.Maximized;
// c1.FormBorderStyle = FormBorderStyle.None;
//c1.Dock = DockStyle.Fill;
// c2.FormBorderStyle = FormBorderStyle.None;
//c2.Dock = DockStyle.Fill;
// c2.Show();
// c1.Show();
//c1.Activate();
}
public partial class child1 : Form
{
//public child2 c2;
public child1()
{
InitializeComponent();
}
private void child1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Form1 f = new Form1();
f.LoadChild2();
//child2 c2 = new child2();
//Form1 f = new Form1();
//c2.FormBorderStyle = FormBorderStyle.None;
// c2.Dock = DockStyle.Fill;
//c2.MdiParent = f;
// c2.Activate();
// c2.BringToFront();
// this.Hide();
//this.Close();
}
}
public partial class child2 : Form
{
public child2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//this.Close();
Form1 f = new Form1();
f.LoadChild1();
// child1 c1 = new child1();
// c1.FormBorderStyle = FormBorderStyle.None;
// c1.Dock = DockStyle.Fill;
// c1.Parent = f;
// c1.Show();
// c1.Activate();
}
private void child2_Load(object sender, EventArgs e)
{
}
}
解决方案
确保设置MdiParent
属性;如果从Click
现有 MdiChild 上的按钮的事件处理程序生成新表单,则可以将其设置为该孩子的 MdiParent:
// Event handler inside MdiChild form (Child1)
private void spawnNewChildButton_Click(object sender, EventArgs e)
{
// Child2 is a System.Windows.Forms.Form
var child2 = new Child2() { MdiParent = MdiParent };
child2.Show();
}
推荐阅读
- powershell - foreach 循环给出错误 CategoryInfo : InvalidData: (:) [Get-ADUser], ParameterBindingValidationException
- c# - 动态添加“通知面板”以赢得 c#
- python - 将 python 日志记录句柄传递给子模块
- amazon-web-services - AWS Lambda 不会等待代码上传到 Terraform 脚本中的 S3 存储桶
- bash - 使用 sed 转义 $ 符号
- javascript - 即使在定义observedAttributes 之后也不会调用attributeChangedCallback
- python-3.x - 如果 getOpenFileName() 不起作用,如何防止 QGIS 插件崩溃?
- corda - 查询状态属性
- java - 即使使用 addNmeaListener 调用 OnNmeaMessageListener 也不工作
- java - 如何在 ExecutorService 中运行顺序任务