【问题标题】:Why in Visual C# .NET in WinForm, tabPage1 will not update control content changes unless tabPage1 is selected?为什么在 WinForm 中的 Visual C# .NET 中,除非选择了 tabPage1,否则 tabPage1 不会更新控件内容更改?
【发布时间】:2015-09-07 12:07:47
【问题描述】:

所以在 Visual C# .NET 的基本 WinForm 中,我有 tabControl1 和两个页面:tabPage1 和 tabPage2。

假设我在 tabPage1 中有 label1,还有一个每 10 秒更新一次并将 label1 更改为当前时间的计时器:

private void timer1_Tick(object sender, EventArgs e)
{
    button1.PerformClick();
}
private void button1_Click(object sender, EventArgs e)
{
     label1.Text = "Last updated: " + DateTime.Now.ToString() + "(local time)";
}

现在,如果我选择了 tabPage1,label1.Text 会更新得很好,即使我已经最小化了应用程序。但是,如果选择了 tabPage2,则 label1.Text 永远不会更新,直到我选择包含 label1 的 tabPage1。

由于在我的应用程序中我有多个选项卡,需要从互联网更新内容并填充标签和列表视图,我需要它能够在不选择的情况下更新选项卡上的内容。

如果不以编程方式强制用户选择选项卡来更新内容,如果他们使用不同的选项卡会打扰用户,我将如何执行此操作?

注意:我试图避免这种笨拙的解决方案(它确实有效,但对用户来说很烦人):

private void timer1_Tick(object sender, EventArgs e)
{
    int x = tabControl1.SelectedIndex;
    if (tabControl1.SelectedIndex != 0)
    {
        tabControl1.SelectedIndex = 0;
        label1.Text = "Last updated: " + DateTime.Now.ToString() + "(local time)";
        tabControl1.SelectedIndex = x;
    }
}

编辑:我试过 tabPage1.Update();它不起作用,仍然没有更新时间,所以当我选择 tabPage1 后它应该更新了几次后,它显示的时间和以前一样。

Edit2:我遗漏了对问题至关重要的信息。在 timer1 我正在做: button1.PerformClick();但是,PerformClick();如果按钮被隐藏,将不起作用。因此,当我在 tabPage2 中时,它没有正确单击按钮,因为该按钮隐藏在 tabPage1 中。所以解决方法是把按钮代码,放到一个方法中,而不是用定时器来做方法,而不是PerformClick(),那么不管你是不是在tabPage1,都可以正常工作。

【问题讨论】:

    标签: c# winforms tabcontrol tabpage


    【解决方案1】:

    查看问题中的编辑,它不起作用的原因是因为我使用 button.PerformClick() 不是正常的方法调用。

    【讨论】:

      【解决方案2】:

      连同进行更改的代码一起,尝试调用tabPage1.Update()。也许它没有更新,因为它不可见。无论哪种方式,当用户切换到选项卡以查看其内容时,它可能会调用上面的方法并显示更新的内容。因此,如果它在后台,则实际上没有必要对其进行更新。 我无法自己测试它,因为我不再拥有 Visual Studio :(

      【讨论】:

      • 这是一种奇怪的行为。当未选择选项卡时,您可以检查计时器是否仍在运行?您可以尝试在另一个页面上添加一个测试按钮并让它更改标签文本。然后检查label.text 属性是否更改。另外,当你改回tabPage1时,标签显示的值是否正确?
      • 嗨,Matheus,我发现了我的问题,这是因为我省略了一些代码(试图简化),基本上我是从 button1.PerformClick(); 调用 label1.Text 更改;因此 PerformClick() 仅在按钮未隐藏时才有效。在 tabPage2 中,该按钮未显示,因此 performClick() 不起作用。相反,我为代码创建了一个单独的方法,然后在 Timer 中执行该方法而不是 htan performclick();在计时器中。感谢您的关注和时间,虽然朋友:)
      • 啊啊我知道button.PerformClick() 的那个问题,我很久以前就遇到了麻烦。如果我知道你在使用它,我可以告诉你。避免它是一个好习惯。如果按钮被禁用,它也不起作用。另外,不客气,很抱歉我帮不了你,但我很高兴你找到了解决方案:)
      • 另外,请用您的解决方案回答您自己的问题并将其标记为已接受的答案,以便其他人可以找到此信息:)
      • 还有一件事(对不起)。通过timer1_tick 方法,您可以调用button1_Click(sender, e);,它将具有与button.PerformClick() 完全相同的效果,只是无论按钮的可见性状态如何,它都会起作用。如果您从界面中删除按钮,它甚至会起作用。这样您就不必使用其他方法污染代码。请记住,当项目发展壮大时,如果代码组织不当,找到代码的特定部分可能会变得非常复杂,因此您必须从一开始就担心这一点:)
      猜你喜欢
      • 2018-08-05
      • 1970-01-01
      • 2011-04-03
      • 2019-01-30
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      • 2014-09-27
      相关资源
      最近更新 更多