vb.net中窗体加载缓慢
我目前在vb.net上的ERP项目中工作。我想在表单加载时将产品数据加载到文本框中。我使用的是自动完成方法,但是有大约26000个数据,表单缓慢加载4分钟。有没有办法避免这种情况,或者有没有办法在应用程序启动时在后台调用此函数 这是我的自动完成文本框代码。它工作得很好,但由于数据太大,它挂起了很多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
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[]”类型