C# - 通过叉号关闭 Form2 后无法看到 Form1

  • 本文关键字:Form1 Form2 c# forms
  • 更新时间 :
  • 英文 :


我是 C# 的新手,花了一整天的时间寻找解决这个问题,以解决我遇到的问题,如果这很简单,或者已经很抱歉了!我有两个表单,主窗体和配置窗体。主要加载,并有一个按钮打开配置表单,然后隐藏自己,如下所示:

private void btnConfig_Click(object sender, EventArgs e)
{
    Config config = new Config();
    config.Show(); 
    this.Visible = false;
}

它工作正常,配置窗体打开。配置来自有两个按钮(保存和关闭按钮)。本质上,这两个按钮具有相同的最终效果,关闭配置窗体并重新显示主窗体,编码如下:

    private void btnClose_Click(object sender, EventArgs e)
    {
        this.Hide();
        Main main = new Main();
        main.Visible = true;
    }      
问题是,如果我使用"十字"关闭配置

屏幕,配置将"关闭",但不显示 Main 并且程序继续运行。我尝试使用OnFormCloseing并陷入了一个可怕的循环!叉号应执行与保存/关闭按钮相同的操作,隐藏配置窗体并再次打开 Main。

如果您想显示配置表单并在配置更改时重新显示主窗体,您通常需要一些东西作为配置表单来显示模态。

要显示模态表单,您将使用 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;
}

这也为您提供了通过设置 DialogResult配置窗体的属性,以便在关闭之前DialogResult.Cancel

我不太确定你到底在寻找什么,但这就是我会怎么做。

将函数更改为以下内容,并在主窗体类下有一个私有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;
} 

最新更新