【问题标题】:Winforms throws ArgumentOutOfRangeException when setting TabPage.TextWinforms 在设置 TabPage.Text 时抛出 ArgumentOutOfRangeException
【发布时间】: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


【解决方案1】:

我在使用 .TabPages.Add 时遇到过这个错误,终于找到了一个一致的重现和可能对您有所帮助的解决方案:

添加这个新行:

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

【讨论】:

  • 自从我提出这个问题以来,我们已经摆脱了问题代码,所以我无法测试它。但我相信它有效,在这种情况下它比我的解决方法要好得多。
  • 这对我的情况没有帮助。请参阅下面的评论以获取答案。
【解决方案2】:

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

【讨论】:

  • 投票支持这个答案,因为它 100% 描述了我的情况,并且没有直接的解决方案/解决方法。
  • 我重新审视了这个问题并找到了一个不错的解决方法。调用 Show() 然后 Hide() 包含有问题的元素的窗口。在此选项卡控件即使在隐藏窗口上也表现良好之后。
【解决方案3】:

这是我使用的解决方法:

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

【讨论】:

    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多