【问题标题】:Allowed Menustrip only one child at momentAllowed Menustrip 只有一个孩子
【发布时间】:2011-08-12 07:37:51
【问题描述】:

当我点击菜单条中的菜单时,如何一次只允许一个窗口?

例如:我有 Menustrip Ordre、Tarif 等...当我第一次单击 Ordre 时,它​​将打开一个新表单,但第二次我想禁止它。

 private void ordresToolStripMenuItem_Click(object sender, EventArgs e)
    {

        if (Already open)
        {

        }
        else
        {
            Lordre newMDIChild = new Lordre(ClientId);
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            // Display the new form.
            newMDIChild.Show();                
        }

    }

提前谢谢你

【问题讨论】:

  • 那么,您第二次想要什么行为?是否应该禁用菜单项?是否应该激活已经存在的表单实例?

标签: c# winforms menustrip


【解决方案1】:

如果您希望仅在第一次创建表单,然后在下次选择菜单项时显示相同的表单,则可以这样做:

private Lordre orderForm = null;
private void ordresToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (orderForm == null)
        orderForm = new Lordre(ClientId);
        // Set the Parent Form of the Child window.
        orderForm .MdiParent = this;

    }
    // Display the form.
    orderForm.Show(); 
    orderForm.Activate();
}

【讨论】:

    【解决方案2】:

    可能是这样的:

    public class MyForm
    {
        private Window _openedWindow;
        private void ordresToolStripMenuItem_Click(object sender, EventArgs e)
        {
    
            if ( _openedWindow != null &&  _openedWindow.Open)
            {
                //
            }
            else
            {
                Lordre newMDIChild = new Lordre(ClientId);
                _openedWindow = newMDIChild;
                // Set the Parent Form of the Child window.
                newMDIChild.MdiParent = this;
                // Display the new form.
                newMDIChild.Show();                
            }
        }
    }
    

    这完全是在浏览器中写的,很久没有写windows应用了,所以具体的类和属性可能会有所不同。

    【讨论】:

      【解决方案3】:

      我通常处理单实例表单的方式就是有一个成员变量来保存它,然后检查它是否为空。

      所以,有一个成员变量:

      private TestForm myTestForm = null;

      然后当您检查时,只需检查它是否为空;如果不是,则在创建表单时将其分配给您的成员变量并附加到子表单关闭事件的事件处理程序。

      if (myTestForm != null)
      {
         MessageBox.ShowDialog("Sorry, you already have a TestForm open!");
      }
      else
      {
         myTestForm = new TestForm();
         myTestForm.FormClosing += myTestForm_FormClosing;
         myTestForm.MdiParent = this;
         myTestForm.Show();
      }
      

      在关闭处理程序中,只需将其设置回 null。

      private void myTestForm_FormClosing(Object sender, FormClosingEventArgs e)
      {
         myTestForm = null;
      }
      

      另外,我做了一些搜索,而不是使用 FormClosing 事件和处理程序,您可以将条件更改为:

      if ((myTestForm != null) && (!myTestForm.IsDisposed())
      

      【讨论】:

        【解决方案4】:

        谢谢大家的回复。

        我找到了这个

        private void ordresToolStripMenuItem_Click(object sender, EventArgs e)
            {
                // a flag to store if the child form is opened or not
                bool found = false;   
                // get all of the MDI children in an array
                Form[] charr = this.MdiChildren;
        
                if (charr.Length == 0)     // no child form is opened
                {
                    Lordre myPatients = new Lordre();
                    myPatients.MdiParent = this;
                    // The StartPosition property is essential
                    // for the location property to work
                    myPatients.StartPosition = FormStartPosition.Manual;
                    myPatients.Location = new Point(0,0);
                    myPatients.Show();
                }
                else     // child forms are opened
                {
                    foreach (Form chform in charr)
                    {
                        if (chform.Tag.ToString() == "Ordre")  // one instance of the form is already opened
                        {
                            chform.Activate();
                            found = true;
                            break;   // exit loop
                        }
                        else
                            found = false;      // make sure flag is set to false if the form is not found
                    }
        
                    if (found == false)    
                    {
                        Lordre myPatients = new Lordre();
                        myPatients.MdiParent = this;
                        // The StartPosition property is essential
                        // for the location property to work
                        myPatients.StartPosition = FormStartPosition.Manual;
                        myPatients.Location = new Point(0,0);
                        myPatients.Show();
                    }
                }  
            }
        

        这是我想要的,但是代码太多了。我想知道我是否可以减少它。

        我必须为我的每一个脱衣舞菜单做这个。

        if (chform.Tag.ToString() == "Ordre")
        
        if (chform.Tag.ToString() == "Another one")
        

        【讨论】:

          【解决方案5】:

          我这样做的方法是首先将屏幕存储在一个类中的变量中,如下所示:

          private Lordre _LordreChildForm = new Lordre(ClientID)
          

          然后像这样为它创建一个属性:

          public Lordre LordreChildForm { get => _LordreChildForm; set => _LordreChildForm = 
          value; }
          

          然后在表单的 Form Closing 事件中将值设置为 null,如下所示:

          private void Lordre_FormClosing(object sender, FormClosingEventArgs e)
          {
                      ClassName.LordreChildForm= null;
          }
          

          现在你可以像这样在按钮点击事件处理程序中设置一个 if 语句:

          private void LordreToolStripMenuItem_Click(object sender, EventArgs e)
          
          {
              if(ClassName.LordreChildForm== null || ClassName.LordreChildForm.IsDisposed)
              {
                  ClassName.LordreChildForm= new DeregisterClub();
                  ClassName.LordreChildForm.MdiParent = this;
              }
              LordreChildForm.Dock = DockStyle.Fill;
              LordreChildForm.Show();
              LordreChildForm.Focus();
          }
          
          

          【讨论】:

            猜你喜欢
            • 2017-08-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多