设置TabPage.Text时,Winforms会抛出ArgumentOutOfRangeException

时间:2013-04-19 16:43:16

标签: winforms tabcontrol tabpage

我有这样的代码

someTabPage.Text = "hello";

其中someTabPage是由Winforms设计者创建的System.Windows.Forms.TabPage的非null实例。

偶尔(没有人可以重现这个)抛出这个异常

[System.ArgumentOutOfRangeException] InvalidArgument=Value of '-1' is not valid for 'index'.
Parameter name: index
  at System.Windows.Forms.TabControl.SetTabPage(Int32 index, TabPage tabPage, TCITEM_T tcitem)
  at System.Windows.Forms.TabControl.UpdateTab(TabPage tabPage)
  at System.Windows.Forms.TabPage.UpdateParent()
  at System.Windows.Forms.TabPage.set_Text(String value)
  at my code which calls the setter

我正在查看来源starting from this point in the call stack,但我无法想象出现了什么问题。正如Ginosaji在评论中所暗示的那样,似乎父子关系被破坏了--TabPage指向其父TabControl,但父母没有将孩子放在其集合中。我认为“竞争条件”,但只有UI线程应该能够触及Winforms控件。

值得注意的是,这个TabControl嵌套在另一个TabControl中,但这并没有给我任何想法。

有谁知道为什么会发生这种情况?

进度

我在调试器中发现它并确认父子关系确实已经破坏。

? tabPageProblem.Parent
{System.Windows.Forms.TabControl, TabPages.Count: 2, TabPages[0]: TabPage: {Unit Data}}
    System.Windows.Forms.TabControl: {System.Windows.Forms.TabControl, TabPages.Count: 2, TabPages[0]: TabPage: {Unit Data}}
? tabPageProblem.Parent.Name
"tabControlParent"
? tabControlParent.TabPages.Contains(tabPageProblem)
False

标签页仍然设置了父级,但父级不包含标签页。

不幸的是,我仍然不知道它是如何进入这种状态的。

3 个答案:

答案 0 :(得分:1)

您提到问题发生在子TabControl中...当设置Text时,包含此子TabControl的tabpage是否处于非活动状态? (意思是父TabControl的不同标签页位于前台。)我相信,当孩子TabControl不可见时(位于"背景"标签页中),它会出现意外行为的倾向。

答案 1 :(得分:1)

我用.TabPages.Add遇到了这个错误,最后找到了一个一致的repro和一个可以帮到你的解决方案:

添加以下新行:

    someTabPage.PerformLayout();
    someTabPage.Text = "hello";

答案 2 :(得分:0)

以下是我使用的解决方法:

If tabControl.TabPages.Contains(tabPage) Then
    tabPage.Text = "the text"
ElseIf tabPage.Parent IsNot Nothing Then
    logger.Warn("there is still a problem with this tab page, parent is {0}", tabPage.Parent)
End If