1

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

语境 :

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

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

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

4

3 回答 3

0

If you need a reference to your tab BEFORE it gets removed, there is one simple way to do it. Make CustomTabControl that inherits from TabControl and override its OnControlRemoved event.

If you have this:

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
        }
    }
于 2013-02-05T07:57:40.707 回答
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;
}
于 2013-02-05T07:41:05.410 回答
0

我不确定您是否正在寻找一个确切的事件,但我有另一种方法可以提出。

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

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

例如,当用户选择网格中的一行时,根本不要直接修改网格:而是调用一个新方法来执行选择行时需要发生的任何事情:选中复选框、打开选项卡等. 当不再需要选择一行时,不要直接更改任何选择:相反,调用一个新方法来执行未选择行时需要发生的任何事情:取消选中复选框,关闭选项卡等。

于 2013-02-05T07:41:19.890 回答