为什么标签页主体没有使用.NET选项卡控件进行更新?

时间:2012-06-16 00:47:30

标签: c# .net winforms tabcontrol

我在C#中使用.NET TabControl时出现了一个奇怪的问题(Visual Studio 2010)。启动Windows窗体应用程序。添加选项卡控件和按钮。在两个标签页中添加两个不同的标签,以便区分它们。按钮的目的只是作为下一个按钮;订阅其Click事件,代码为:

tabControl1.SelectTab(1);

让我们假设用户在第一个选项卡上输入了错误,所以当他们尝试转到第二个选项卡时我们要将它们发回去,所以使用代码订阅选项卡控件的SelectedIndexChanged事件:

if(tabControl1.SelectedIndex == 1)
{
    tabControl1.SelectTab(0);
}

现在运行程序并单击按钮。您会注意到,根据顶部突出显示的选项卡判断,第一个标签页是看起来被选中的标签页,正如您所期望的那样。但是,根据实际显示在选项卡控件主体中的选项卡页面判断,它仍然是显示的第二个选项卡页面!调用各种控件'Focus(),Update()和Refresh()函数似乎没有帮助。这是怎么回事?

1 个答案:

答案 0 :(得分:5)

我责备。这是事件处理程序的一般问题,你可以通过像这样猛拉地垫来混淆本机Windows控件的填充。 TreeView是另一个非常容易出现此类问题的控件。

对于像这样的问题,有一个优雅而通用的解决方案,您可以使用Control.BeginInvoke()来延迟命令。在本机控制完成事件生成并且所有副作用都已完成之后,它将执行以后。这也解决了这个问题,如下:

    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) {
        if (tabControl1.SelectedIndex == 1) {
            this.BeginInvoke(new Action(() => tabControl1.SelectTab(0)));
        }
    }