以下代码中的数据表填充了7500多条记录。这一切都从服务器快速加载。问题是循环数据行需要一段时间才能将它们添加到组合框中。是否有其他方法可以设置组合框的数据源或加快此过程的速度?
Dim dtColours As New DataTable
Dim daColours As New SqlDataAdapter
Dim i As Integer
ConnectToSQL()
daColours = New SqlDataAdapter("SELECT DISTINCT Rtrim(UPPER(Colour)) As Colour FROM invStockColour WHERE InUse = 1 ORDER BY Colour", dbSQL)
daColours.Fill(dtColours)
For i = 0 To dtColours.Rows.Count - 1
cboColours.Items.Add(dtColours.Rows(i).Item(0).ToString)
Next
dbSQL.Close()
答案 0 :(得分:7)
禁食方式是使用AddRange
方法而不是使用Add
,例如:
Dim items = dtColours.AsEnumerable().Select(Function(d) DirectCast(d(0).ToString(), Object)).ToArray()
cboColours.Items.AddRange(items)
我做了一个简单的检查,使用AddRange
比使用Add
快3倍。
当然,分配一个数组并用For
循环填充它可能比使用Linq快几毫秒。
答案 1 :(得分:3)
您还可以将ComboBox DataSource属性绑定到DataTable。这具有绑定其他列数据的附加优势(例如您可能不希望用户看到的键值)。
您应该能够从SQLAdapter返回一个DataTable对象。
cboColours.DataSource = dtColours
cboColours.DisplayMember = dtColours.Columns("Colour").ToString
cboColours.ValueMember = dtColours.Columns("Colour_id").ToString
答案 2 :(得分:2)
Dim daColours As New SqlDataAdapter("SELECT DISTINCT Rtrim(UPPER(Colour)) As Colour FROM invStockColour WHERE InUse = 1 ORDER BY Colour", dbSQL)
Dim dtColours As New DataTable
daColours.Fill(dtColours)
cboColours.DataSource=dtColours
cboColours.DisplayMember="Colour"
答案 3 :(得分:-1)
试试这个:
cboColours.DataSource = dtColours 'For Windows Forms
或
cboColours.ItemsSource = dtColours 'For WPF