选项卡控制事件

本文关键字:事件 控制 选项 | 更新日期: 2023-09-27 17:57:56

是否有一个预定义的Tab控件事件,或者我可以开发的自定义事件,允许我在从该Tab控件的控件集合中删除控件之前,对该控件执行一些逻辑。

上下文:

我有一个带有选项卡页的选项卡控件。这些选项卡页加载与引用网格中的条目相关的文档。每次我在引用网格中选择一行时,一个加载了相应文档的选项卡页面就会添加到我的选项卡控件中。网格中该行的"检查"列也会被检查。

我希望能够关闭我的选项卡控件中的选项卡页面,并能够将这个关闭的选项卡页面与其引用网格中的相应条目关联起来,这样我就可以取消选中该行。

我试着浏览了选项卡控制的所有可能的事件,但没有找到合适的。ControlRemoved事件仅在我的选项卡页关闭且选项卡焦点自动转移到下一个选项卡后才会触发……这导致我的ControlRemoved逻辑失败并进入无限循环,试图关闭所有可用的选项卡而不是仅关闭此选项卡,并在关闭最后一个选项卡时抛出无效索引异常。

选项卡控制事件

您需要确保当您以编程方式取消选中网格中的项目时,不会更新选项卡控件。否则,你总是会遇到一个无限循环,导致不必要的行为。

您可以通过使用布尔标志来实现这一点。在下面的代码示例中,我没有使用"真正的"事件处理程序,因为我手头没有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;
}

我不确定是否有确切的事件适合您,但我有一个替代方法可以提出。

在我看来,有些UI代码过于紧密地联系在一起。网格和选项卡控件不应该直接从事件处理程序中相互对话:这就是导致无限循环的原因(事件是来回的"乒乓球")。

相反,我建议网格和选项卡控件都由另一个"组件"(只是一个类,或现有表单类中的几个方法)管理,并且该组件管理打开/关闭选项卡和修改网格中的行。

例如,当用户在网格中选择一行时,根本不要直接修改网格:相反,调用一个新方法,该方法可以在选择行时执行任何需要执行的操作:选中复选框、打开选项卡等。当不再需要选择行时,不要直接更改任何选择:相反,调用一个新方法,在未选中行时执行任何需要执行的操作:取消选中复选框、关闭选项卡等。

如果在删除选项卡之前需要对其进行引用,有一种简单的方法可以做到。使CustomTabControl继承自TabControl并覆盖其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
        }
    }