2015-04-08 48 views
0

我想在點擊圖片時打開一個對話框,但是我也不希望用戶能夠在已經打開的情況下打開一個對話框。檢查C#中是否已經打開了無模式對話框,Windows窗體

我也想它是無模式(他們可以使用主界面,而次級對話仍然在後臺打開)

private void pictureBox18_Click(object sender, EventArgs e) 
     { 
      ADCs ADCsdiag = new ADCs(); 
      ADCsdiag.Show(); 
     } 

在這個例子中,我可以打開許多ADCsdiag對話,作爲我希望通過點擊圖片。我想限制打開一個或沒有這種類型的對話。

+0

我處理這個問題是通過添加'FormsCollection'類的方式。在我想限制爲一個實例的任何'Form'中,我將它添加到'FormsCollection'中,然後在'Disposed'方法中,將它從FormsCollection中移除。如果我想限制爲一個實例,我只需檢查'Forms'是否存在於'FormsCollection'中。 –

+0

什麼是「ADC」?另一個「形式」? –

+0

@dubstylee我發現這個工作。謝謝 – SwimBikeRun

回答

2

這裏是FormsCollection類,我在我的評論中提到:

public class FormsCollection : IEnumerable 
{ 
    private Collection c = new Collection(); 

    public Form Item { 
     get { return c.Item(index); } 
    } 

    public void Add(Form frm) 
    { 
     c.Add(frm); 
    } 

    public virtual IEnumerator GetEnumerator() 
    { 
     return c.GetEnumerator; 
    } 

    public void Remove(Form frm) 
    { 
     int itemCount = 0; 

     for (itemCount = 1; itemCount <= c.Count; itemCount++) { 
      if (object.ReferenceEquals(frm, c.Item(itemCount))) { 
       c.Remove(itemCount); 
       break; 
      } 
     } 
    } 
} 

然後你將需要在某個地方實例化一個FormsCollection,然後在中,將它添加到集合中,如下所示:

formsCollection.Add(this); 

Disposed

formsCollection.Remove(this); 

這將讓你ActivateForm,如果它已經加載,而不是打開一個新的實例。

if (FormLoaded(yourForm.Name)) 
{ 
    yourForm.Activate() 
} 
else 
{ 
    yourForm.Show() 
} 

這裏是FormLoaded功能:

public bool FormLoaded(string strFormName) 
{ 
    bool functionReturnValue = false; 
    foreach (Form f in Forms) { 
     if (f.Name == strFormName) { 
      functionReturnValue = true; 
      break; 
     } 
    } 
    return functionReturnValue; 
} 
2

在方法外定義它,並訂閱其Closing事件。

您可以根據需要展示它,當用戶「關閉」它時,您實際上可以取消關閉並將其隱藏起來。如果他們反覆按下按鈕,表格最多隻會顯示一次。

public partial class Form1 : Form 
{ 
    private ADCs ADCsdiag = new ADCs(); 

    public Form1() 
    { 
     InitializeComponent(); 

     ADCsdiag.Closing += (sender, eventArgs) => 
      { 
       eventArgs.Cancel = true; 
       ((ADCs)sender).Hide(); 
      }; 
    } 

    private void pictureBox18_Click(object sender, EventArgs e) 
    { 
     ADCsdiag.Show(); 
    } 
} 
0

您可以通過在局部變量持有到窗體實例,並在需要時將其實例化做到這一點:

private ADCs _ADCsdiag; 

private void pictureBox18_Click(object sender, EventArgs e) 
{ 
    if (_ADCsdiag == null) { 
     _ADCsdiag = new ADCs(); 
     _ADCsdiag.Closed += (s, e) => 
     { 
      _ADCsdiag= null; 
     }; 
    } 
    ADCsdiag.Show(); 
} 
相關問題