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



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

此外,您需要重新定位面板

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

这取决于您如何布局面板。我怀疑您甚至没有将面板添加到表单中,或者将面板放置在错误的位置。我想你想在你的Form中填充Panels,我们可以使用 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已正确注册。您还应该以不同的方式设置 panel1 and panel2' BackColor of,如下所示:

//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

这正是

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

1.加载表格时,请确保所有面板最初都处于隐藏状态。

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

3.尝试移除彼此重叠的面板。

谢谢。

另一种解决方案是使用没有标头的TabControl,这在 IDE 中更容易管理,如您所看到的选项卡,并且可以在设计时在它们之间切换,并且它们在运行时是隐藏的。

看到这个:如何创建没有选项卡标题的选项卡控件?

非常适合巫师等:-)

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

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

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

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

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

我是这样的:当我命名面板时,它们的所有名称都以"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);
}

最新更新