我有一個TabControl,我正在偵聽ControlRemoved事件,然後在TabControl.TabCount等於零時對MenuStrip項目進行更改。什麼是TabControl.ControlRemoved事件的替代方法?
我發現TabCount並沒有更新,直到這個事件方法已經完成,對我來說,這個事件的名稱會讓人誤解。
關於此事件的替代方案的任何想法?
我有一個TabControl,我正在偵聽ControlRemoved事件,然後在TabControl.TabCount等於零時對MenuStrip項目進行更改。什麼是TabControl.ControlRemoved事件的替代方法?
我發現TabCount並沒有更新,直到這個事件方法已經完成,對我來說,這個事件的名稱會讓人誤解。
關於此事件的替代方案的任何想法?
如果你一次刪除一個標籤,你可以簡單地檢查:
TabCount - 1 == 0
可能性是檢查控件的數量是否爲1.如果是這樣,最後一個tabpage即將被刪除。 (你甚至可以使用EventArgs檢查哪一個:e.Control
)
我測試覆蓋OnControlRemoved但它遭受同樣的問題。
考慮通過訂閱其自己的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));
}
}
}
嘗試使用BeginInvoke Method異步執行的事件處理程序。例如。
protected virtual void OnControlRemoved(ControlEventArgs e)
{
BeginInvoke((Action)(()=>
{
if(Controls.Count() == 0)
{
...
}
}));
}
你是對的,它應該主要工作,但它意味着代碼將運行得比預期的要晚,而不是比預期的要早,所以在其他代碼中可能會出現同樣的問題,這些代碼需要在選項卡之後執行* that *事件已被刪除。有時候這不會是一個問題,有時候它會。當它不會,你的答案是一個好主意。 – hvd
有沒有什麼誤導:當控制被刪除了'ControlRemoved'事件被觸發,而不是當「TabCount」屬性更新爲匹配。 (不要誤解我的意思,我明白爲什麼這是你的問題。) – hvd
至於修復,它取決於,是否有可能從'TabControl'創建一個派生類,或者你堅持使用「TabControl」控件? – hvd
如果你一次刪除一個標籤,你不能只檢查TabCount - 1 == 0. –