选项卡控件事件

时间:2013-02-05 07:06:06

标签: c# tabcontrol

是否有Tab控件的预定义事件,或者可能是我可以开发的自定义事件,这将允许我在从Tab Control的控件集合中删除的控件上执行某些逻辑,然后才能从选项卡中删除ACTUALLY控制。

背景:

我有一个带标签页的标签控件。这些选项卡页面加载与参考网格中的条目相关的文档。每次我在参考网格中选择一行时,带有相应文档的标签页都会添加到我的标签控件中。还会检查网格中该行的“检查”列。

我希望能够在我的标签控件中关闭标签页,并能够将此关闭的标签页与参考网格中的相应条目相关联,以便我可以取消选中该行。

我已经尝试浏览标签控件的所有可能事件,但没有找到合适的选项。 ControlRemoved事件仅在我的标签页关闭后触发,标签焦点自动转移到下一个标签....这导致我的controlremoved逻辑失败并进入无限循环,尝试关闭所有可用的标签而不是仅此一个,当它关闭最后一个时,抛出无效的索引异常。

3 个答案:

答案 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
        }
    }