Form.Close后会发生什么?

时间:2012-03-19 11:14:58

标签: c# .net winforms

我有像

这样的代码
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永远不会为null。

如何正确检查表单是否未实例化或用户是否已关闭?

3 个答案:

答案 0 :(得分:3)

您可以使用自定义bool开关并在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; 
   }
}

答案 1 :(得分: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;
    }
}

答案 2 :(得分:1)

您可以使用“On Form Closing”事件。

它有点讨厌,但你可以在用户关闭表单时设置一个标志(并将其恢复为onFormLoad)