我有一个带有组合框控件的 Excel 表单。我希望在打开组合框时使用已输入的类似条件从数据库表中填充值。这是我迄今为止为 DropButtonClick 事件实现此目的的代码。
Private Sub cboVariety_DropButtonClick()
Static search_text As String
Static is_open As Boolean
Dim rs As New Recordset
If is_open Then
is_open = False
Exit Sub
End If
is_open = True
If search_text = cboVariety Then Exit Sub
search_text = cboVariety
cboVariety.Clear
cboVariety.AddItem search_text
If Len(search_text) > 2 Then
rs.Open _
"SELECT Name FROM tbl_Varieties " & _
"WHERE Name LIKE '%" & search_text & "%' " & _
"ORDER BY Name", connect_string, adOpenStatic
Do Until rs.EOF
If rs!Name <> search_text Then cboVariety.AddItem rs!Name
rs.MoveNext
Loop
rs.Close
End If
End Sub
问题是 DropButtonClick 事件在组合框打开和关闭时都会触发。如果在组合框关闭时执行此子函数,则清除组合框的代码会导致删除用户的选择。
我试图使用 is_open 变量来判断框何时关闭,每次执行事件子时,该变量都会在 true 和 false 之间交替。这似乎是解决问题的一个脆弱的方法。有更好的办法吗?
最佳答案
使用 is_open
bool 值来跟踪组合框的状态是正确的,但您真正想要跟踪的是“我应该重新填充组合框吗”的状态与数据库数据?”
您希望何时填充列表框?目前,您希望每次用户单击下拉框时都会填充列表框(不考虑您的 is_open
状态变量)。这真的是你想要的吗?
我想您真正想要的是让组合框仅在其他内容发生更改后才更新。也许您只希望在表单首次打开时更新下拉列表。也许您只希望当搜索框中的文本更改时数据也更改。如果是这种情况,您需要根据实际想要执行更新时的状态来制定逻辑。
例如,假设您只想在搜索框中的文本发生更改时更新组合框。我现在没有查看 Excel,但假设您有一个名为 txtSearch
的文本框,其中包含 Text
属性。我首先添加一个模块或类级别变量来维护前一个文本条目的状态:
Private mPreviousSearchText As String
然后我会像这样更新我的事件代码:
Private Sub cboVariety_DropButtonClick()
Dim rs As New Recordset
Dim search_text As String
search_text = txtSearch.Text
If mPreviousSearchText = search_text Then
'The current search matches the previous search,'
'so we do not need to perform the update.'
Exit Sub
End If
cboVariety.Clear
cboVariety.AddItem search_text
If Len(search_text) > 2 Then
rs.Open _
"SELECT Name FROM tbl_Varieties " & _
"WHERE Name LIKE '%" & search_text & "%' " & _
"ORDER BY Name", connect_string, adOpenStatic
Do Until rs.EOF
If rs!Name <> search_text Then cboVariety.AddItem rs!Name
rs.MoveNext
Loop
rs.Close
End If
'Set the previousSearchText var to be the search_text so that it does'
'not run unless the value of my text box changes.'
mPreviousSearchText = search_text
End Sub
重点是确定您真正想要执行更新的时间,并找到一种方法将您的逻辑决策与您想要执行操作的时间相关联的状态联系起来,这只是巧合的是,与用户点击下拉框有关。
关于vba - Excel组合框问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3670644/