C# 在C中隐藏/显示Windows窗体面板#

C# 在C中隐藏/显示Windows窗体面板#,c#,winforms,panel,C#,Winforms,Panel,我试图用C#显示/隐藏面板,但当我点击按钮1时,我想看到面板1,但面板2出现了。 当我按下按钮2时,面板2出现了。 但当我第一次点击按钮2时,面板2并没有出现。 我不知道我的代码有什么问题,但这里是: public Form3() { InitializeComponent(); } bool show1; bool show2; private void button1_Click(object sender, EventArgs e)

我试图用C#显示/隐藏面板,但当我点击按钮1时,我想看到面板1,但面板2出现了。 当我按下按钮2时,面板2出现了。 但当我第一次点击按钮2时,面板2并没有出现。 我不知道我的代码有什么问题,但这里是:

public Form3()
    {
        InitializeComponent();
    }

    bool show1;
    bool show2;
    private void button1_Click(object sender, EventArgs e)
    {
        if(show1)
        {
            panel1.Visible = false;
            show1 = false;
        }
        else
        {
            panel1.Visible = true;
            show1 = true;
        }
        Application.DoEvents();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (!show2)
        {
            panel2.Visible = true;
            show2 = true;
        }
        else
        {
            panel2.Visible = false;
            show2 = false;
        }
        Application.DoEvents();
    }
不要使用标志,因为按钮行为将由标志的状态决定

最好是按照你想要的方式编码。如果希望每个
按钮
使相应的面板可见,而其他面板不可见:

private void button1_Click(object sender, EventArgs e)
{
     panel1.Visible = true;
     panel2.Visible = false;
     //Application.DoEvents();
}

private void button2_Click(object sender, EventArgs e)
{
     panel2.Visible = true;
     panel1.Visible = false;
     //Application.DoEvents();
}
或者,如果希望每个按钮独立控制每个面板的可见性,请执行以下操作:

private void button1_Click(object sender, EventArgs e)
{
     panel1.Visible = !panel1.Visible;
     //Application.DoEvents();
}

private void button2_Click(object sender, EventArgs e)
{
     panel2.Visible = !panel2.Visible;
     //Application.DoEvents();
}
最后,可以删除
Application.DoEvents()
,因为在
单击
方法完成后,控件将立即返回UI线程。阅读他和引用的内容。

不要使用标志,因为按钮的行为将由标志的状态决定

最好是按照你想要的方式编码。如果希望每个
按钮
使相应的面板可见,而其他面板不可见:

private void button1_Click(object sender, EventArgs e)
{
     panel1.Visible = true;
     panel2.Visible = false;
     //Application.DoEvents();
}

private void button2_Click(object sender, EventArgs e)
{
     panel2.Visible = true;
     panel1.Visible = false;
     //Application.DoEvents();
}
或者,如果希望每个按钮独立控制每个面板的可见性,请执行以下操作:

private void button1_Click(object sender, EventArgs e)
{
     panel1.Visible = !panel1.Visible;
     //Application.DoEvents();
}

private void button2_Click(object sender, EventArgs e)
{
     panel2.Visible = !panel2.Visible;
     //Application.DoEvents();
}

最后,可以删除
Application.DoEvents()
,因为在
单击
方法完成后,控件将立即返回UI线程。阅读his和引用的。

不要使用全局变量,如
show1
show2
你可以这样做

private void button1_Click(object sender, EventArgs e)
{
    panel1.Visible = !panel1.Visible; 
    Application.DoEvents();
}

不要使用全局变量,如
show1
show2
你可以这样做

private void button1_Click(object sender, EventArgs e)
{
    panel1.Visible = !panel1.Visible; 
    Application.DoEvents();
}

不需要使用变量和条件。
只需添加
panel1.Visible=false;或面板1。可见=真实在按钮上单击

无需使用变量和条件。
只需添加
panel1.Visible=false;或面板1。可见=真实
点击按钮

您可能会找到解决方案,但我只想建议您在更改控制状态时使用
SuspendLayout()
resumellayout()
,以提高性能

private void button1_Click(object sender, EventArgs e)
{
     this.SuspendLayout();
     panel1.Visible = true;
     panel2.Visible = false;
     this.ResumeLayout();
     //Application.DoEvents();
}

private void button2_Click(object sender, EventArgs e)
{
     this.SuspendLayout();
     panel2.Visible = true;
     panel1.Visible = false;
     this.ResumeLayout();
     //Application.DoEvents();
}

您可能会找到解决方案,但我只想建议您在更改控件状态时使用
SuspendLayout()
resumeloayout()
,以提高性能

private void button1_Click(object sender, EventArgs e)
{
     this.SuspendLayout();
     panel1.Visible = true;
     panel2.Visible = false;
     this.ResumeLayout();
     //Application.DoEvents();
}

private void button2_Click(object sender, EventArgs e)
{
     this.SuspendLayout();
     panel2.Visible = true;
     panel1.Visible = false;
     this.ResumeLayout();
     //Application.DoEvents();
}


不幸的是,您的代码不完整,无法使用您现有的代码重现问题。也许你已经把你的事件向后连接了?panel2.Visible=!panel2.Visible和panel1.Visible=!panel1.visible您可以删除
应用程序.DoEvents
。第一:不鼓励使用它(请参阅),第二:控件在
Click
方法退出后立即返回到UI线程,因此将立即进行更新。不幸的是,您的代码不完整,无法使用您现有的内容重现问题。也许你已经把你的事件向后连接了?panel2.Visible=!panel2.Visible和panel1.Visible=!panel1.visible您可以删除
应用程序.DoEvents
。第一:不鼓励使用它(请参阅),第二:控件在
方法退出后立即返回UI线程,因此更新将立即完成。这里不需要使用
Application.DoEvents()
,因为该方法将退出。虽然
Application.DoEvents()
的使用被认为是有问题的,但这里没有必要使用它。@ThorstenDittmar:我不确定
op
为什么要调用
Application.DoEvents()
,但我还是把它放在那里,以防他需要它。啊,我在最初的问题中没有读到这一点。我也将在那里发表评论。我尝试这样做,但面板没有出现。这里不需要使用
Application.DoEvents()
,因为该方法无论如何都将退出。虽然
Application.DoEvents()
的使用被认为是有问题的,但这里没有必要使用它。@ThorstenDittmar:我不确定
op
为什么要调用
Application.DoEvents()
,但我还是把它放在那里,以防他需要它。啊,我在最初的问题中没有读到这一点。我也将在那里发表评论。我尝试这样做,但面板没有出现。我尝试了,但不起作用。我尝试了,但不起作用。我尝试使用此代码,但当我启动程序时,出现了面板2(我尝试使面板显示为空白)。当我单击按钮1时,出现了panel1,但当我单击按钮2时,panel2没有出现。@MariaD考虑到命令非常清楚,设置panel2.Visible=true,这很奇怪。首先,您可以调试当您单击按钮时是否真的执行了该行。接下来,是确认您的面板名称是否正确。除此之外,您可能需要使用VS debugger逐行检查。我回顾了我的表单设计,在那里看到另一个空白面板,名称是panel2,在本例中,当我单击按钮2时,panel2没有出现,但现在正在工作,感谢您的帮助。我尝试使用此代码,但在启动程序时出现了panel2(我试着做一个空白的面板)。当我单击按钮1时,出现了panel1,但当我单击按钮2时,panel2没有出现。@MariaD考虑到命令非常清楚,设置panel2.Visible=true,这很奇怪。首先,当你单击按钮时,你可以调试行是否真的执行了。接下来,是确认你的面板名称正确。除此之外,你可以我需要使用VS debugger逐行检查。我回顾了我的表单设计,看到了另一个空白面板,名称是panel2,在本例中,当我单击按钮2时,我的panel2没有出现,但现在正在工作,感谢您的帮助。