我有一个 TabControl,我正在侦听 ControlRemoved 事件,然后在 TabControl.TabCount 等于零时对 MenuStrip 项进行更改。
我发现 TabCount 在此 Event 方法完成之前不会更新,对我来说,这使事件的名称具有误导性。
关于这个活动的替代方案有什么想法吗?
我有一个 TabControl,我正在侦听 ControlRemoved 事件,然后在 TabControl.TabCount 等于零时对 MenuStrip 项进行更改。
我发现 TabCount 在此 Event 方法完成之前不会更新,对我来说,这使事件的名称具有误导性。
关于这个活动的替代方案有什么想法吗?
一种可能性是检查控件的数量是否为 1。如果是,则最后一个标签页即将被删除。(您甚至可以使用 EventArgs 检查哪一个e.Control
:)
我测试了覆盖 OnControlRemoved 但它遇到了同样的问题。
考虑通过订阅自己的事件来TabControl
更新其属性的可能性。事实并非如此,但它有助于(我认为)理解问题。自己的处理程序可能会在您的处理程序之后运行。您需要的是在事件之后运行的事件。TabCount
ControlRemoved
TabControl
ControlRemoved
ControlRemoved
什么TabControl
是创建标准ControlCollection
类的派生类,即TabControl.ControlCollection。您可以做的是从that派生,并覆盖Add
and/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));
}
}
}
尝试使用BeginInvoke 方法异步执行事件处理程序。例如
protected virtual void OnControlRemoved(ControlEventArgs e)
{
BeginInvoke((Action)(()=>
{
if(Controls.Count() == 0)
{
...
}
}));
}
如果您一次删除一个标签,您可以简单地检查:
TabCount - 1 == 0