我有一个简单的应用程序:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
Form1的构造函数:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// ...
if (some_condition)
{
DialogResult dr = MessageBox.Show("Do you want to continue ?", "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
if (dr == DialogResult.No)
{
// How to close the window normally or how to not create a Form1 instance ?
//
//
}
}
// amount of code that executes only if some_condtion == false
}
}
我知道我可以在Application.Run之前检查some_condition但是很难改变(相信我)。我需要检查Form1的构造函数中的some_condition。如果some_condition == true且答案为否 - &gt;申请结束。
答案 0 :(得分:1)
在表单加载事件中完成此操作会更容易。你可以调用Close()。
在构造函数中调用Close()会导致问题,因为窗口尚未打开。你最终会得到一个仍然试图打开的处理窗口。
答案 1 :(得分:1)
构造函数的目的是创建一个对象的实例。因此,除非对象的某些前提失败,否则它不应该失败。在这种特殊情况下,您唯一的选择是抛出异常。
换句话说:你调用一个对象的构造函数来创建这个对象的实例,所以这是一个原子函数,除非你遇到技术问题,否则不应该失败。
现在,您想要的是避免在某些条件下显示表单。有一些方法可以做到这一点。首先,让我们看一下代码:
Application.Run(new Form1());
此代码段正在做两件事:创建Form1
的实例并显示它(通过将其提供给Application.Run
)。所以一个选择是:
// snippet at program.cs
Form1 mainForm = new Form1();
if (mainForm.IsValid)
{
Application.Run(new Form1());
}
// snippet at Form1.cs
public bool IsValid
{
get
{
// evaluate all conditions that should determine if the form is to be showed.
return condition;
}
}
您在program.cs中添加代码以检查表单是否有效。一种方法是将其作为表单中的属性公开。当然,如果你关注separation of concerns,也许这可能是你域名的方法/属性,但是你可以把它放在哪里。
此方法/属性(在我的代码中称为“IsValid”)有责任检查当时是否可以显示表单。
请记住将逻辑与程序中的演示文稿分离。
那就行了。