C# - 通过十字架关闭Form2后无法看到Form1

时间:2016-03-10 21:31:31

标签: c# forms

我在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。

2 个答案:

答案 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;
}