【问题标题】:Disable controls of MDI form when child is open子打开时禁用 MDI 窗体的控件
【发布时间】:2013-08-13 07:23:19
【问题描述】:

我有一个名为 MainForm 的 MDIParent 表单。它有一个名为 SelectDB 的子窗体。在 SelectDB 表单中,我有一个按钮,单击该按钮会打开 FileDialog 以浏览并选择一个 .MDB 文件。文件的路径显示在文本框中。获得 .MDB 文件后,子窗体关闭并且 MainForm 可见。在 MainForm 我有一个标签,它应该显示我在文本框中得到的路径。此外,当子表单打开时。菜单条也应该被禁用,或者你可以说 MDI 表单中的所有控件都应该被禁用。

我的 MainForm.vb (MDIParent) 代码是这样的:

导入 System.Windows.Forms

Public Class MainForm

    Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        sDB.MdiParent = Me
        sDB.Show()
    End Sub

    Public Sub Formload()
        msMenu.Enabled = True
        lblPath.Text = OG.GetValue("DBPath")
        Me.Refresh()
    End Sub
End Class

我的 SelectDB.vb(子表单)代码是这样的:

Public Class SelectDB    

    Private Sub btnBrowse_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnBrowse.Click
        Dim dlg As New OpenFileDialog
        dlg.DefaultExt = ".txt"
        dlg.Filter = "MDB Files (*.mdb)|*.mdb"
        Dim result As Nullable(Of Boolean) = dlg.ShowDialog()
        If result = True Then
            Dim filename As String = dlg.FileName
            txtPath.Text = filename
        End If
        OG.SetValue("DBPath", txtPath.Text)
        main.Formload()
        Me.Hide()
    End Sub

    Private Sub btnExit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Application.Exit()
    End Sub

    Private Sub SelectDB_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Application.Exit()
    End Sub

End Class

请帮帮我。

【问题讨论】:

  • 这应该是使用 ShowDialog() 显示的对话框,而不是 MDI 子项。您将免费获得您询问的所有其他内容。
  • 是的,使用ShowDialog()而不是Show(),子视图将获得焦点,父视图将阻止焦点,直到子视图关闭。
  • 如果我想在 MDI 表单中显示子表单怎么办。使用 ShowDialog() 仅显示子窗体。\
  • ShowDialog() 只会显示您的“子窗体”,然后禁用您的 MDIForm。或者,如果您希望 MDIForm 成为子窗体的容器,只需键入 ShowDialog(Me)

标签: c# .net vb.net winforms


【解决方案1】:

me.dispose() 代替 me.hide() 。这将帮助您完成预期的工作。

【讨论】:

    【解决方案2】:

    您想要实现的目标有多种选择,(Hans Passant 已经提到)是最简单的选择:使用 ShowDialog() 而不是 Show。

    第二个选项:首先您可以在主窗体中创建一个公共方法,并在打开和关闭时从客户端调用该方法。喜欢:

    [主要形式]

    public void ChildControls(bool IsEnabled)
    {
      msMenu.Enabled = IsEnabled;
    }
    

    [孩子]

     private void child_Activated(object sender, EventArgs e)
        {
            if (this.MdiParent != null)
                ((mainForm)this.MdiParent).ChildControls(false);
        }
        private void child_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (this.MdiParent != null)
                ((mainForm)this.MdiParent).ChildControls(true);
        }
    

    第三个选项

    使用主窗体的 MdiChildActivate 事件。当ActiveMdiChild == null 您可以再次启用控件。但是,当您使用 MdiChildActivate 并且您有更多(和不同的)Mdi(子)表单时,您应该在(取消)激活控件之前执行类型检查。

    【讨论】:

      猜你喜欢
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多