0

我正在尝试使用 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;
}
4

7 回答 7

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;
}
于 2013-10-19T19:33:24.070 回答
0

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

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

    private void Form1_Load(object sender, EventArgs e)
    {
        panel1.Parent = this;
        panel2.Parent = this;           
    }
于 2013-10-22T10:32:07.880 回答
0

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

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

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

3.尝试移除相互重叠的面板。

谢谢你。

于 2013-10-20T13:00:39.487 回答
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;
于 2013-10-20T07:05:35.313 回答
0

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

请参阅: 如何创建没有选项卡标题的 TabControl?

非常适合巫师等:-)

只需添加更改当前活动选项卡的按钮。

private void button1_Click(object sender, EventArgs e)
    {
        tabControl1.SelectTab("tabPage2");
    }
于 2013-10-20T14:04:52.910 回答
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_Click,label5_ClickForm2_Load已正确注册。您还应该以不同的方式设置BackColor ofpanel1 andpanel2`,如下所示:

//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应该添加panel2并且label5应该添加到panel1.

于 2013-10-20T06:49:53.060 回答
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);
}
于 2016-05-27T14:57:30.883 回答