我在C#上相当新,并花了一整天的时间来找到一个灵魂来解决这个问题,如果这很简单,或者已经在这里,我会道歉!我有两个表单,Main和Config。主要负载,并有一个按钮打开配置表单,然后隐藏自己:
private void btnConfig_Click(object sender, EventArgs e)
{
Config config = new Config();
config.Show();
this.Visible = false;
}
它工作正常,Config表单打开。 Config from有两个按钮(保存和关闭按钮)。本质上,两个按钮具有相同的结束效果,关闭Config表单并重新显示Main表单,编码如下:
private void btnClose_Click(object sender, EventArgs e)
{
this.Hide();
Main main = new Main();
main.Visible = true;
}
问题是,如果我使用'cross'关闭Config屏幕,Config将'关闭',但Main不会显示,程序将继续运行。我尝试过使用OnFormClosing并陷入了糟糕的循环! Cross应该与Save / Close按钮相同,隐藏Config表单并再次打开Main。
答案 0 :(得分:2)
如果你想在配置发生变化时显示配置表格并重新显示主表格,你通常会想要一些配置表格显示Modal。
要显示模态表单,您将使用ShowDialog()
。 ShowDialog()
也是一个阻止调用,它使您能够选择离开的位置。
在主体中:
private void btnConfig_Click(object sender, EventArgs e)
{
var config = new Config();
this.Visible = false;
// this call blocks!
var dialogResult = config.ShowDialog();
// when the configform is closed, the code resumes here
this.Visible = true;
}
这也为您提供了通过设置取消配置表单的可能性
在关闭之前,Config表单的DialogResult
属性为DialogResult.Cancel
。
答案 1 :(得分:1)
我不太确定你正在寻找什么,但这就是我要去做的事情。
将您的功能更改为以下内容,并在主表单类下包含一个私有Config
对象。
private Config config;
private void btnConfig_Click(object sender, EventArgs e)
{
if(config==null || config.IsDisposed)
{
config = new Config(this); // Pass the main form into the constructor of config
}
config.ShowDialog();
this.Visible = false;
}
创建一个构造函数(用于Config),它将主窗体作为参数接收,并将主窗体作为私有对象。这使您可以将原始表单显示为每次只创建一个新表单。
private Form mainForm;
public Config(Form main)
{
mainForm = main;
}
改变你的近距离行动。
private void btnClose_Click(object sender, EventArgs e)
{
this.Hide();
mainForm.Visible = true;
}