2016-03-02 72 views
1

我嘗試在C#中顯示/隱藏面板,但是當我單擊button1時,我想要看到panel1但出現了panel2。 而當我在按鈕2上cliked時,panel2消失。 但是,當我在button2上先登場時,panel2沒有出現。 我不知道什麼是錯我的代碼,但在這裏它是:在C#中隱藏/顯示Windows窗體面板#

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(); 
    } 
+0

不幸的是你的代碼是不完整的問題不能用你所擁有的東西來複制。也許你的事件是通過反向連接而成的? –

+0

panel2.Visible =!panel2.Visible和panel1.Visible =!panel1.Visible – Anil

+2

您可以刪除Application.DoEvents。第一:不鼓勵它的使用(請參閱http://stackoverflow.com/questions/5181777/use-of-application-doevents),第二:在'Click'方法退出後,Control立即返回到UI線程,因此更新將馬上完成。 –

回答

6

不要使用的標誌,因爲你的按鈕的行爲將被標誌的狀態來確定。

最好是按照你想要的方式進行編碼。如果你希望每個Button進行,而其他面板無形對應的面板可見:

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()可以被刪除(信貸到Thorsten Dittmar),因爲無論如何,該控件將立即返回到UI線程。請閱讀他的comment和推薦的link

+0

我嘗試使用這段代碼,但是當我啓動程序時出現了panel2(我試圖讓出現一個空白麪板)。當我點擊button1出現了panel1,但是當我點擊button2時,panel2沒有出現。 – MariaD

+0

@MariaD考慮到這個命令很奇怪,可以設置panel2.Visible = true。首先,當你點擊按鈕時,你可以調試該線是否真正執行。接下來,確認你的面板名稱是否正確。除此之外,你可能需要使用VS調試器逐行檢查。 – Ian

+0

我回顧了我的表單設計,並且看到了另一個空白麪板panel2的名稱,在這種情況下,當我點擊button2時,我的panel2沒有出現,但現在正在工作並感謝您的幫助。 – MariaD

3

不要使用像show1show2的全局變量 您可以這樣做。

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

這裏沒有必要使用'Application.DoEvents()',因爲該方法將被退出。雖然'Application.DoEvents()'的使用無論如何都被認爲是有問題的,這裏就不需要了。 –

+1

@ThorstenDittmar:我不知道爲什麼'op'想要調用'Application.DoEvents()',但我無論如何都留在那裏以防萬一他需要它。 –

+2

啊,我原來的問題沒有讀到。也要在那裏發表評論。 –

0

無需使用變量和條件。 只需添加panel1.Visible = false; or panel1.Visible = true;按鈕點擊

0

您可以找到解決辦法,但我只是想推薦你使用SuspendLayout()ResumeLayout()性能改進而改變控制狀態

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(); 
} 
+0

我嘗試,但沒有工作。 – MariaD