2

以下代码中的数据表填充了 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()
4

4 回答 4

7

禁食的方法是使用AddRange方法而不是使用Add,例如:

Dim items = dtColours.AsEnumerable().Select(Function(d) DirectCast(d(0).ToString(), Object)).ToArray()
cboColours.Items.AddRange(items)

我做了一个简单的检查,使用AddRange速度比使用Add.

当然,分配一个数组并用For循环填充它可能比使用 Linq 快几毫秒。

于 2013-09-04T09:01:51.560 回答
4

您还可以将 ComboBox DataSource 属性绑定到 DataTable。这具有绑定其他列数据(例如您可能不希望用户看到的键值)的额外优势。

您应该能够从 SQLAdapter 返回一个 DataTable 对象。

cboColours.DataSource = dtColours
cboColours.DisplayMember = dtColours.Columns("Colour").ToString
cboColours.ValueMember = dtColours.Columns("Colour_id").ToString
于 2015-04-04T01:36:33.670 回答
3
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"
于 2014-09-12T05:10:01.340 回答
-1

试试这个:

cboColours.DataSource = dtColours 'For Windows Forms或者

cboColours.ItemsSource = dtColours 'For WPF

于 2013-09-04T08:48:57.463 回答