我目前正在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
答案 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或组合框,而不是遍历结果并填充文本框。
欢呼