2012-06-18 13 views
0

我有一個TabControl,我正在偵聽ControlRemoved事件,然後在TabControl.TabCount等於零時對MenuStrip項目進行更改。什麼是TabControl.ControlRemoved事件的替代方法?

我發現TabCount並沒有更新,直到這個事件方法已經完成,對我來說,這個事件的名稱會讓人誤解。

關於此事件的替代方案的任何想法?

+0

有沒有什麼誤導:當控制被刪除了'ControlRemoved'事件被觸發,而不是當「TabCount」屬性更新爲匹配。 (不要誤解我的意思,我明白爲什麼這是你的問題。) – hvd

+0

至於修復,它取決於,是否有可能從'TabControl'創建一個派生類,或者你堅持使用「TabControl」控件? – hvd

+0

如果你一次刪除一個標籤,你不能只檢查TabCount - 1 == 0. –

回答

0

如果你一次刪除一個標籤,你可以簡單地檢查:

TabCount - 1 == 0 
2

可能性是檢查控件的數量是否爲1.如果是這樣,最後一個tabpage即將被刪除。 (你甚至可以使用EventArgs檢查哪一個:e.Control

我測試覆蓋OnControlRemoved但它遭受同樣的問題。

0

考慮通過訂閱其自己的ControlRemoved事件來更新其屬性的可能性TabControl。事實並非如此,但它有助於(我認爲)理解問題。 TabControl自己的ControlRemoved處理程序可能會在你的後面運行。您需要的是ControlRemoved事件後運行的事件。

TabControl所做的是創建標準ControlCollection類的派生類,即TabControl.ControlCollection。你可以做的是從得到,並覆蓋Add和/或Remove方法。致電base.Add(control)/base.Remove(control),然後引發自定義事件。使用該自定義事件而不是ControlAdded/ControlRemoved

編輯:現在未經考驗的,會在我可以測試,但它應該是這樣的

[ToolboxItem(true)] 
public class MyTabControl : TabControl 
{ 
    public event ControlEventHandler TabAdded; 

    public event ControlEventHandler TabRemoved; 

    protected override Control.ControlCollection CreateControlsInstance() 
    { 
     return new ControlCollection(this); 
    } 

    protected virtual void OnTabAdded(ControlEventArgs e) 
    { 
     var @event = TabAdded; 
     if (@event != null) 
      @event.Invoke(this, e); 
    } 

    protected virtual void OnTabRemoved(ControlEventArgs e) 
    { 
     var @event = TabRemoved; 
     if (@event != null) 
      @event.Invoke(this, e); 
    } 

    public new class ControlCollection : TabControl.ControlCollection 
    { 
     public ControlCollection(MyTabControl owner) 
      : base(owner) 
     { } 

     public override void Add(Control value) 
     { 
      base.Add(value); 
      ((MyTabControl)Owner).OnTabAdded(new ControlEventArgs(value)); 
     } 

     public override void Remove(Control value) 
     { 
      base.Remove(value); 
      ((MyTabControl)Owner).OnTabRemoved(new ControlEventArgs(value)); 
     } 
    } 
} 
+0

這聽起來像是會起作用,不幸的是它超出了我的頭。也許是一個瘦身的例子? – Josh

+0

@Josh當然可以。 – hvd

0

嘗試使用BeginInvoke Method異步執行的事件處理程序。例如。

protected virtual void OnControlRemoved(ControlEventArgs e) 
{ 
    BeginInvoke((Action)(()=> 
     { 
      if(Controls.Count() == 0) 
      { 
       ... 
      } 
     })); 
    } 
+0

你是對的,它應該主要工作,但它意味着代碼將運行得比預期的要晚,而不是比預期的要早,所以在其他代碼中可能會出現同樣的問題,這些代碼需要在選項卡之後執行* that *事件已被刪除。有時候這不會是一個問題,有時候它會。當它不會,你的答案是一個好主意。 – hvd

相關問題