Winforms 防止多个表单实例

Winforms 防止多个表单实例,winforms,forms,instance,Winforms,Forms,Instance,如何防止打开多个表单 是的。在表单上显示,但用户可以再次单击主表单和按钮,然后打开另一个表单实例。两个选项,具体取决于您的需要: 使用而不是Show,这将打开一个模式窗口。如果在子窗体打开时不需要主窗体处于活动状态,这是一个显而易见的解决方案 或者跟踪主窗体中已打开的窗口,如果该窗口已打开,则不执行任何操作。如果您希望用户能够在子窗体已打开时使用主窗体,可能需要打开其他窗体,则需要执行此操作 禁用主窗体直到子窗体消失,或者禁用按钮 button_onClick(object Sender, Ev

如何防止打开多个表单


是的。在表单上显示,但用户可以再次单击主表单和按钮,然后打开另一个表单实例。

两个选项,具体取决于您的需要:

  • 使用而不是
    Show
    ,这将打开一个模式窗口。如果在子窗体打开时不需要主窗体处于活动状态,这是一个显而易见的解决方案

  • 或者跟踪主窗体中已打开的窗口,如果该窗口已打开,则不执行任何操作。如果您希望用户能够在子窗体已打开时使用主窗体,可能需要打开其他窗体,则需要执行此操作


  • 禁用主窗体直到子窗体消失,或者禁用按钮

    button_onClick(object Sender, EventArgs e)
    {
       Button   btn = sender as Button;
       btn.Enabled = false;
       Form myform = new MyForm();
       myform.Show();
    }
    
    当然,如果需要模态行为,您确实应该使用
    form.ShowDialog()
    ,而不是
    form.Show()

    执行以下操作:

    SingleForm myform = null;
    
    void ShowMyForm_Click(object sender, EventArgs e) 
    {     if (myform == null)
           {
                 myform = new SingleForm();  
            } 
           myform.Show();
           myform.BringToFront(); 
     }
    

    强制表单对象遵循单例模式

    我更喜欢使用泛型和延迟加载来处理表单。因为我所有的表单都继承自基类,所以我可以使用相同的方法将表单带到前面,发送到后面,销毁它们,启动它们,等等

    如果您保留一个负责管理任何已加载表单的表单管理器类,则可以将任何表单带到前端,或者阻止特定表单返回,除非满足某些条件

    public void LoadForm<T>() where T : MyNameSpace.MyBaseForm 
    {
        // Load all your code in this joint and just call it when you
        // need a form. In here, you can determine if a copy of the form
        // already exists and then bring it forward or not
    } 
    
    public void LoadForm(),其中T:MyNameSpace.MyBaseForm
    {
    //将所有代码加载到此关节中,并在需要时调用它
    //需要一份表格。在这里,您可以确定是否需要一份表格的副本
    //是否已存在,然后将其向前推进
    } 
    
    这样更好,但这并不能防止用户意外或故意将主窗体再次带到前面。他没有说主窗体必须留在后台…他只是不希望用户在单击按钮时能够打开另一个窗体…;)但是对于编辑的thx。。。哦…我想我是误读了。我在想,当一个按钮点击时,会打开第二个表单……idkI打算添加.ShowDialog()作为另一个选项,但John K.和Johannes抢先了我一步