为什么隐藏子表单也隐藏父表单?

时间:2010-08-16 12:05:48

标签: .net vb.net winforms events showdialog

我有三种形式:A,B和C.

单击按钮后,A显示B.类似地,B显示C.两者都使用ShowDialog()方法。

但是当我在表单C上使用Hide()方法(在Button Click事件中)关闭它时,表单B也会关闭。

为什么会这样?据我所知,它不应该这样做。我当然没有写任何代码来告诉它这样做。

以下是代码:

' from Form "A" (MainForm)
Private Sub OrdersDataGridView_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles OrdersDataGridView.CellDoubleClick
    ShowViewOrderForm(sender)
End Sub

Private Sub ShowViewOrderForm(ByVal CurrentDGV As DataGridView)
    If Not CurrentDGV Is Nothing Then
        Dim f As New ViewOrderForm
        f.SetOrderNo(CurrentDGV.CurrentRow().Cells().Item(0).Value)
        f.SetDeliveryServiceType(CurrentDGV.CurrentRow().Cells().Item(5).Value)

        f.ShowDialog()
    End If
End Sub

' from Form "B" (ViewOrderForm)
Private Sub IssueOrderButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IssueOrderButton.Click
    Dim f As New IssueForm
    f.SetOrderNo(ThisOrderNo)
    f.ShowDialog()
End Sub

' from Form "C" (IssueForm)
Private Sub CloseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseButton.Click
    Me.Hide()
End Sub

更新:我是个白痴。我在按钮上设置DialogResultCancel,因为我从现有的关闭按钮复制+粘贴它,但没有意识到该属性已设置。无论如何,谢谢你的建议!

3 个答案:

答案 0 :(得分:1)

我无法使用您提供的代码重现您所看到的行为。是否有任何形式的其他设置(可能在设计器中设置)可能导致此问题?

此外,Hide()函数实际上并未关闭窗口。它相当于将Visible属性更改为False。了解隐藏here

如果你真的想要关闭窗口,你应该打电话给Me.Close()

答案 1 :(得分:0)

尝试设置子表单的mdiParent属性:

    If IsNothing(_cases) Then
        _cases = New frmGrid        
        _cases.MdiParent = Me
        _cases.init(_main, 0, "", "")
        _cases.WindowState = FormWindowState.Maximized
    End If
    _cases.Visible = Me.mnuViewCaseFiles.Checked

答案 2 :(得分:0)

我唯一能想到的是你在Form B中有一个事件处理程序,它连接到Form C的按钮点击事件......虽然你怎么会这样做而没有意识到我无法想象。

通过执行

在表单B的IssueOrderButton_Click事件中调用show对话框时,尝试设置表单C的父级
f.ShowDialog(Me)

我同意您可能希望使用Me.Close()而不是Me.Hide()