是否有Tab控件的预定义事件,或者可能是我可以开发的自定义事件,这将允许我在从Tab Control的控件集合中删除的控件上执行某些逻辑,然后才能从选项卡中删除ACTUALLY控制。
背景:
我有一个带标签页的标签控件。这些选项卡页面加载与参考网格中的条目相关的文档。每次我在参考网格中选择一行时,带有相应文档的标签页都会添加到我的标签控件中。还会检查网格中该行的“检查”列。
我希望能够在我的标签控件中关闭标签页,并能够将此关闭的标签页与参考网格中的相应条目相关联,以便我可以取消选中该行。
我已经尝试浏览标签控件的所有可能事件,但没有找到合适的选项。 ControlRemoved事件仅在我的标签页关闭后触发,标签焦点自动转移到下一个标签....这导致我的controlremoved逻辑失败并进入无限循环,尝试关闭所有可用的标签而不是仅此一个,当它关闭最后一个时,抛出无效的索引异常。
答案 0 :(得分:0)
您需要确保在以编程方式取消选中网格中的项目时,不要更新选项卡控件。否则,您将始终遇到无限循环,导致不必要的行为。
您可以使用布尔标志来实现此目的。在下面的代码示例中,我没有使用“真正的”事件处理程序,因为我现在没有IDE来测试它,而是用简单的方法替换它们,所以得到这个想法:
private bool suppressTabUpdate = false;
private void HandleGridCheckedOrUncheckedEvent()
{
if (suppressTabUpdate)
return;
// Insert logic here to create or remove the tab pages as required
}
private void HandleTabPageRemovedEvent()
{
suppressTabUpdate = true;
// Uncheck the item in the grid here
suppressTabUpdate = false;
}
答案 1 :(得分:0)
我不确定您是否正在寻找一个确切的事件,但我有另一种建议方法。
听起来我觉得有些UI代码太紧密了。网格和制表符控件不应直接从事件处理程序中相互通信:这就是导致无限循环的原因(事件是来回“ping-ponging”)。
相反,我建议网格和制表符控件都由另一个“组件”(只是一个类,或现有表单类中的一些方法)管理,并且该组件管理打开/关闭选项卡并修改网格。
例如,当用户在网格中选择一行时,不要直接修改网格:而是调用一个新方法来执行选择行时需要执行的任何操作:选中一个复选框,打开一个当不再需要选择行时,不要直接更改任何选择:相反,调用一个新方法来执行未选择行时需要执行的任何操作:取消选中复选框,关闭选项卡等
答案 2 :(得分:0)
如果你需要在删除标签之前引用它,有一种简单的方法可以做到这一点。创建继承自TabControl的CustomTabControl并覆盖其OnControlRemoved事件。
如果你有这个:
public class CTabControl:TabControl
{
protected override void OnControlRemoved(ControlEventArgs e)
{
TabPage tp = e.Control as TabPage; // reference to tab page before it gets removed
base.OnControlRemoved(e);// gets removed here
}
}