【问题标题】:Fastest way of filling a combobox from a datatable in VB.Net从 VB.Net 中的数据表填充组合框的最快方法
【发布时间】:2013-09-04 08:42:24
【问题描述】:

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

【问题讨论】:

  • 这看起来是个不错的添加数据的方法。 ComboBox 中有 7500 多个项目听起来太多了。也许您可以根据用户在另一个组合框上选择值或类似的东西来拆分信息并加载到组合框中的数据较少?

标签: vb.net


【解决方案1】:

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

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

cboColours.DataSource = dtColours
cboColours.DisplayMember = dtColours.Columns("Colour").ToString
cboColours.ValueMember = dtColours.Columns("Colour_id").ToString

【讨论】:

  • 我更喜欢这种方法,因为我只处理返回数据表的类。此方法还允许我在 Click 方法中从 flexgrid 内的隐藏索引中设置 selectedvalue。
  • 设置DataSource时控件会绑定。在 DataSource 之后设置 ValueMember 将导致控件再次绑定。所以尽可能快。 DataSource 应该设置在 ValueMember 之后。
【解决方案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"

【讨论】:

  • 请解释您的代码如何实现 OP 所达到的目标。这对您和其他有经验的程序员来说似乎很明显。如果您对代码提供清晰的解释,它将导致更好的 SO 答案以及更多的支持
【解决方案3】:

禁食的方法是使用AddRange 方法而不是使用Add,类似于:

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

我做了一个简单的检查,使用 AddRange 比使用 Add 快约 3 倍。

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

【讨论】:

  • 看来你是对的。就您已经考虑到 LINQ 部分而言,我想我最好删除我的答案。
  • PS:关于您上次的编辑:我不是 LINQ 的粉丝(大多数时候更喜欢循环),但是在这种情况下(一个不清楚的大数据表),我会选择 LINQ。跨度>
  • @varocarbas Linq 非常好,但是 VB.Net 中匿名方法的语法太丑了:-)
【解决方案4】:

试试这个:

cboColours.DataSource = dtColours 'For Windows Forms

cboColours.ItemsSource = dtColours 'For WPF

【讨论】:

  • 在建议设置数据源时,首先应该提到DisplayMember和ValueMember之类的东西。除此之外,这并不比我目前正在做的快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多