一位同事对我的应用程序进行了一些改进,但与此同时,他更改了整个应用程序以使用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
是这样的:
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
Public Sub RetrieveBlahData(sender as Object, e as FormClosingEventArgs)
txbNodeClick.Text = DirectCast(sender, frmVariableEditor).myResultText
End Sub