TabControl.ControlRemoved事件的替代方法是什么?

时间:2012-06-18 10:09:02

标签: c# winforms visual-studio-2010

我有一个TabControl,我正在侦听ControlRemoved事件,然后在TabControl.TabCount等于零时对MenuStrip项进行更改。

我发现TabCount在此Event方法完成之前不会更新,对我而言,会使该事件的名称产生误导。

关于此事件的替代方案的任何想法?

4 个答案:

答案 0 :(得分:2)

可能性是检查控件的数量是否为1.如果是,则最后一个标签页即将被删除。 (您甚至可以使用EventArgs检查哪一个:e.Control

我测试了覆盖OnControlRemoved,但它遇到了同样的问题。

答案 1 :(得分: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));
        }
    }
}

答案 2 :(得分:0)

尝试使用BeginInvoke Method异步执行事件处理程序。 E.g。

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

答案 3 :(得分:0)

如果您一次删除标签,只需检查:

TabCount - 1 == 0