2009-12-30 25 views
0

我有三種名爲frmBase(form1),frmGraph(form2)和frmBalloon(form3)的表單。每個表格都應該關閉但不是mainform

如果用戶單擊位於frmBase(form1)上的名爲btnShow的按鈕,frmGraph(form2)將打開。

如果用戶點擊位於frmGraph(form2)上的名爲btnShow的按鈕,frmBalloon(form3)將打開。

現在,如果用戶單擊位於frmGraph(form2)上的名爲btnCancel的按鈕或單擊位於frmBalloon(form3)上的名爲btnCancel的按鈕,則每個打開的表單都應關閉,除了frmBase(form1)。

因此,當用戶單擊放置在form2或form3上的按鈕時,除了mainform之外,每個表單都應該關閉。那麼有沒有解決辦法?

+1

我能看到的是你有很多形式和按鈕! – 2009-12-30 05:18:22

+0

不,只有三種形式和六個按鈕 – Harikrishna 2009-12-30 05:21:55

回答

1

這不是一個很好的解決方案,Application.OpenForms是有點靠不住,但易:

public static void CloseAllFormsButMain() { 
    for (int ix = Application.OpenForms.Count - 1; ix > 0; --ix) 
    Application.OpenForms[ix].Close(); 
} 
+0

非常感謝你..非常正常.......很好.. – Harikrishna 2009-12-30 05:42:42

+0

有沒有類似的代碼,frmBallloon在btnShow中顯示的frmBase的單擊事件,並且如果用戶點擊了,我想再次顯示frmBase frmBalloon的btnShow然後有兩個副本frmBase.I只需要一個副本。那麼我怎樣才能通過點擊按鈕來改變表單視圖。 – Harikrishna 2009-12-30 05:52:29

+0

我無法在評論框中填入答案。用這個問題開始一個新的線程。 – 2009-12-30 05:55:27

2

維護需要在指定事件上關閉的所有表單對象的引用。在需要時創建並調用frmBase中的函數。如果打開,該功能將負責關閉所有註冊表格。

看起來像是observer pattern的情況。

+0

我想關閉除mainform之外的所有表單。 – Harikrishna 2009-12-30 05:26:09

+0

因此,只註冊那些需要關閉的表單的引用。 – 2009-12-30 05:31:36

+0

如何註冊表單的引用? – Harikrishna 2009-12-30 05:34:07

1

Observer模式是適當用一些specializaiton。 EventAggregator模式是這種類型場景的觀察者模式的更專業版本。事件聚合器模式對於這種情況非常理想。

簡而言之,事件聚合器允許您集中發佈/訂閱事件。因此,所有訂閱者和發佈者只與EventAggregator交談。訂戶訂閱事件和發佈者命令事件聚合器發佈內容。

事件聚合器模式也將每個發佈者訂閱者彼此分開。這消除了子表單引用父表單的需要。

傑里米米勒在他的建立自己的駕駛室系列中提供了一個很好的例子。由於我的新會員資格,我無法發佈鏈接到網站,但只是搜索下列項目。

EventAggregator由Martin Fowler 通過傑里米米勒建立自己的CAB系列(codebetter.com) EventAggregator在PRISM

下面是一個簡單的例子,我做了使用C#和泛型。這絕不是完整的。這只是爲了舉例說明一個簡單的例子。爲了更完整的模式轉向傑里米米勒斯的例子。使用系統

[代碼]

//示例自定義事件參數 ;

命名空間EventAggregatorPatternDemo { 公共類CloseAllFormsEventArgs:EventArgs的 {} } 使用系統

//表格樣本代碼 ; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;使用System.Linq的 ; using System.Text;使用System.Windows.Forms的 ;

命名空間EventAggregatorPatternDemo { 公共部分類GraphForm:形式,IListener { 公共GraphForm() { 的InitializeComponent(); }

private void GraphForm_Load(object sender, EventArgs e) 
    { 
     EventAggregator.GetTheEventAggregator().Subscribe<CloseAllFormsEventArgs>(this); 
    } 

    public void Handle<TEventArgs>(TEventArgs e) 
    { 
     if (e.GetType() == typeof(CloseAllFormsEventArgs)) 
     { 
      this.Close(); 
     } 
    } 

    private void btnCloseAll_Click(object sender, EventArgs e) 
    { 
     EventAggregator.GetTheEventAggregator().Publish(this, new CloseAllFormsEventArgs()); 
    } 

    private void GraphForm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     EventAggregator.GetTheEventAggregator().CancelSubscription<CloseAllFormsEventArgs>(this); 
    } 
} 

}

//事件聚合代碼 使用系統; using System.Collections.Generic;

命名空間EventAggregatorPatternDemo { 公共接口IListener { 空隙句柄(TEventArgs E); }

public class EventAggregator 
{ 
    static EventAggregator _TheEventAggregator; 

    readonly Dictionary<Type, List<IListener>> _listeners; 

    private EventAggregator() 
    { 
     _listeners = new Dictionary<Type, List<IListener>>(); 
    } 

    public static EventAggregator GetTheEventAggregator() 
    { 
     if(_TheEventAggregator == null) 
     { 
      _TheEventAggregator = new EventAggregator(); 
     } 

     return _TheEventAggregator; 
    } 

    public void Publish<TEventArgs>(object sender, TEventArgs e) 
    { 
     if(_listeners.ContainsKey(e.GetType())) 
     { 
      var listOfSubscribers = _listeners[e.GetType()]; 

      for(int i = listOfSubscribers.Count - 1; i > -1; i--) 
      { 
       listOfSubscribers[i].Handle(e); 
      } 
     } 
    } 

    public void Subscribe<TEventArgs>(IListener listener) 
    { 
     if(_listeners.ContainsKey(typeof(TEventArgs))) 
     { 
      _listeners[typeof(TEventArgs)].Add(listener); 
     } 
     else 
     { 
      List<IListener> newListenerList = new List<IListener>(); 
      newListenerList.Add(listener); 

      _listeners.Add(typeof(TEventArgs), newListenerList); 
     } 
    } 

    //Cancels all subscriptions 
    public void CancelSubscription<TEventArgs>(IListener listener) 
    { 
     Type eventArgsType = typeof(TEventArgs); 

     if (_listeners.ContainsKey(eventArgsType)) 
     { 
      //Remove from the end 
      for (int i = _listeners[eventArgsType].Count-1; i > -1; i--) 
      { 
       //If the objects are the same 
       if(ReferenceEquals(_listeners[eventArgsType][i], listener)) 
       { 
        _listeners[eventArgsType].RemoveAt(i); 
       } 
      } 
     } 
    } 
} 

} [/代碼]

0

你有沒有想過使用一個靜態的事件? Here就是一個簡單的例子。

相關問題