我有一个TabControl,我正在侦听ControlRemoved事件,然后在TabControl.TabCount等于零时对MenuStrip项进行更改。
我发现TabCount在此Event方法完成之前不会更新,对我而言,会使该事件的名称产生误导。
关于此事件的替代方案的任何想法?
答案 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