为什么在用户从Form.ShowDialog()返回后MDI子节点没有获得焦点?

本文关键字:子节点 MDI 焦点 返回 用户 Form ShowDialog 为什么 | 更新日期: 2023-09-27 17:53:52

我有一个打开并显示dataGridView的MDI子表单(FormA)。

用户可以通过打开MDI之外的另一个表单(FormB)来更改数据库中的记录。意思是用FormB.ShowDialog()而不是FormB.Show().来调用

FormA有一个激活事件,我想在用户从FormB返回时抛出该事件。我这样做是为了刷新datagridview的数据源。

似乎FormA永远不会失去焦点,我需要这样做,以便在用户返回时抛出激活的事件。这是故意的吗?如何实现此功能?

编辑

FormB是从FormA的MDI父类调用的。而不是FormA本身

为什么在用户从Form.ShowDialog()返回后MDI子节点没有获得焦点?

为什么需要Activated事件?FormB.ShowDialog()以模态状态打开FormB,因此调用形式FormA的代码的执行被中断。
请参阅示例(在FormA中使用):

using (FormB frm = new FormB())
    if (frm.ShowDialog(this) == DialogResult.OK)
    {
        // here FormB is closed by user.
    }

编辑
由于FormB是从MDI父进程打开的,因此可以将当前活动的表单保存为变量,然后将执行传递给它。在MDI父表单中试试:

FormA saveForm = ActiveMdiChild as FormA;
using (FormB frm = new FormB())
    if (frm.ShowDialog(this) == DialogResult.OK)
    {
        if (saveForm != null)
            saveForm.UpdateDataGridView();  // Call the method of a previously active form.
    }

您也可以尝试ActivateMdiChild方法来激活子表单