C# 选择通过单击按钮打开的选项卡

C# 选择通过单击按钮打开的选项卡,c#,winforms,tabs,C#,Winforms,Tabs,我有一张有按钮的表格。如果单击该按钮,将打开另一个窗体。如果我在tab的帮助下返回到父窗体,并再次单击同一按钮,则它不会执行任何操作 这是我的密码: private void pictureBox1_Click(object sender, EventArgs e) { form wadd = new form(this); if ((IsFormAlreadyOpen(typeof(form))) == null)

我有一张有按钮的表格。如果单击该按钮,将打开另一个窗体。如果我在tab的帮助下返回到父窗体,并再次单击同一按钮,则它不会执行任何操作

这是我的密码:

private void pictureBox1_Click(object sender, EventArgs e)
        {
             form wadd = new form(this);
             if ((IsFormAlreadyOpen(typeof(form))) == null)
             {
                 wadd.MdiParent = Form1.ActiveForm;
                 wadd.Show();
             }          
        }
 public static Form IsFormAlreadyOpen(Type FormType)
        {
            foreach (Form OpenForm in Application.OpenForms)
            {
                if (OpenForm.GetType() == FormType)
                    return OpenForm;
            }
            return null;
        }  



private void Form1_MdiChildActivate(object sender, EventArgs e)
        {
            if (this.ActiveMdiChild == null)
                tabForms.Visible = false;
            // If no any child form, hide tabControl 
            else
            {
                this.ActiveMdiChild.WindowState = FormWindowState.Maximized;
                // Child form always maximized 

                // If child form is new and no has tabPage, 
                // create new tabPage 
                if (this.ActiveMdiChild.Tag == null)
                {
                    // Add a tabPage to tabControl with child 
                    // form caption 
                    TabPage tp = new TabPage(this.ActiveMdiChild.Text);
                    tp.Tag = this.ActiveMdiChild;
                    tp.Parent = tabForms;
                    tabForms.SelectedTab = tp;                                      

                    this.ActiveMdiChild.Tag = tp;
                    this.ActiveMdiChild.FormClosed += new FormClosedEventHandler(ActiveMdiChild_FormClosed);
                }
                else
                {

                    tab();
                }

                if (!tabForms.Visible) tabForms.Visible = true;

            }
        }
        public void tab()
        {
            for (int i = 0; i < tabForms.TabCount; i++)
            {
                if (tabForms.TabPages[i].Text == this.ActiveMdiChild.Text.ToString())
                {
                    tabForms.SelectedTab = tabForms.TabPages[i];
                    break;
                }
            }
        }

        private void ActiveMdiChild_FormClosed(object sender, FormClosedEventArgs e)
        {
            //Destroy the corresponding Tabpage when closing MDI child form
            if (tabForms.HasChildren)
            {
                ((sender as Form).Tag as TabPage).Dispose();
            }            
            //If no Tabpage left
            else if (!tabForms.HasChildren)
            {
                tabForms.Visible = false;                
            }            
        }

        private void tabForms_SelectedIndexChanged(object sender, EventArgs e)
        {
            if ((tabForms.SelectedTab != null) && (tabForms.SelectedTab.Tag != null))
                (tabForms.SelectedTab.Tag as Form).Select();            
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {            
            if (!tabForms.HasChildren)
            {
                Application.Exit();
            }            
        }

我想要的结果是,当我再次单击按钮时,选项卡应聚焦于此表单,而不是打开不允许的新表单。

我相信您想要这样的内容:

form wadd;
private void pictureBox1_Click(object sender, EventArgs e)
    {
         if (wadd == null)
         {
             wadd = new form(this);
         }
         wadd.MdiParent = Form1.ActiveForm;
         wadd.Show();

    }

你只是把逻辑倒过来了。如果没有打开的表单,则创建它,然后打开它。如果已经有一个表单,那么就使用它。

我想你会想要这样的东西:

public Form FormOpened<T>()
    {
        foreach (Form form in Application.OpenForms)
            if (typeof(T) == form.GetType())
                return form;

        return null;
    }
form f = (form)FormOpened<form>();
if (f2 == null)
{
    f2 = new form();
    f2.MdiParent = this;
    f2.Show();
}
else
{
    f2.Focus();
}
然后您可以这样使用它:

public Form FormOpened<T>()
    {
        foreach (Form form in Application.OpenForms)
            if (typeof(T) == form.GetType())
                return form;

        return null;
    }
form f = (form)FormOpened<form>();
if (f2 == null)
{
    f2 = new form();
    f2.MdiParent = this;
    f2.Show();
}
else
{
    f2.Focus();
}

如果您需要帮助,请告诉我。

我不知道您在哪里告诉表单要打开哪个选项卡。。。我是不是错过了什么?还有,正式的ReadyOpenReturn是什么?顺便说一句,我相信这个方法有一个更好的名称……它是用于openformif-not返回null的,我可以在代码中看到这一点。调试时。。。它返回的是什么?好的,很抱歉我错过了一些东西。实际上它返回了我的父窗体。我有代码打开选项卡,f2。focus不使用选项卡。我真的需要其他部分。iff2=空我怎么才能得到所需的标签你是什么意思。。。?我就是不明白你的要求。所以有一大堆标签,每个标签代表一个打开的窗口。当您尝试打开一个已经有选项卡的窗口时,它只是将所选选项卡设置为该选项卡?