【发布时间】:2013-04-19 16:43:15
【问题描述】:
我有这样的代码
someTabPage.Text = "hello";
其中someTabPage 是由Winforms 设计器创建的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
我正在查看源代码starting from this point in the call stack,但我无法想象出了什么问题。正如 Ginosaji 在 cmets 中所暗示的那样,父子关系似乎被打破了 - 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
标签页仍有其父集,但父页不包含标签页。
不幸的是,我仍然不知道它是如何进入这种状态的。
【问题讨论】:
-
显然
someTabPage实际上是someTabControl.TabPages[-1]。如果没有代码示例,我无法告诉你为什么。 -
@Ginosaji 不,
someTabPage实际上是一个实例变量,而不是更复杂的表达式。如果您查看堆栈跟踪,您会发现问题出在堆栈的更深处。 -
作为一种临时解决方法,您可以尝试在设置
Text之前从TabControl中删除TabPage。 -
当您尝试更新不再属于选项卡控件的 TabPage 时,会发生这种情况。查看从控件中删除标签页的代码,并确保其他代码没有引用已删除的标签页。
-
是的,一些非正统的东西,父级仍然设置。想到一个线程问题。
标签: winforms tabcontrol tabpage