0

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

我发现 TabCount 在此 Event 方法完成之前不会更新,对我来说,这使事件的名称具有误导性。

关于这个活动的替代方案有什么想法吗?

4

4 回答 4

2

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

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

于 2012-06-18T10:27:50.003 回答
0

考虑通过订阅自己的事件来TabControl更新其属性的可能性。事实并非如此,但它有助于(我认为)理解问题。自己的处理程序可能会在您的处理程序之后运行。您需要的是在事件之后运行的事件。TabCountControlRemovedTabControlControlRemovedControlRemoved

什么TabControl是创建标准ControlCollection类的派生类,即TabControl.ControlCollection。您可以做的是从that派生,并覆盖Addand/orRemove方法。调用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 回答
0

尝试使用BeginInvoke 方法异步执行事件处理程序。例如

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

如果您一次删除一个标签,您可以简单地检查:

TabCount - 1 == 0
于 2012-07-02T06:28:56.813 回答