我有这样的代码
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
标签页仍然设置了父级,但父级不包含标签页。
不幸的是,我仍然不知道它是如何进入这种状态的。
答案 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