【问题标题】:How to change one panel to another panel during runtime?如何在运行时将一个面板更改为另一个面板?
【发布时间】:2013-10-28 12:03:21
【问题描述】:

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

【问题讨论】:

  • 什么不工作,你能描述得更好一点吗?
  • 我猜你只是在 label4_Click 事件处理程序中缺少 panel2.Visible = false;
  • IMO,更好的解决方案是为每个面板创建一个专门的UserControl。 Control.Controls.Add(myUserPanel) 或 Control.Controls.Remove(myUserPanel) 切换出面板。这避免了同一设计器视图中出现多个面板的问题。
  • 我试图在单击 label4 时显示 panel1,并且在单击 label5 时 panel2 必须可见。panel1 可见但 panel2 在我单击 label5 时不可见
  • 这样的“堆叠”面板的一个常见问题是,将它们放置在表单上的正上方通常会导致一个面板实际上位于另一个面板内(而不是被表单本身包含) )。仅通过在表格上查看它们可能并不明显! Amoolya 建议使用 UserControl 而不是 Panel 可以防止此类问题。

标签: c# .net winforms


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      非常适合巫师等:-)

      只需添加更改当前活动标签的按钮即可。

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        谢谢。

        【讨论】:

          【解决方案5】:

          这取决于您如何布置面板。我怀疑您甚至没有将面板添加到表单中,或者您将面板放置在错误的位置。我想您想在您的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 已正确注册。您还应该以不同方式设置BackColor ofpanel1andpanel2`,如下所示:

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

          【讨论】:

            【解决方案6】:

            另外你需要重新定位面板

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

            【讨论】:

              【解决方案7】:
              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;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-09-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-25
                相关资源
                最近更新 更多