代码之家  ›  专栏  ›  技术社区  ›  Vojtěch Mráz

从另一个窗体中的计时器刷新窗体

  •  0
  • Vojtěch Mráz  · 技术社区  · 7 年前

    我对需要扩展和改进的代码片段有问题。这不是我的原始代码,我不能改变它的逻辑那么多,只是为了清楚。

    我有一个名为MDIServer的主窗体,它每秒钟设置一个计时器。在计时器中。勾选我有一些其他代码,工作正常(计时器运行正常)。最近,我必须检查那里,如果有一个表单处于活动状态,如果是,则更改该表单中的一些内容(标签文本和标签)并刷新它。

    我在那里添加了以下代码:

    If IsActiveForm("frmName") Then
          frmName.ChangeSomething()
    End If
    

    您可以看到,Sub ChangeSomething位于我要刷新并进行更改的表单中。在该函数中,我只需更改少数控件的标签文本和标记。

    我的问题是:表单不刷新=>标签不可见更改,为什么?

    我想在调用这个函数后,我已经在ChangeSomething()函数或计时器中尝试了几乎所有的Refresh()函数。此外,我还尝试添加新的计时器(在frmName中)并在那里进行更改,这与

    Label.Text = "something new"
    Label.Refresh()
    

    所以我想问题在于计时器以不同的形式刷新表单。我还试着用我自己的InvokeReguired()函数等实现它。。。

    P、 当我调试代码时,标签和标签都在更改,必须调用的每个函数都被调用,但它在表单本身上是不可见的。

    编辑信息 formName 未在MDIServer中明确声明,在本例和许多其他情况下,表单用作默认实例。计时器来自 System.Windows.Forms.Timer 。此外,MDIServer不是 表单名称 我不能使用 Me.ActiveMdiChild Is 。就这么说吧,这两种形式在任何方面都不相互依赖。。所有操作都是通过表单的名称完成的(默认实例,所以 Dim frm As Form frm = frmName )。

    我真的很乐意得到任何小费或任何东西:D

    谢谢各位, 德国沃伊特

    1 回复  |  直到 7 年前
        1
  •  0
  •   Vojtěch Mráz    6 年前

    因此,我在进行了一些研究之后修复了我的问题,问题(预期)是我没有调用子例程 ChangeSOmething() 对于表单的一个特定实例 frmName 。因此,我必须更改代码,以便准确地为活动和可见的实例调用它。

    新代码如下所示:

    Dim frmCollection = Windows.Forms.Application.OpenForms
        Dim listfrmname = frmCollection.OfType(Of frmName).ToList()
        If listfrmName.Count > 0 Then
            Dim tmpFrm As frmName = listVZT15.Last()
            tmpFrm.ChangeSomething()
        End If
    

    我也不能同时使用 frmCollection.OfType(Of frmName).Any frmCollection.Item("frmName") ,因为当我关闭表单并再次打开时,它创建了一个又一个新实例(我不知道,为什么它不关闭旧实例,但正如我所说,它不是我的代码)。所以逻辑是,列出所需类型的所有打开形式,然后从该列表中获取最后一个实例,并为该实例调用子例程。而且 Me.Refresh() 放置在子例程中 ChangeSomething() 它本身

    感谢大家的帮助,这确实帮助我理解了这里的实例是如何工作的。