Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.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中窗体加载缓慢_Vb.net - Fatal编程技术网

vb.net中窗体加载缓慢

vb.net中窗体加载缓慢,vb.net,Vb.net,我目前在vb.net上的ERP项目中工作。我想在表单加载时将产品数据加载到文本框中。我使用的是自动完成方法,但是有大约26000个数据,表单缓慢加载4分钟。有没有办法避免这种情况,或者有没有办法在应用程序启动时在后台调用此函数 这是我的自动完成文本框代码。它工作得很好,但由于数据太大,它挂起了很多 Private Sub pn() Try con = Class1.dbconn Dim dt As New DataTable Dim d

我目前在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

对于autocompletetextbox,文本框的属性应设置为true。不要在循环中填充
AutoCompleteTeCustomSource
。首先填充数组,然后通过调用
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毫秒。这样更好吗?

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

下面是最后几条建议,与问题没有直接关系,但可能有助于清理代码:

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

将datatable中的结果绑定到datagridview或combobox,而不是遍历结果并填充文本框


干杯

非常感谢您的帮助,但在执行此方法时,我遇到了一个新错误“”“无法将类型为”的对象强制转换为“System.String[]”,其中SelectEnumerableInterator'2[System.Data.Rows,System.Char[]”类型