2017-09-04 2 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

당신은 수도 :

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; } } 

당신의 접근 방식을 수정하려면 그 긴'if '블럭을 무너 뜨리는 것을 고려하고 싶습니다. - 대부분의 코드는 내부적으로 동일하거나 안전하다고 보입니다 - 예 하나의 탭만있는 경우에도 이미 표시되어있는 경우에도 '표시'를 호출하고 '선택 탭'을 호출 할 수 있어야합니다. –

+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 라인에 있습니다

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 -'st'보다는'form'을 사용하고 있는지 확인하십시오. 첫 번째 단계는 null이라는 것을 발견 한 후 (그러한 양식이 열리지 않았 음) * form = new soanthao();를 설정하는 것입니다. –

+0

더 설명 할 수 있습니까, 내가 무슨 뜻인지 정말로 모르겠다. –

관련 문제