2010-08-26 49 views
0

我有一個簡單的應用程序:如何中斷窗體的構造函數?

Form1的
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()); 
    } 
} 

構造:

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並且答案是否定的 - >應用程序關閉。

+1

只需將該邏輯放入表單的靜態方法即可。所以你甚至可以在創建表單之前調用它。 – 2010-08-26 15:50:02

回答

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」)具有有責任檢查當時是否可以顯示錶格。

記住要從程序中的表示中分離邏輯。

這樣做。

+0

謝謝布魯諾。 – alexander 2010-09-09 08:01:48

+0

對不起,長期以來,我以爲我檢查你的答案是有用的。 – alexander 2010-09-09 08:02:12

+0

@alexander:嘿,沒問題!謝謝,我希望答案很有用。 – 2010-09-09 23:51:54

1

在表單加載事件中完成此操作會更容易。你可以調用Close()。

在構造函數中調用Close()會導致問題,因爲窗口尚未打開。你最終會得到一個仍在試圖打開的處置窗口。

相關問題