显示MDI子窗体后等待-替代DoEvents

时间:2020-06-01 15:14:38

标签: vb.net showdialog mdichild doevents

一个同事对我的应用程序进行了一些改进,但与此同时,他更改了整个应用程序以使用MDI子窗体。因此,在以前我可以使用ShowDialog()使子例程等到新窗体关闭以继续的地方,现在我不能了。我改编了一些旧的VB6代码以尝试复制相同的功能,但是它使用了DoEvents(),并且被告知要不惜一切代价避免这种情况。

在这一点上,我忍不住觉得我的方法论存在一个基本缺陷,并且可能有一种简单得多的方法来完成相同的任务。

    Private Sub Label_EditNode_Click(sender As Object, e As EventArgs) Handles Label_EditNode.Click
        Dim Frm As New frmVariableEditor With {
            .Tag = "FrmVariableEditor",
            .MdiParent = FrmMDIMain,
            .Dock = DockStyle.Fill,
            .Location = Me.Location,
            .Size = Me.Size,
            .myFieldName = "NodeClick",
            .myResultText = txbNodeClick.Text
        }

        Frm.Show()
        Call WaitOnFormUnload()

        txbNodeClick.Text = Frm.myResultText
    End Sub

    Public Sub WaitOnFormUnload()
        Dim bIsLoaded As Boolean = True
        Dim FormName As String = Me.MdiParent.ActiveMdiChild.Name ' Form.ActiveForm.Name
        Do While bIsLoaded
            bIsLoaded = False

            For Each f As Form In Application.OpenForms
                If f.Name = FormName Then
                    bIsLoaded = True
                    Application.DoEvents()
                    Exit For ' breaks the for loop
                End If
            Next f
        Loop
    End Sub

1 个答案:

答案 0 :(得分:0)

是这样的:

Private Sub Label_EditNode_Click(sender As Object, e As EventArgs) Handles Label_EditNode.Click
    Dim Frm As New frmVariableEditor With {
        .Tag = "FrmVariableEditor",
        .MdiParent = FrmMDIMain,
        .Dock = DockStyle.Fill,
        .Location = Me.Location,
        .Size = Me.Size,
        .myFieldName = "NodeClick",
        .myResultText = txbNodeClick.Text
    }

    AddHandler Frm.FormClosing, AddressOf RetrieveBlahData

    Frm.Show()

End Sub

Private Sub RetrieveBlahData(sender as Object, e as FormClosingEventArgs)
   txbNodeClick.Text = DirectCast(sender, frmVariableEditor).myResultText
End Sub

除了共享一个数据对象外,可能没有其他最小化的东西:

    Dim Frm As New frmVariableEditor With {
        .Tag = "FrmVariableEditor",
        .MdiParent = FrmMDIMain,
        .Dock = DockStyle.Fill,
        .Location = Me.Location,
        .Size = Me.Size,
        .myFieldName = "NodeClick",
        .DataSetToBindTo = Me.DataSetWhatever
    }

您必须重新编码表格,以便它接受传入数据集(或其他数据容器)的表单并从中获取数据(数据绑定)..然后,当编辑器表单更改数据时,它实际上是也要更改主表单中的原始数据集,因为它们是同一件事

相关问题