2017-09-04 77 views
0

我製造具有這樣的功能的程序:檢查表單是否已打開的最佳方法?

  • 如果形式soanthao被打開,那麼程序將添加一個新的標籤頁到soanthao形式的tabControlEx控制

  • 如果沒有打開表格soanthao,程序會首先載入soanthao表格,然後程序會在soanthao表格的tabControlEx控件中添加一個新的標籤頁。

需要注意的是tabControlEx控件沒有標籤頁。

我用這個代碼:

soanthao st = new soanthao(); 
      bool opened=false; 
      FormCollection fc = Application.OpenForms; 

      foreach (Form frm in fc) 
      { 
       if (st == frm) 
       { 
        opened = true; 
       } 
      } 
      if (opened==false) 
      { 

       RichTextBox rtb = new RichTextBox(); 
       TabPage tb = new TabPage(); 
       tb.Text = textBox1.Text; 
       st.tabControlEx1.TabPages.Add(tb); 
       rtb.Parent = tb; 
       rtb.Dock = DockStyle.Fill; 
       st.Show(); 
       this.Hide(); 
       opened = false; 
      } 
      if (opened == true) 
      { 

       RichTextBox rtb = new RichTextBox(); 
       TabPage tb = new TabPage(); 
       tb.Text = textBox1.Text; 
       st.tabControlEx1.TabPages.Add(tb); 
       st.tabControlEx1.SelectTab(st.tabControlEx1.TabCount - 1); 
       rtb.Parent = tb; 
       rtb.Dock = DockStyle.Fill; 
       this.Hide(); 
      } 

但問題是程序會打開一個新的soanthao形式,即使soanthao形式已經打開。

+1

你可能想要考慮崩潰那些冗長的if塊 - 大多數內部代碼看起來是相同的和/或安全的,即使是冗餘的 - 例如即使只有一個選項卡,即使已經顯示,也應該能夠在窗體上調用「Show」,並選擇「SelectTab」。 –

+0

[打開表單如果沒有其他實例打開 - 將類型傳遞給方法](https://stackoverflow.com/q/37512074/3110834) –

回答

3

我建議使用Linq;如果你想找出是否soanthao已經開通:

using System.Linq; 

... 

soanthao st = Application 
    .OpenForms 
    .OfType<soanthao>() 
    .LastOrDefault(); // If many soanthao are opened, take the last one 

if (st != null) { 
    // "st" is the soanthao instance opened 
} 
else { 
    // no opened soanthao instance, let's create it 
    st = new soanthao(); 

    ... 

    // ...and show up 
    st.Show(); 
} 

在你的方法錯誤是在st == frm行:

foreach (Form frm in fc) 
{ 
    // You actually check if "st" instance is opened and it's not, but created only 
    if (st == frm) // <- Error is here 
    { 
     opened = true; 
    } 
} 

要修改你的方法:

bool opened = false; 

foreach (Form frm in Application.OpenForms) { 
    // Do we have ANY soanthao form opened? 
    if (frm is soanthao) { // ... i.e. if an opened form is of type soanthao? 
    opened = true; 
    break; 
    } 
} 

... 
+0

它現在不會打開新表單,但問題是現在該程序不會將新標籤頁添加到soanthao表格 –

+0

@TùngVương - 確保您現在使用'form'而不是'st'。第一步發現它是空的(所以沒有這樣的表單被打開)是*然後*設置'form = new soanthao();' –

+0

你能解釋一下嗎,我不是很明白你的意思嗎 –

相關問題