关闭窗体后启用按钮

Enable a button after closing a form

本文关键字:启用 按钮 窗体      更新时间:2023-10-16

我想在第二个表单关闭时启用主表单中的按钮。我读过一些关于调用的书,但不是很懂。

我怎样才能做到这一点?

关闭第二个表单时,将自动引发其FormClosed事件。在引发事件之前,可以将事件处理程序注册到事件。这使您能够编写在事件发生时自动执行的代码。

在。net中注册事件处理程序是通过向事件添加委托实例来实现的。委托是描述方法签名的类型。如果使用gcnew实例化委托,则将其与代码中的函数关联。您可以自己调用委托(这里不需要),或者您可以将它传递给其他代码,然后这些代码可以调用它。后一个用于事件。

对于您的情况,这意味着:

  1. 查看FormClosed事件的委托类型。它是定义为delegate void FormClosedEventHandler(Object^ sender, FormClosedEventArgs^ e)
  2. 的FormClosedEventHandler。
  3. 这意味着你必须实现一个不返回任何东西(void)并接受两个参数的方法:System::Object和System::Windows::Forms::FormClosedEventArgs
  4. 实例化一个FormClosedEventHandler委托并将其与你的方法关联
  5. 在第二个表单上注册FormClosed事件并启用事件处理程序中的按钮。

一个例子:

ref class MainForm
{
    ...
    // event handler function (compatible to the FormClosedEventHandler delegate)
    void OnSecondFormClosed(Object^ sender, FormClosedEventArgs^ e)
    {
        myButton->Enabled = true;
    }
    void DoSomethingWithSecondForm(Form^ secondForm)
    {
        // get a disabled Button
        myButton->Enabled = false;
        // create an event handler by instantiating a delegate
        FormClosedEventHandler^ handler = gcnew FormClosedEventHandler(this, &MainForm::OnSecondFormClosed);
        // register event handler
        secondForm->FormClosed += handler;
    }
    ...
}

(我没有编译代码,但这是它的一般工作方式)

当涉及的两个表单都是从同一个线程中创建的,就不需要做一些额外的Invoke。否则,必须将对控件的更改放入创建该控件的同一线程中。您可以通过将委托传递给Control::InvokeControl::BeginInvoke来实现这一点。

// event handler function (compatible to the FormClosedEventHandler delegate)
void OnSecondFormClosed(Object^ sender, FormClosedEventArgs^ e)
{
    if (myButton->InvokeRequired)
    {
        // create a delegate to call the same event handler again
        FormClosedEventHandler^ handler = gcnew FormClosedEventHandler(this, &MainForm::OnSecondFormClosed);
        // BeginInvoke causes the delegate to be called asynchronously from the UI thread
        myButton->BeginInvoke(handler, sender, e);
        // nothing to be done here, the actual work happens when the delegate is actually called
        return;
    }
    myButton->Enabled = true;
}