ControlRemoved イベントをリッスンしている TabControl を取得し、TabControl.TabCount がゼロになると MenuStrip 項目を変更します。
私が見つけたのは、この Event メソッドが完了するまで TabCount が更新されないことです。これにより、イベントの名前が誤解を招くようになります。
このイベントの代替案はありますか?
ControlRemoved イベントをリッスンしている TabControl を取得し、TabControl.TabCount がゼロになると MenuStrip 項目を変更します。
私が見つけたのは、この Event メソッドが完了するまで TabCount が更新されないことです。これにより、イベントの名前が誤解を招くようになります。
このイベントの代替案はありますか?
コントロールの数が 1 であるかどうかを確認することが可能です。そうであれば、最後のタブページが削除されようとしています。( EventArgs: を使用してどれを確認することもできますe.Control
)
OnControlRemoved のオーバーライドをテストしましたが、同じ問題が発生します。
一度にタブを削除する場合は、次のことを確認できます。
TabCount - 1 == 0
BeginInvokeメソッドを使用して、イベントハンドラーを非同期で実行してみてください。例えば
protected virtual void OnControlRemoved(ControlEventArgs e)
{
BeginInvoke((Action)(()=>
{
if(Controls.Count() == 0)
{
...
}
}));
}
が独自のイベントをサブスクライブすることによってTabControl
そのプロパティを更新する可能性を考慮してください。これは実際には当てはまりませんが、問題を理解するのに役立ちます (と思います)。の独自のハンドラーは、あなたのハンドラーの後に実行される場合があります。必要なのは、イベントの後に実行されるイベントです。TabCount
ControlRemoved
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));
}
}
}