1

我创建带有计时器(作为提醒)的动态表单作为通知或警报表单。我在每个表格上指定了一个名字。

所以每当它更新..我想关闭或禁用该特定表单上的计时器,这样它就永远不会显示(作为警报)。

查找计时器的每个控件不起作用,我无法禁用它。

 For Each f As Form In My.Application.OpenForms


        If (f.Name = Label10.Text) Or (f.Name = "notification" & Label9.Text) Then

           Dim timer = Me.components.Components.OfType(Of IComponent)().Where(Function(p) p.[GetType]().FullName = "System.Windows.Forms.Timer").ToList()
              For Each cmd In timer
                  If Not cmd Is Nothing Then
                        Dim tmp As Timer = DirectCast(cmd, Timer)
                           tmp.Enabled = False
                           tmp.Stop()
                  End If
              Next

       End If

 Next

我将如何将(Me.Components.Components)更改为我的表单(f.Components.Components),请帮助我。

4

1 回答 1

0

为了循环遍历表单上的计时器,您需要首先获取它们。控件集合不包含任何计时器对象。计时器是由微软用非托管 C/C++ 代码编写的,只有很少的包装器来支持它们在 .NET 中的 API。

您仍然可以通过一些技巧来访问它们。我已经测试了以下代码,它确实适用于表单上的 1 个计时器。我没有尝试过超过 1 个计时器,但它应该可以工作。

Dim timer = Me.components.Components.OfType(Of IComponent)().Where(Function(p) p.[GetType]().FullName = "System.Windows.Forms.Timer").ToList()
    For Each cmd In timer
        If Not cmd Is Nothing Then
            Dim tmp As Timer = DirectCast(cmd, Timer)
            tmp.Enabled = False
            tmp.Stop()
        End If
    Next

此代码的另一个版本可能如下所示,并进行了一些 LINQ 优化:

Dim timer = Me.components.Components.OfType(Of IComponent)().Where(Function(ti) ti.GetType().FullName = "System.Windows.Forms.Timer").ToList()
    For Each tmp As Timer In (From cmd In timer Where Not cmd Is Nothing).Cast(Of Timer)()
        tmp.Enabled = False
        tmp.Stop()
    Next
于 2013-08-07T15:11:22.863 回答