【问题标题】:How to make only one windows form show at a time?如何一次只显示一个窗体?
【发布时间】:2012-03-07 12:36:34
【问题描述】:

我有一个包含 3 个案例的组合框。案例“0”打开一个对话框,说“不是一个有效的选择” 但是案例“1”和案例“2”打开了自己单独的表格。 (FormMain 和 Form3)

如果 Form3 已打开 FormMain 无法打开,我该如何做到这一点,并且会出现一个消息框这样说。我不只是想要“.hide”功能。我已经有那套了。

我尝试了一些不同的方法,但都没有奏效。我在表单加载和组合框中选择的索引中尝试了它们

有什么建议吗?

【问题讨论】:

    标签: .net windows vb.net winforms combobox


    【解决方案1】:

    您可以实现某种静态类来保留当前显示的表单的实例。 确保每个表单在显示之前检查这个静态类。

    可能是这样的。

        public static classs FormManager
    {
    
        private static Form currentForm=null;
        public static Form CurrentForm
        {
            get
            {
                return currentForm;
            }
            set
            {
                this.currentForm=value;
                if (this.currentForm!=null)
                    currentForm.Disposed+=(s,e)=>{FormManager.currentForm=null;};
            }
        }
    }
    
    //at each form
    
    .
    .
    .
    public void TryShowForm()
    {
        if (FormManager.CurrentForm==null)
            FormManager.CurrentForm=this;
        this.Show();
    }
    

    【讨论】:

      【解决方案2】:

      您可以在模块中公开 Form3 和 FormMain dim 语句。在进行测试以查看当前正在运行的内容时,您可以检查表单当前是否正在使用中

      Public newFrm3 as Form3
      Public newFrmMain as FormMain
      
      'blah blah blah
      If IsNothing(Form3) then
          'form is closed, create new
          newFrm3 = new Form3
          newFrm3.Show
      Else
          'form is currently running, display message etc to alert user.
      End If
      

      这假定当用户关闭表单时,您将其对应的变量设置为 Nothing。

      【讨论】:

      • 这让我用 dim 替换 public 并且由于某种原因不接受 formmain 但让我调试警告而不是错误。但不做预期的事情。我把编码放在我的主表单加载中。 (不是formmain,而是form one)。对吗?
      • ComboBox2.SelectedIndexChanged Select Case ComboBox2.SelectedIndex Case 0 Flashwindow(Me.Handle, 1) Dialog1.Show() Case 1 Flashwindow(Me.Handle, 1) FormMain.Show() Dialog1.Hide( ) My.Computer.Audio.Stop() Form3.CanSelect = False Case Else If Form3.CanSelect = False Then MessageBox.Show("NO") End If End Select
      • 我试过了,但没有用,但似乎应该
      • @James,公共声明应该放在一个模块中,以便所有表单都可以看到它。另一个代码是组合框的 Select 语句中应该包含的内容的示例(即,如果选择了 option1,则执行此操作...)所以我所拥有的是朝着您的解决方案迈出的一步,而不是整个事情。我以前用过这个非常快速和肮脏的解决方案。它并不优雅,但确实有效。
      【解决方案3】:

      如果我正确理解您的问题,听起来模态是解决此问题的正确方法。

      您当前正在使用Form.Show method 来显示选定的子窗体。将其替换为 Form.ShowDialog method。代码看起来一样,但ShowDialog 方法将表单显示为模式对话框,这意味着必须先关闭表单,然后用户才能与应用程序中的任何其他表单进行交互。

      此外,如果案例“0”确实“不是一个有效的选择”,您应该强烈考虑从组合框中完全删除该选项。

      【讨论】:

      • 我已经有了这个,这将是我的下一个最佳解决方案。但是我的表单具有暂停功能,因此用户也可以离开并使用程序的其他部分。如果另一个表单是打开的,则只有一个表单我不希望他们能够访问,反之亦然。有一个消息框这么说。我知道消息框部分,但另一部分。
      • case "0" 所以当用户点击下拉列表时,他们会看到选择一个选项 1 选项 2 因此,如果他们点击“选择一个”,我想要一条消息显示它们无效并从其他选项中进行选择。所以我可以问,这是有害的还是什么?它可以根据需要很好地工作。然后我又是编程新手,所以我不明白其中的危害。感谢您的回复。
      • @james:嗯,有可以“暂停”的表单很奇怪。我要么无法想象你的设计,要么它坏了,对你的用户来说也很困难。您必须了解,典型用户对于应用程序的心智模型与开发人员所拥有的不同。而且由于您正在努力弄清楚如何实现它,这应该会提示 其他 Windows 应用程序不能以这种方式工作,因此您的应用程序将与用户的期望背道而驰,那就是从来都不是一件好事。
      • 无论如何,当您想阻止用户与之交互时,您是否考虑过只使用otherForm.Enabled = False?也就是说,使用Form.Enabled 属性作为“暂停”按钮?
      • 并且“选择一个”不应该是组合框中的选项。您应该使用Label 控件next 指示组合框(或上方)。
      猜你喜欢
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多