避免在vb.net中实时更新文本框

时间:2015-09-14 11:58:22

标签: vb.net textbox real-time

我在VB.NET程序中有一个非常简单的代码,用于加载文本框中文件夹中的所有路径。代码效果很好,问题是它实时添加了行,因此在界面逐行显示时加载20k文件大约需要3分钟。

这是我的代码:

    Dim ImageryDB As String() = IO.Directory.GetFiles("c:\myimages\")

    For Each image In ImageryDB
        txtbAllimg.AppendText(image & vbCrLf)
    Next

如何强制我的程序以块的形式加载文件或每秒更新一次界面?

提前致谢

2 个答案:

答案 0 :(得分:0)

是的,你可以这样做。您需要将文件名加载到某种类型的屏幕外数据结构中,而不是将它们直接加载到控件中。然后,您可以定期更新控件以显示到目前为止加载的内容。但是,我认为你会发现缓慢来自来更新控件。一旦删除该部分,就不需要在加载过程中定期更新控件,因为它几乎是瞬时的。

您可以将所有文件名加载到一个字符串中,然后只在文本框完全加载后将其设置为该字符串,如下所示:

Dim imagePaths As String = ""
For Each image As String In Directory.GetFiles("c:\myimages\")
    imagePaths &= image & Environment.NewLine
Next
txtbAllimg.Text = imagePaths

但是,这不如使用StringBuilder

那么有效
Dim imagePaths As New StringBuilder()
For Each image As String In Directory.GetFiles("c:\myimages\")
    imagePaths.AppendLine(image)
Next
txtbAllimg.Text = imagePaths.ToString()

但是,由于GetFiles方法已经将完整的路径列表作为字符串数组返回给您,因此使用String.Join会更方便(也可能更高效)将数组中的所有项组合成单个字符串的方法:

txtbAllimg.Text = String.Join(Environment.NewLine, Directory.GetFiles("c:\myimages\"))

答案 1 :(得分:0)

我知道这不是你实际问题的答案,但是AppendText很慢。使用ListBox并向其添加项目是约。快3倍。 ListBox还具有能够轻松选择项目(至少比TextBox更容易)

的好处
For each image in ImageryDB
     Me.ListBox1.Items.add (image)
Next

然而,可能有一种更有用,更快捷的方法。使用FileInfo。

Dim dir As New IO.DirectoryInfo("C:\myImages")
Dim fileInfoArray As IO.FileInfo() = dir.GetFiles()
Dim fileInfo As IO.FileInfo

For Each fileInfo In fileInfoArray
    Me.ListBox2.Items.Add(fileInfo.Name)
Next