在处理应用程序时,我无法在列表框中获取所选项目以实际输出正确的行值。我正在使用.Selected
方法来选择需要选择哪一行以进行下一步,这将从列表框中提取绑定列的值以进行进一步处理,而无需用户与之交互列表框。
事实证明.Selected
与点击列表行的工作方式不同,因为其输出值仍然是最后一个“手动”选定行的绑定列值。
我意识到我必须使用.Selected
方法跟进.ItemData
方法,以实际使列表框输出值等于我在.Selected
方法中选择的行。
以下是我用于将供应商PN查找表单上的选择复制到主要零件搜索表单的代码:
Private Sub cmdAddTofrmPartSearch_Click()
Dim i as Integer
... [truncated]
Forms("frmPartSearch").lstSearchResults.Selected(i - 1) = True
... [truncated]
Forms("frmPartSearch").txtHiddenPN.Value
= Forms("frmPartSearch").lstSearchResults.ItemData(i - 1)
...[truncated]
End Sub
如上所述,为什么我需要使用:
Forms("frmPartSearch").lstSearchResults.Selected(i - 1) = True
和
Forms("frmPartSearch").txtHiddenPN.Value
= Forms("frmPartSearch").lstSearchResults.ItemData(i - 1)
要让txtHiddenPN
接收正确的行值,而不是简单地将txtHiddenPN
的控件来源设置为=[lstSearchResults]
并让它更新为.Selected
之后的行值?
如果.Selected
没有改变列表框的输出值(除了轻松,但徒劳地突出显示一行),它的用途是什么?同样,为什么.ItemData
也不突出显示输出绑定值的行?这是一个糟糕的设计,还是有另一种同时实现两种结果的方法?是自动包含两种方法的最佳做法吗?是否有需要调用一种方法的情况?
我是VBA的新手并且编码一般,所以也许这是该领域的常见现象,但它似乎很钝。
答案 0 :(得分:1)
“已选择”ListBox属性不会影响“值”一个
它甚至不会触发事件
“Selected”属性主要用于检查选择了哪些列表框元素
您可能需要check this
所以你不需要Forms("frmPartSearch").lstSearchResults.Selected(i - 1) = True
代码行,因为它对你的代码没有影响
要更全面地了解列表框功能,您可能还想按照以下方式使用它
将此代码添加到项目的模块中
Option Explicit
Sub PlayWithListBox()
With UserForm4
With .ListBox1
.AddItem "a1"
.AddItem "a2"
.AddItem "a3"
.AddItem "a4"
End With
.Show
MsgBox "going to use Select property"
With .ListBox1
.Selected(2) = True
Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End With
Unload UserForm4
End Sub
Sub ShowValueAndListIndex(valueStrng As String, listIndexStr As String)
MsgBox "Value: " & valueStrng
MsgBox "listIndex: " & listIndexStr
End Sub
然后添加到您的项目
最后在“UserForm4”代码模块中添加以下代码
Private Sub ListBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox "BeforeUpdate"
With Me.ListBox1
If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub
Private Sub ListBox1_Change()
MsgBox "Change"
With Me.ListBox1
If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub
Private Sub ListBox1_Click()
MsgBox "Click"
With Me.ListBox1
If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub
Private Sub ListBox1_Enter()
MsgBox "Enter"
With Me.ListBox1
If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub
Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
MsgBox "KeyDown"
With Me.ListBox1
If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub
Private Sub ListBox1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
MsgBox "MouseDown"
With Me.ListBox1
If .ListIndex >= 0 Then Call ShowValueAndListIndex(.value, .List(.ListIndex))
End With
End Sub