【问题标题】:Tab Control Events选项卡控件事件
【发布时间】:2013-02-05 16:45:46
【问题描述】:

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

上下文:

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

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

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

【问题讨论】:

  • 您使用的是什么 UI 库?窗体? WPF? ASP.NET?还有什么?

标签: c# tabcontrol


【解决方案1】:

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

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

【讨论】:

  • 虽然我 100% 同意这会起作用,并且我 100% 承认我已经多次编写过完全一样的代码,但我发现这段代码很难维护。对于一个简单的应用程序来说,这没什么大不了的(只是有点难以理解——太多的状态!),一旦你有另一个小部件、另一个行为或对表单行为的任何其他更改,你可能会后悔。
【解决方案2】:

我不确定您是否正在寻找确切的活动,但我有另一种方法可以提议。

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

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

例如,当用户选择网格中的一行时,根本不要直接修改网格:而是调用一个新方法来执行选择行时需要发生的任何事情:选中一个复选框,打开一个标签等.

【讨论】:

    【解决方案3】:

    如果您需要在标签被删除之前对其进行引用,有一种简单的方法可以做到这一点。制作继承自 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
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多