如果表单每次都是新生成的,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 B
为 form 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
。然后,在 FormB
的 Form_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...
}
我有 form A
,它会在事件发生后打开 form B
,然后自行隐藏。 Form B
为 form 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
。然后,在 FormB
的 Form_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...
}