2012-03-19 146 views
0

我有這樣Form.Close後會發生什麼?

void onDgvRelations_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.ColumnIndex == 2 && ktlg == null) 
    { 
     this.Cursor = Cursors.WaitCursor; 
     ktlg = new FormKatalog(); 
     ktlg.Show(); 
     this.Cursor = Cursors.Default; 
    } 
} 

的想法是一個代碼來檢查形式

FormKatalog ktlg

關閉。如果它已關閉,我必須創建一個新表單並將其顯示給用戶。 問題是用戶關閉表單後,變量ktlg永遠不會爲空。

如何正確檢查表單是否未實例化或被用戶關閉?

+0

的[?C#如何檢查表格已經打開,並關閉它,如果它(可能重複http://stackoverflow.com/questions/3861602/c-如果該表格已經打開並關閉它,如果是這樣) – jgauffin 2012-03-19 11:25:00

回答

3

可以使用自定義布爾開關,並將其設置在Form.Closed事件處理

// on the class level 
private bool isClosed = false; 

void OnCellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{  
    if (e.ColumnIndex == 2 && (ktlg == null || this.isClosed))  
    { 
     this.Cursor = Cursors.WaitCursor 
     if (ktlg == null) 
     { 
      ktlg = new FormKatalog(); 
      ktlg.FormClosed += (s, e) => this.isClosed = true; 
     } 

     this.isClosed = false; 
     ktlg.Show();   
     this.Cursor = Cursors.Default; 
    } 
} 
+0

ktlg是一個變量,所以它不能是this.isClosed – 2012-03-19 11:27:11

+0

@Ask:can'不明白,哪一行代碼讓你困惑? – sll 2012-03-19 11:27:55

+0

if(e.ColumnIndex == 2 &&(ktlg == null || this.isClosed)) – 2012-03-19 11:32:55

1

您可以使用「On Form Closing」事件。

它有點cheaty但是當用戶關閉表單,你可以設置一個標誌(並回復它onFormLoad)

2

我假設ktlg變量是一個類成員?然後,你可以做到以下幾點:

void onDgvRelations_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.ColumnIndex == 2 && ktlg == null) 
    { 
     this.Cursor = Cursors.WaitCursor; 

     if (ktlg == null) 
     { 
      ktlg = new FormKatalog(); 
      ktlg.FormClosed += (sender, e) => ktlg = null; 
      ktlg.Show(); 
     } 
     else 
      ktlg.BringToFront(); 

     this.Cursor = Cursors.Default; 
    } 
} 
+0

爲什麼當'ktlg!= null'實例化一個新窗體? )(** 0 **,e)' - 零不正確的名字:) – sll 2012-03-19 11:24:24

+1

只有當'ktlg'爲'null'時,控制才進入第一個'if',所以'if(ktlg!= null)'中的代碼無法訪問。 – 2012-03-19 11:28:14

+0

糟糕:-)更正... – 2012-03-19 11:35:15