0

ControlRemoved イベントをリッスンしている TabControl を取得し、TabControl.TabCount がゼロになると MenuStrip 項目を変更します。

私が見つけたのは、この Event メソッドが完了するまで TabCount が更新されないことです。これにより、イベントの名前が誤解を招くようになります。

このイベントの代替案はありますか?

4

4 に答える 4

2

コントロールの数が 1 であるかどうかを確認することが可能です。そうであれば、最後のタブページが削除されようとしています。( EventArgs: を使用してどれを確認することもできますe.Control)

OnControlRemoved のオーバーライドをテストしましたが、同じ問題が発生します。

于 2012-06-18T10:27:50.003 に答える
0

一度にタブを削除する場合は、次のことを確認できます。

TabCount - 1 == 0
于 2012-07-02T06:28:56.813 に答える
0

BeginInvokeメソッドを使用して、イベントハンドラーを非同期で実行してみてください。例えば

protected virtual void OnControlRemoved(ControlEventArgs e)
{
    BeginInvoke((Action)(()=>
        {
           if(Controls.Count() == 0)
           {
              ...
           }
        }));
    }
于 2012-06-18T12:32:58.087 に答える
0

が独自のイベントをサブスクライブすることによってTabControlそのプロパティを更新する可能性を考慮してください。これは実際には当てはまりませんが、問題を理解するのに役立ちます (と思います)。の独自のハンドラーは、あなたのハンドラーの後に実行される場合があります。必要なのは、イベントのに実行されるイベントです。TabCountControlRemovedTabControlControlRemovedControlRemoved

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));
        }
    }
}
于 2012-06-18T10:40:10.897 に答える