首页 > 解决方案 > 表单在 vb.net 中加载缓慢

问题描述

我目前在 vb.net 上的 ERP 项目中工作。我想在表单加载时将产品数据加载到文本框中。我正在使用自动完成方法,但数据约为 26000,表单加载缓慢 4 分钟。有没有办法避免这种情况,或者有没有办法在应用程序启动时在后台调用这个函数?

这是我的自动完成文本框代码。它工作正常,但由于数据太大,它挂了很多。

 Private Sub pn()
     Try
        con = Class1.dbconn
        Dim dt As New DataTable
        Dim ds As New DataSet
        ds.Tables.Add(dt)
        Dim da As New SqlDataAdapter("select [Part Name] from 
                                      Part_Master_Download$", con)
        da.Fill(dt)
        Dim r As DataRow
        TextBox9.AutoCompleteCustomSource.Clear()
        For Each r In dt.Rows
            TextBox9.AutoCompleteCustomSource.Add(r.Item(0).ToString)

        Next
        con.Close()

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

对于自动完成文本框,文本框的属性应设置为 true

标签: vb.net

解决方案


不要AutoCompleteCustomSource在循环中填充。首先填充一个数组,然后通过一次调用一次性加载列表AddRange

Dim items = dt.Rows.Cast(Of DataRow)().
                    Select(Function(row) CStr(row(0)).
                    ToArray()

TextBox9.AutoCompleteCustomSource.AddRange(items)

您应该会发现这大大加快了速度。如果性能仍然存在问题,我们可以进一步观察。

编辑:为了证明我的观点,我刚刚测试了以下代码:

Public Class Form1

    Private timer As Stopwatch

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        timer = Stopwatch.StartNew()

        Dim rng As New Random

        Dim a = Convert.ToInt32("a"c)
        Dim z = Convert.ToInt32("z"c)
        Dim items = Enumerable.Range(1, 26000).Select(Function(n) Convert.ToChar(rng.Next(a, z + 1)).ToString())

        For Each item In items
            TextBox1.AutoCompleteCustomSource.Add(item)
        Next
    End Sub

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        MessageBox.Show(timer.Elapsed.ToString())
    End Sub

End Class

消息显示“00:03:08.3167858”,即加载列表只需三分钟多一点。然后我将Load事件处理程序更改为:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    timer = Stopwatch.StartNew()

    Dim rng As New Random

    Dim a = Convert.ToInt32("a"c)
    Dim z = Convert.ToInt32("z"c)
    Dim items = Enumerable.Range(1, 26000).Select(Function(n) Convert.ToChar(rng.Next(a, z + 1)).ToString())

    TextBox1.AutoCompleteCustomSource.AddRange(items.ToArray())
End Sub

所以一次调用AddRange而不是Add循环调用,消息是“00:00:00.0557427”,即不到56毫秒。那个更好吗?


推荐阅读