C# 选项卡控件事件

C# 选项卡控件事件,c#,tabcontrol,C#,Tabcontrol,是否有选项卡控件的预定义事件,或者可能是我可以开发的自定义事件,允许我在从该选项卡控件的控件集合中删除的控件实际从选项卡控件中删除之前,对该控件执行一些逻辑 背景: 我有一个带有选项卡页的选项卡控件。这些选项卡页面加载与引用网格中的条目相关的文档。每次我在参考网格中选择一行时,一个加载了相应文档的选项卡页面就会添加到我的选项卡控件中。网格中该行的Check列也会被选中 我希望能够关闭选项卡控件中的选项卡页,并能够将此关闭的选项卡页与其引用网格中的相应条目关联,以便取消选中该行 我尝试浏览了所有可

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

背景:

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

我希望能够关闭选项卡控件中的选项卡页,并能够将此关闭的选项卡页与其引用网格中的相应条目关联,以便取消选中该行


我尝试浏览了所有可能的tab控件事件,但没有找到合适的。ControlRemoved事件仅在我的tabpage关闭且tab焦点自动转移到下一个tab后激发。。。。这会导致我的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
        }
    }

虽然我100%同意这一点,并且我100%承认我已经写过很多次这样的代码,但我发现这段代码很难维护。对于一个简单的应用程序来说,这没什么大不了的,只是有点难以理解——状态太多了!,一旦您有了另一个小部件、另一个行为或表单行为的任何其他更改,您可能会后悔。您使用的是什么UI库?Winforms?WPF?ASP.NET?还有别的吗?