表单在vb.net中加载缓慢

时间:2018-07-11 08:51:20

标签: 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

2 个答案:

答案 0 :(得分:2)

不要循环填充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毫秒。更好吗?

答案 1 :(得分:0)

您可以使用分页来控制返回的数据量。请查看此link,以获取详细示例。 另一种方法是使用(任务异步并等待),这样就不会锁定UI。

以下是与该问题没有直接关系的一些最后建议,但可能会帮助清除代码:

您可以跳过数据集并直接使用数据表,您只需要一个表就不需要它。

将数据表中的结果绑定到datagridview或组合框,而不是遍历结果并填充文本框。

欢呼

相关问题