【问题标题】:TabControl.SelectedIndex being changed, but SelectedIndexChanged even not firingTabControl.SelectedIndex 正在更改,但 SelectedIndexChanged 甚至没有触发
【发布时间】:2010-12-20 20:56:46
【问题描述】:

全部,

我的应用程序中有一个 TabControl,它开始出现异常行为。一些背景...

该程序从 VB6 转换为 VB .NET 2008,并用于使用其类名来引用表单。换句话说,我可能有一个名为 frmFoo 的表单类。在程序的代码中您可能会看到:

frmFoo.Show()

frmFoo.UserDefinedProperty = True

在最近的一些更改中,我创建了变量来表示我的表单实例,如下所示:

Public MyForm as frmFoo

MyForm = New frmFoo
MyForm.Show()

在此过程中,我还从表单的 Load 事件处理程序中删除了代码,并将其放入表单的构造函数中。

当表单加载时,或者当一个文档被加载并且应该影响 TabControl 的选定索引时,类似以下的内容不一定会触发 SelectedIndexChanged 事件。

MyForm.tbsForm.SelectedIndex = ValueReadFromFile

...或...

MyForm.tbsForm.Tabs(ValueReadFromFile).Select

很抱歉这么罗嗦,但还有更多。如果我打开表单并查看 TabControl 以验证它是否已正确设置,那么一切都会像预期的那样工作。行为不端的 TabControl 包含在另一个 TabControl 中,因此我必须单击父 TabControl 才能看到它。如果我能看到它并运行测试,那么测试总是有效的。如果我看不到它并运行测试,我运行的第一个测试将不会触发事件。 ...寻呼海森堡博士...

这几乎就像必须首先通过更改值或使其在屏幕上可见来初始化控件......我完全迷失了这个。这是我见过的最不寻常的行为。在我开始使用变量表示表单并将 Load 事件代码放入表单构造函数之前,一切都运行良好。

谁能帮助我,或者至少让我摆脱痛苦? 嘘

----------------------------------- --------------- 编辑#2
在尝试消除行为中的一些可变性之后,我刚刚进行了测试。但我想确认之前所说的行为。

我打开了程序并读取了一个文件。该文件包含一个应该触发事件处理程序的值。在不使控件可见的情况下,我可以在不触发事件的情况下更改选项卡控件的 SelectedIndex 属性。

我再次关闭该程序,然后重新打开它。这一次,选择了允许子选项卡(我关心的事件)变得可见的父选项卡。然后我在父控件中选择了一个不同的选项卡,这意味着子控件不再可见。当我打开与以前相同的文件时,它触发了该事件。

我很想实现一个标志来确认控件已被重新绘制或父选项卡是否已显示。如果未设置标志,我可能必须在代码中触发事件。

我想重申,当程序通过类名引用表单并且表单上的大部分控件排列是在加载事件中完成时,一切正常。现在程序创建变量,控件的排列在表单的构造函数中完成。我确定这与我遇到的问题有关,但我不明白如何。有什么智慧可以分享吗?

【问题讨论】:

    标签: vb.net tabcontrol selectedindexchanged


    【解决方案1】:
    MyForm.tbsForm.SelectedIndexChanged = ValueReadFromFile
    

    没有多大意义。你是否试图为 SelectedIndexChanged 事件分配一个处理程序?还是 ValueReadFromFile 是选项卡的名称?

    您的意思是您有两个选项卡控件,例如 A 和 B。选项卡控件 B 包含在 A 的选项卡中,除非 A 选择了包含选项卡控件 B 的选项卡页,否则 SelectedIndexChanged如果您以编程方式更改其选项卡,B 的事件将不会触发?

    您尝试以哪些不同的方式在子选项卡控件中选择一个选项卡,以及何时执行此代码?

    【讨论】:

    • ValueReadFromFile 是来自文件的值,在本例中为 0 或 1,您是对的,它应该是“...tbsForm.SelectedIndex = ValueReadFromFile”,我的错。
    • 是的,B 的 SelectedIndexChanged 事件似乎无法正常触发。如果我显示包含选项卡 B 的 A 的选项卡,它每次都会触发。如果我​​不首先显示它,它只会触发第 2 次到第 n 次。我对此感到困惑。
    • 我尝试使用“tbsForm.SelectedIndex = SomeValue”和“tbsForm.TabPages(SomeValue).Select”都无济于事。这些语句在包含它们的表单的构造函数中执行。我在显示初始屏幕时执行构造函数,因为我在表单上有一个很大的控件,需要很长时间才能加载。当我将这些语句作为表单的 Load 事件的一部分执行时,一切正常,但在大控件完全加载之前,表单只会显示一半并且没有响应。
    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 2023-01-17
    • 2014-05-01
    • 2017-02-16
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多