在面板之间切换

jay*_*ayz 5 c# panel visual-studio winforms

我有1个表单的3个面板来完成输入某些数据的过程.单击面板中的下一个按钮时,应显示下一个面板.最初,我启用了第一个面板的可见性,并禁用了其他面板的可见性.
单击下一个按钮时,将执行以下代码.

      panel1.Visible = false;
      panel2.Visible = true;
Run Code Online (Sandbox Code Playgroud)

为了发展的目的,我把它们并排放在一起(不是一个又一个),它完美无缺.
但是当我把它们放在另一个上面时,上面的代码看起来似乎并不是什么,这意味着当点击下一个按钮时它只显示一个空表格.
然后我也添加了下面的代码.

    panel1.SendToBack();
    panel2.BringToFront();
Run Code Online (Sandbox Code Playgroud)

但它没有用.有人可以帮我弄这个吗.

谢谢.

Han*_*ant 8

这在设计师总是出错,底部面板将成为顶级面板的父母.因此,如果你隐藏底部,你永远看不到顶部的那个.

这可以通过View>(Other Windows)> Document Outline解决,将顶部面板拖回到表单.仍然非常痛苦,您通常需要手动编辑位置,然后在设计器中对表单进行任何更改往往会使面板黯然失色.

有更好的方法来做到这一点.强烈建议使用创建UserControl,它们有自己的设计图面.或者使用RAD方式并使用TabControl执行此操作.您所要做的就是在运行时隐藏选项卡,这是Q + A的主题.

  • 现在,在 VS 2017 中,文档大纲的工具栏中有向上和向下箭头,可以更改顶部面板。(我假设的 Z 顺序)。我几乎疯了,试图弄清楚这一点,但我仍然看不到这些信息的存储位置。现在我可以在不停靠和取消停靠的情况下更改我的面板,并且通常将一个面板作为另一个面板的子项。谢谢! (2认同)

mos*_*kvd 1

您可以使用以下代码同时拥有多个面板,并通过添加到表单的下一个按钮在它们之间进行切换。

public Form1()
    {
        InitializeComponent();
        panel1.Visible = true;
        panel3.Visible = false;
        panel2.Visible = false;
    }

    private void btnNext_Click(object sender, EventArgs e)
    {
        if (panel1.Visible)
        {
            panel1.Visible = false;
            panel2.Visible = true;
            panel3.Visible = false;
        }
        else if (panel2.Visible)
        {
            panel1.Visible = false;
            panel2.Visible = false;
            panel3.Visible = true;
        }
        else if (panel3.Visible)
        {
            panel1.Visible = true;
            panel2.Visible = false;
            panel3.Visible = false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

当然,如果您以升序/降序格式标记面板,标签之间没有间隙,例如 1,2,3,4 或 5,4,3,2 而不是 1,2,4 您可以使用此代码

public Form1()
    {
        InitializeComponent();
        panel1.Visible = true;
        panel2.Visible = false;
        panel3.Visible = false;
    }

    private void btnNext_Click(object sender, EventArgs e)
    {
        TogglePanels();
    }
    public void TogglePanels()
    {
        List<Panel> allPanelsInForm = new List<Panel>();
        foreach (var control in Controls)
        {
            if (control is Panel)
                allPanelsInForm.Add(control as Panel);
        }
        Panel visiblePanel = allPanelsInForm.Where(o => o.Visible).FirstOrDefault();
        int nextPanelId = Convert.ToInt32(visiblePanel.Tag) + 1;
        bool nextPanelExists = allPanelsInForm.Exists(o => Convert.ToInt32(o.Tag) == nextPanelId);
        nextPanelId = nextPanelExists ? nextPanelId : 1;
        foreach (Panel panel in allPanelsInForm)
        {
            panel.Visible = Convert.ToInt32(panel.Tag) == nextPanelId ? true : false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我希望它能帮助你。