Form.Close之后会发生什么

本文关键字:什么 Close 之后 Form | 更新日期: 2023-09-27 18:28:19

我有一个类似的代码

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。

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

Form.Close之后会发生什么

您可以使用自定义布尔开关并在Form.Closed Event处理程序中设置它

// 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; 
   }
}

我假设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;
    }
}

您可以使用一个"表单关闭时"事件。

这有点欺骗,但您可以在用户关闭表单时设置一个标志(并在FormLoad上恢复)