如何在运行时将一个面板更改为另一个面板?

时间:2013-10-19 19:21:13

标签: c# .net winforms

我正在尝试使用winforms创建多页面应用程序。我决定使用多个面板 - 每个面板代表不同的页面,所以当我需要显示不同的内容时,我可以在它们之间切换。  我在运行时的问题是当我尝试在面板之间切换时它不起作用。

我的代码:

private void Form2_Load(object sender, EventArgs e)
{
    panel2.Visible = false;
}

private void label4_Click(object sender, EventArgs e)
{
    panel1.Visible = true;
}

private void label5_Click(object sender, EventArgs e)
{
    panel2.Visible = true;
    panel1.Visible = false;
}

7 个答案:

答案 0 :(得分:1)

private void Form2_Load(object sender, EventArgs e)
{
    panel2.Visible = false;
}

private void label4_Click(object sender, EventArgs e)
{
    panel1.Visible = true;
    panel2.Visible = false;
}

private void label5_Click(object sender, EventArgs e)
{
    panel2.Visible = true;
    panel1.Visible = false;
}

答案 1 :(得分:0)

这取决于如何布置面板。我怀疑你甚至没有将面板添加到表单中,或者将面板放在错误的位置。我想您要填充Panels中的Form,我们可以使用BringToFont()方法来显示您的面板。试试这个:

private void Form2_Load(object sender, EventArgs e){
  panel1.Dock = panel2.Dock = DockStyle.Fill;
  panel1.Parent = panel2.Parent = this;//this refers to Form2
}

private void label4_Click(object sender, EventArgs e) {
  panel1.BringToFront();//show panel1
}

private void label5_Click(object sender, EventArgs e){
  panel2.BringToFront();//show panel2
}

注意:要了解相关信息,请务必确保label4_Clicklabel5_ClickForm2_Load已正确注册。您还应该以不同方式设置BackColor of panel1 and panel2`,如下所示:

//your Form2 constructor
public Form2(){
  label4.Click += label4_Click;
  label5.Click += label5_Click;
  Load += Form2_Load;
  panel1.BackColor = Color.Green;
  panel2.BackColor = Color.Red;
}

由于您将面板填充到所有表单客户矩形中,因此label4应添加到panel2label5应添加到panel1

答案 2 :(得分:0)

此外,您需要重新找到面板

panel1.Location = new Point(0, 0); //the preferd new postion
panel2.Location =new Point(1000,1000)//far away
panel2.Visible=false;
panel1.Visible=true;

答案 3 :(得分:0)

这正是因为您将一个面板放在另一个面板的顶部,这些面板正在重叠。 因此,在执行程序时,您无法看到至少一个面板。程序中没有错误,但要避免此问题,请按照以下步骤操作。

1.在加载表格时,请确保最初隐藏所有面板。

2.在将任何面板可见性更改为true时,请确保将所有面板的可见性设置为false(隐藏)。

3.删除彼此重叠的面板。

谢谢。

答案 4 :(得分:0)

另一个解决方案是使用没有标题的TabControl,这在IDE中更易于管理,因为您可以看到标签,并且可以在设计时间间在它们之间切换,并且它们在运行时隐藏时间。

看到这个: How do I create a TabControl with no tab headers?

非常适合巫师等: - )

只需添加更改当前有效标签的按钮。

private void button1_Click(object sender, EventArgs e)
    {
        tabControl1.SelectTab("tabPage2");
    }

答案 5 :(得分:0)

如果panel2在panel1中,则panel1将成为panel2的父级(而不是您的表单)。如果是这种情况,那么如果隐藏父(panel1),则将panel2设置为可见将不起作用。您可以尝试并排放置面板,看看点击按钮是否有效。

此问题的解决方法是在代码中设置 Parent 属性:

    private void Form1_Load(object sender, EventArgs e)
    {
        panel1.Parent = this;
        panel2.Parent = this;           
    }

答案 6 :(得分:0)

我是这样的:当我命名面板时,他们所有的名字都以“pnl”开头。由于对象的名称是正确的,我们可以像这样搜索它

private void panelVibility(Control ctr)
{
    foreach (Control item in this.Controls)
    {
        if (item.Name.StartsWith("pnl"))
        {
            item.Location = new Point(12, 27);
            item.Visible = false;
        }
    }
    ctr.Visible = true;
}

例如,当您通过button_Click调用方法时,您可以将要转为可见的面板发送为参数。

private void btnPnl1_Click(object sender, EventArgs e)
{
    panelVibility(pnl1);
}