2012-03-19 144 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