【问题标题】:Avoid opening of duplicate mdi child避免打开重复的 mdi child
【发布时间】:2012-10-11 15:06:09
【问题描述】:

我需要在 VB.Net vs2008 中打开一个 MDI 子项的实例...此代码会打开同一个 MDI 子项的多个副本;我得到了 c# 的答案 Prevent duplicate MDI children forms,但没有找到 VB.Net vs 2008 的答案

Dim myChild As New Form1()
myChild.MdiParent = Me
myChild.Show()

【问题讨论】:

    标签: vb.net winforms mdi


    【解决方案1】:

    这是 Fredrik Mörk 代码的 VB.Net 版本:

    For Each f As Form In Application.OpenForms
      If TypeOf f Is Form1 Then
        f.Activate()
        Return
      End If
    Next
    
    Dim myChild As New Form1
    myChild.MdiParent = Me
    myChild.Show()
    

    【讨论】:

      【解决方案2】:

      试试这个

      private void button1_Click(object sender, EventArgs e)
      {
         FormCollection fc = Application.OpenForms;
         bool FormFound = false;
         foreach (Form frm in fc)
         {
            if (frm.Name == "Form2")
            {
                frm.Focus();
                FormFound = true;
            }
         }
      
         if (FormFound == false)
         {
             Form2 f = new Form2();
             f.Show();
          }
      }
      

      【讨论】:

        【解决方案3】:

        可以使用泛型(在 C# 和 VB.net 选项下方)实现方法,这在需要打开不同的 MDI 表单时很有用。

        VB.NET

        Public Sub Open_MDI(Of T As {New, Form})(bMultipleInstances As Boolean)
            If bMultipleInstances = False Then
                For Each f As Form In Me.MdiChildren
                    If TypeOf f Is T Then
                        If (f.WindowState = FormWindowState.Minimized) Then
                            f.WindowState = FormWindowState.Maximized;
                        End If
        
                        f.Activate()
                        Exit Sub
                    End If
                Next
            End If
        
            Dim myChild As New T()
            myChild.MdiParent = Me
            myChild.Show()
        End Sub
        

        如下使用(为bMultipleInstances指明False以防止它们)

        Open_MDI(Of Form2)(False)
        

        C#

        private void OpenMDI<T>(bool multipleInstances)
            where T : Form, new()
        {
            if (multipleInstances == false)
            {
                // Look if the form is open
                foreach (Form f in this.MdiChildren)
                {
                    if (f.GetType() == typeof(T))
                    {
                        // Found an open instance. If minimized, maximize and activate
                        if (f.WindowState == FormWindowState.Minimized)
                        {
                            f.WindowState = FormWindowState.Maximized;
                        }
        
                        f.Activate();
                        return;
                    }
                }
            }
        
            T newForm = new T();
            newForm.MdiParent = this;
            newForm.Show();
        }
        

        如下使用(在multipleInstances中注明false以防止它们)

        OpenMDI<Form2>(false);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-23
          • 1970-01-01
          • 2019-10-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多