如何中断窗体的构造函数?

时间:2010-08-26 05:53:24

标签: winforms

我有一个简单的应用程序:

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;申请结束。

2 个答案:

答案 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”)有责任检查当时是否可以显示表单。

请记住将逻辑与程序中的演示文稿分离。

那就行了。