2013-02-05 47 views
1

是否有标签控件,或者也可以是自定义的,我可以开发一个预定义的事件,这将让我上,我从选项卡控件的控件集合中删除控制执行一些逻辑,它实际上被删除之前从选项卡控制。标签控件事件

上下文:

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

我希望能够在我的标签控件来关闭标签页,并能够这个封闭标签页涉及到参考网格其对应的条目,所以我可以取消该行。

我已经通过了标签上的全部可能的事件,试图浏览并没有发现合适的。 ControlRemoved事件仅在我的标签页已关闭并且标签焦点已自动切换到下一个标签....之后触发。这导致我的控制移除逻辑失败,并进入一个无限循环,试图关闭所有可用标签,而不仅仅是此标签,并在关闭最后一个时抛出一个无效的索引异常。

+0

什么UI库您使用?的WinForms? WPF? ASP.NET?还有别的吗? – svick

回答

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; 
} 
+0

尽管我100%都同意这样做,但我100%承认自己已经多次写过这样的代码,但我觉得这段代码很难维护。对于一个简单的应用程序来说,这没什么大不了的(只是有点难以遵循 - 太多的状态!),一旦你有另一个小部件,另一个行为或对表单行为的任何其他改变,你可能会后悔。 – Eilon

0

我不确定是否有确切的事件可供您查找,但我有另一种方法来提出。

这听起来对我说了一些UI代码过于紧密地捆绑在一起。网格和标签控件不应该直接从事件处理程序中彼此对话:这就是导致无限循环的原因(事件是来回“ping-ponging”)。相反,我建议网格和选项卡控件由另一个“组件”(只是一个类或现有表单类中的一些方法)管理,并且此组件管理打开/关闭选项卡并修改行在网格中。

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

0

如果你以前被删除需要您标签的参考,有一个简单的方法来做到这一点。使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 
     } 
    }