0

我有这样的代码

someTabPage.Text = "hello";

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

偶尔(没有人能重现这个)这个异常被抛出

[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

我正在从调用堆栈中的这一点开始查看源代码,但我无法想象出了什么问题。正如 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

标签页仍然有其父集,但父不包含标签页。

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

4

3 回答 3

1

您提到问题发生在子 TabControl 中...设置 Text 时,包含此子 TabControl 的标签页是否处于非活动状态?(意味着父 TabControl 的不同标签页位于前台。)我相信,虽然子 TabControl 不可见(在“背景”标签页中),但它往往会出现意外行为。

于 2013-04-21T14:11:00.933 回答
1

我一直在使用 .TabPages.Add 遇到此错误,最后找到了一致的重现和可能对您有所帮助的解决方案:

添加这个新行:

    someTabPage.PerformLayout();
    someTabPage.Text = "hello";
于 2014-09-03T18:18:44.187 回答
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
于 2013-05-13T20:15:59.877 回答