如果表单每次都是新生成的,C# 如何处理表单的一次性启动条件?

C# How do I handle a one time startup condition for a form if the form is generated new each time?

我有 form A,它会在事件发生后打开 form B,然后自行隐藏。 Form Bform A 生成条件然后 returns 到 form A 并自行关闭;但是,由于与代码冲突,我将不得不重新生成 form A 以免遇到 Whosebug 异常/我的应用程序未正确关闭(由于 form A,主窗体被隐藏)

这有点令人困惑,基本上我已经通过每次都将主窗体声明为新窗体来解决这个问题,但是,我希望能够处理首次启动事件,例如某些应用程序的教程消息。无需创建日志来存储我的布尔值的开销,我将如何检测它是否是第一次打开表单?

通常我会:

Event(){
  bool startup;
  if (startup = true) {
  startup = false;
  return;
  }
  //Rest of code
}

但是,由于每次都会生成新的表单,所以这将始终保持不变。

代码如下:

表格A变量:

 Account AccountForm = new Account();

按钮事件:

        AccountForm.QR = this;
        this.Hide();
        AccountForm.ShowDialog();

表格 B:

public Form QR { get; set; }

按钮事件:

    QR = new QueryRefiner();
    this.QR.Show();
    this.Close();

我想的就这些了。我从 QR 中取出新的声明,我会收到 Whosebug 异常。我想我应该为此创建一个新问题,但确实如此。 (我想我还在计时)

好吧,一个简单的解决方案是在 FormA 中创建一个新的构造函数来获取一个参数,表明它是从 FormB 创建的,例如:

public FormA(bool byFormB)
{
    if (byFormB)
    {
        //do what you have to do when it's created from FormB
    }
}

然后从 FormB 中像这样创建它:FormA frm=new FormA(true);

无论如何,我不会每次都创建一个新的FormA,只是hide/show它。

这是一种方法:在您的 FormB 中公开 public 属性,其中包含对 FormA 的引用。当您从 FormA 创建 FormB 的实例时,将引用设置为指向 FormA。然后,在 FormBForm_Closing() 事件中,显示 FormA.

您还可以在 FormA 上公开 public 属性 and/or 方法,以便 FormB 可以将它收集的任何信息传递回 FormA 之前它退出:

public partial class FormB : Form
{
    public FormA formToShowOnClose { get; set; }

    private void FormB_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (formToShowOnClose != null)
        {
            formToShowOnClose.TableName = txtTableName.txt;
            formToShowOnClose.LoadData();
            formToShowOnClose.Show();
        }
    }

    // Other form B code here...
}

public partial class FormA : Form
{
    public string TableName { get; set; }

    public void LoadData()
    {
        // Do something with TableName here
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var formB = new FormB();
        formB.formToShowOnClose = this;
        this.Hide();
        formB.Show();
    }

    // Other form A code here...
}