performance - 将数据加载到组合框中很慢

标签 performance vb6 combobox

我有一个带有搜索屏幕的 VB6 应用程序。在搜索中,我有 9 个组合框。一些组合框只有几个项目,但有些有几百个项目。填充数据需要很长时间(几秒钟)。

每个组合框的配置相同:Sorted = False, Style = 2 - Dropdown List

3 个组合框少于 20 个项目。
1 有 130 个项目。
4 有大约 250 个项目
1 有近 700 项。

我用类似的代码填充了所有九个组合框。

While Not RS.EOF

    cmbX.List(i) = RS("Description")
    cmbX.ItemData(i) = RS("Id")

    i = i + 1

    RS.MoveNext
Wend

我尝试设置 Visible = False 但它对性能没有影响。

是否有另一种填充组合框的方法会比我现有的方法表现更好?

最佳答案

这是您可以尝试的方法。根据this post通过使用 Windows API 函数填充组合框,而不是通常的 AddItem 方法,您可以减少大约 60% 的开销:

Private Const CB_ERR As Long = -1
Private Const CB_ADDSTRING As Long = &H143
Private Const CB_RESETCONTENT As Long = &H14B
Private Const CB_SETITEMDATA As Long = &H151

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal _
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Sub AddItem(cmb As ComboBox, Text As Variant, Optional ItemData As Long)

   Dim l As Long
   Dim s As String

   If VarType(Text) = vbString Then
      s = Text
   Else
      s = Trim$(Str$(Text))
   End If

   l = SendMessage(cmb.hwnd, CB_ADDSTRING, 0&, ByVal s)
   If l <> CB_ERR Then
      SendMessage cmb.hwnd, CB_SETITEMDATA, l, ByVal ItemData
   End If

End Sub

Public Sub Clear(cmb As ComboBox)
   SendMessage cmb.hwnd, CB_RESETCONTENT, 0, 0&
End Sub

您可以通过省略函数调用并直接调用 API 函数来减少一些损失。

关于performance - 将数据加载到组合框中很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1230333/

相关文章:

MYSql搜索性能问题

Java - for循环终止表达式之间的区别

c# - C# 编译器和 C++/CLI 编译器的输出之间的差异

MySQL 有些查询永远不会执行

vb6 - 通过VB6发送电子邮件

logging - VB6-如何在启动应用程序时在VB6中创建日志文件

c# - 将 VB6 随机化转换为 C#

c# - 更新数据绑定(bind)组合框

ComboBox - 在 vb6 中运行时禁用键盘手动输入

wpf - ListBox 中的所有 ComboBox 在其中任何一个更改时都会更改