Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 数学。用progressbar循环_Vb.net_Math_Rounding - Fatal编程技术网

Vb.net 数学。用progressbar循环

Vb.net 数学。用progressbar循环,vb.net,math,rounding,Vb.net,Math,Rounding,我使用此代码列出目录中的文件: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click rslts = New List(Of String) foo(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData))

我使用此代码列出目录中的文件:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        rslts = New List(Of String)
        foo(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData))
        ListBox1.Items.Clear()
        ListBox1.Items.AddRange(rslts.ToArray)
    End Sub

    Dim rslts As List(Of String)

    Private Sub foo(ByVal aDir As String)
        Try

            Dim di As New IO.DirectoryInfo(aDir)
            Dim aryFiles() As IO.FileInfo = di.GetFiles("*.*")
            Dim aryDirs() As IO.DirectoryInfo = di.GetDirectories()

            For Each fi As IO.FileInfo In aryFiles
                rslts.Add(fi.FullName)
            Next

            For Each d As IO.DirectoryInfo In aryDirs
                foo(d.FullName)
            Next

        Catch ex As Exception

        End Try

    End Sub
我不想使用
Math.Round()
,这样我可以在加载文件时向progressbar添加增量。我知道我需要使用计时器,但我不熟悉
Math.Round()


因此,基本上,在将文件加载到listbox时,我不需要真正的progressbar。

您不需要执行增量计算,
progressbar
会处理所有事情。如何将它(
ProgressBar1
)与您的代码一起使用:

Private Sub foo(ByVal aDir As String)

    Try
        Dim di As New IO.DirectoryInfo(aDir)
        Dim aryFiles() As IO.FileInfo = di.GetFiles("*.*")
        Dim aryDirs() As IO.DirectoryInfo = di.GetDirectories()

        With ProgressBar1
            .Minimum = 0
            .Maximum = aryFiles.Count + aryDirs.Count
            .Value = 0
            .Step = 1
        End With

        For Each fi As IO.FileInfo In aryFiles
            rslts.Add(fi.FullName)
            ProgressBar1.PerformStep()
        Next

        For Each d As IO.DirectoryInfo In aryDirs
            foo(d.FullName)
            ProgressBar1.PerformStep()
        Next

    Catch ex As Exception

    End Try

End Sub

我应该在timer sub或foo sub中使用它吗?如果我在foo sub中使用它,它只会填充进度栏。@Jedi你打算如何使用计时器?在循环中?计时器仅在循环结束后调用,因此每个循环仅调用一次。我的代码应该包含在您的代码中(在
foo
)。@Jedi-您可能需要在调用PerformStep后调用ProgressBar1.Update(),以使进度条反映其新值。@ChrisDunaway如果您测试此代码,您会发现它工作正常。如果您查看MSDN示例代码(),您还将看到没有对该调用的引用。一般来说,我只在确认给定控件确实需要它们(ProgressBar不是这样)或在GUI上执行许多可能建议处于最安全状态的“变体”时才使用这种方法(.Update(),.Refresh())。但是,总的来说,我打算避免这种情况,并且从不推荐不需要的东西。@varocarbas-不可否认,我没有按照介绍的方式测试代码。根据绝地的第一条评论,在For循环结束之前,用户界面似乎没有得到更新,所以我建议进行刷新调用。正如您所知,当代码在紧密循环中运行时,UI通常不会得到更新,因为消息队列没有得到处理。对于PerformStep方法,该方法在内部使用PBM_SETPOS值调用SendMessage,这会导致进度条立即自我更新。