在面板之间切换

时间:2015-07-19 07:20:26

标签: c# winforms visual-studio panel

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

      panel1.Visible = false;
      panel2.Visible = true;

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

    panel1.SendToBack();
    panel2.BringToFront();

但它没有用。有人可以帮我这个。

谢谢。

3 个答案:

答案 0 :(得分:8)

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

这可以通过View>解决。 (其他Windows)>文档大纲,将顶部面板拖回到表单。仍然非常痛苦,你通常需要手工编辑位置,然后在设计师中对表单进行任何更改往往会使面板黯然失色。

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

的主题

答案 1 :(得分:4)

将容器控件(例如Panel'放在另一个上时)必须小心。

在设计师中,您可以执行此操作,但通过使用键盘轻轻移动面板。只要左上角进入另一个角落,使用鼠标将始终将移动的置于而不是 另一个

作为替代方案,您可以移动代码。

在代码中执行此操作具有仍然能够使用下面板及其内容的优点。有时我将它们填入(在运行时不可见的)虚拟标签的标签页中,然后将其移入或移出页面以隐藏和显示它们。

答案 2 :(得分: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;
        }
    }

当然,如果您以升序/降序格式标记您的面板,标签之间没有间隙,例如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;
        }
    }

我希望它可以帮到你。