我認爲這不是明智的做法在構造函數中關閉窗體。如果你這樣做,表單的用戶不知道是否顯示對話框。
下面的代碼將是相當正常使用:
// in the parent form:
public void ShowMyForm()
{
MyForm form = new MyForm();
form.propertyA = ...;
from.propertyB = ...;
DialogResult dlgResult = form.ShowDialog(this);
ProcessDialogResult(dlgResult);
}
你必須添加特殊代碼,以決定是否ShowDialog的和是否處理對話的結果。
此外,你確定這些屬性不會影響表單是否被顯示嗎?還有未來的變化?
施工期間表格尚未顯示/打開。所以我害怕Close()沒有達到你的期望。
整潔的方法是在Form_Load中進行檢查。添加表單加載事件處理程序,並在那一刻進行檢查。使用屬性DialogResult來表明您決定不顯示錶單。
private void FormMain_Load (object sender, EventArgs e)
{
if (FormShouldNotLoad())
{
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
Close();
}
}
代碼的用戶可以勾選對話框的結果:
// in the parent form:
public void ShowMyForm()
{
MyForm form = new MyForm();
form.propertyA = ...;
from.propertyB = ...;
DialogResult dlgResult = form.ShowDialog(this);
switch (dlgResult)
{
case System.Windows.Forms.DialogResult.Cancel:
...
break;
case System.Windows.Forms.DialogResult.OK:
...
break;
// etc.
}
}
然而,這是行不通的,因爲關閉只能正確地加載完成後調用。因此,不應調用Close(),您應該先調用Close()函數,以便在加載完成後調用Close函數:
加載完成後調用Close()的代碼將如下所示:
private void FormMain_Load (object sender, EventArgs e)
{
if (MyFunc())
{
CancelLoading();
}
}
private delegate void InvokeDelegate();
private void CancelLoading()
{ // will cancel loading this form
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.BeginInvoke(new InvokeDelegate(CloseThisForm));
}
private void CloseThisForm()
{
this.Close();
}
的好處是,在OnFormClosing和OnFormClosed你知道的形式完全相同的地位:它是完全加載,所以你知道在關閉時該怎麼做。
你會得到什麼例外? – 2010-06-18 07:42:38