我将如何以vb.net的形式停止所有计时器

时间:2013-08-06 01:13:27

标签: timer foreach vb.net-2010

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

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

为每个控件找到定时器不起作用,我无法禁用它。

 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,这是我的表格(f.Components.Components)请帮帮我。

1 个答案:

答案 0 :(得分:0)

为了遍历表单上的计时器,您需要首先获取它们。控件集合不包含任何计时器对象。定时器是由microsoft用非托管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