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