面板有多种形式,选择最上面的按钮

Panel with multiple forms, choose top most with button

所以我有一个主菜单,旁边有按钮,还有一个面板是我的 "main display area" (panelactive)。

当我单击一个表单按钮来填充面板活动时,我需要启动相关表单并显示在最顶部。 如果它已经处于活动状态,我希望它能排在首位。

我有这个代码

Form g = Application.OpenForms["frmpackmenu"];

        if (g == null)
        {
            frmpackmenu frmpackmenu = new frmpackmenu(topack, tocheck, total);
            frmpackmenu.TopLevel = false;
            panelactive.Controls.Add(frmpackmenu);
            frmpackmenu.Dock = DockStyle.Fill;
            frmpackmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            frmpackmenu.Show();
        }
        else
        {
            g.Show();
        }

但这里的问题是调用新表单填充面板后,每个表单都不会"hide"。

我确实尝试了 VISIBLE,但效果很好。但是它只在表格被初始化后才有效。但是我不希望在启动时初始化所有表格,因为用户很可能只会使用一种表格,我有 6 个选择,其中一个非常占用内存。

所以我需要:

  1. 检查是否启动
  2. 如果没有,启动并移动到顶部
  3. 如果是,只显示它并隐藏其他启动的表单,这样以后就不必重新加载了..

我已经尝试过了,但我只是想不通如何检查所有表格是否存在以及是否可见等。

还是我做的完全错了??

谢谢指教。 刚格尔

正在做一个案例陈述,然后永远做这个案例我需要做什么??

if (collectmenu == null)
                {
                    frmcollectmenu frmcollectmenu = new frmcollectmenu();
                    frmcollectmenu.TopLevel = false;
                    panelactive.Controls.Add(frmcollectmenu);
                    frmcollectmenu.Dock = DockStyle.Fill;
                    frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                    frmcollectmenu.Show();
                }
                else
                {
                    collectmenu.Visible = true;
                }
                if (packmenu != null)
                {
                    packmenu.Visible = false;
                }
                if (checkmenu != null)
                {
                    checkmenu.Visible = false;
                }

更新 1: 按照建议将我的表单转换为用户控件。

我现在似乎无法让 oCon 不为空。好像没有识别出控件已经存在!

UserControl oCon = (from UserControl uc in panelactive.Controls where uc.GetType() == typeof(UserControl) && uc.Name == "frmpackmenu" select uc).FirstOrDefault();
        if (oCon == null)
        {
            frmpackmenu frmpackmenu = new frmpackmenu(topack, tocheck, total);
            panelactive.Controls.Add(frmpackmenu);
            frmpackmenu.Dock = DockStyle.Fill;
            frmpackmenu.BringToFront();
        }
        else
        {
            oCon.BringToFront();
        }

用户控件解决方案。这将测试您的面板是否已经拥有控件(按名称 - 但您可以修改它以使用类型,或者任何您想要的字面意思。

创建一个新项目,并将其粘贴到命名空间块中(我不知道您将其命名为什么。可能是 WindowsFormsApp1,或其他)。

我动态地创建了所有内容,因此您无需与设计人员打交道即可使其正常工作。它将记录面板中有多少 UC,因此您知道它是在获取现有的,而不是创建新的。

这里的关键是有了 UC,您只需 "BringToFront",其他一切都为您处理。它不会创建不必要的。我相信这就是你想要的:

public partial class Form1 : Form
{
    Panel pnlMain;
    Panel pnlSelect;
    public Form1()
    {
        InitializeComponent();

        //You will already have all of this - this is just to make a minimal-complete example without the designer.
        pnlSelect = new Panel();
        pnlMain = new Panel();
        this.Controls.AddRange(new Control[] { pnlSelect, pnlMain });
        pnlSelect.Dock = DockStyle.Left;
        pnlMain.Dock = DockStyle.Right;
        pnlSelect.Width = (int)(this.Width * 0.2);
        pnlMain.Width = this.Width - pnlSelect.Width - 25;
        for(int i=0;i<6;i++)
        {
            Button btn = new Button();
            btn.Name = i.ToString();
            btn.Text = i.ToString();
            pnlSelect.Controls.Add(btn);
            btn.Location = new Point(btn.Location.X, btn.Height * i + 5);
            btn.Click += Btn_Click;
        }
        //just to see a difference
        pnlMain.BackColor = Color.Green;
    }

    private void Btn_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        UserControl oCon = (from Control uc in pnlMain.Controls where uc.GetType() == typeof(UserControl) && uc.Name == btn.Name select uc).FirstOrDefault();
        if(oCon == null)
        {
            oCon = new UserControl();
            oCon.Name = btn.Name;
            pnlMain.Controls.Add(oCon);
            Label lbl = new Label();
            lbl.Text = oCon.Name;
            oCon.Controls.Add(lbl);
            //just to see a difference
            oCon.BackColor = Color.Blue;                
        }
        oCon.BringToFront();
        Console.WriteLine("pnlMain has: {0} Children.", pnlMain.Controls.Count.ToString());
    }
}