具有多种形式的面板,使用按钮选择最顶层

时间:2017-08-15 17:52:29

标签: c# panel layer subform

所以我有一个主菜单,侧面有按钮,面板是我的“主显示区域”(panelactive)。

当我单击表单的按钮来填充窗格时,我需要显示相关表单并将其显示为最顶层。 如果它已经激活我想要它只是来到TOP。

我有这个代码

for /F "usebackq tokens=*" %%X in ("N:\Some Directory\Some File.txt") do if /I "%foldername%" EQU "%%X" goto SKIPIT
REM Do your normal stuff here
:SKIPIT

但问题是,在调用新表单填充面板后,每个表单都不会“隐藏”。

我确实尝试了可见的VISIBLE ..然而它只在表单初始化后才有效..但是我不希望所有表单在启动时初始化,因为很可能只有一个表单将被用户使用并且我有一个选择6,其中一个是相当重的记忆。

所以我需要:

  1. 检查是否已启动
  2. 如果没有,请启动并移至顶部
  3. 如果是,只需显示并隐藏其他已启动的表单,以便以后不必重新加载..
  4. 我已经尝试过了,我无法理解如何检查所有表格,如果它们在那里以及是否可见等等。

    或者我这样做完全错了吗?

    Thansk寻求建议。 Gangel

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

    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();
            }
    

    更新1 : 按照建议将我的表单转换为Usercontrol。

    我现在似乎无法让oCon变得不那么努力。似乎没有确定控件已经存在!

    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 个答案:

答案 0 :(得分:1)

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

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

我动态创建了所有内容,因此您不需要与设计师混淆以使其工作。它将记录面板中有多少UC,因此您知道它抓住现有的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());
    }
}