【问题标题】:Access VBA listbox method .Selected versus .ItemData访问 VBA 列表框方法 .Selected 与 .ItemData
【发布时间】:2016-06-09 20:31:05
【问题描述】:

在处理应用程序时,我无法在列表框中获取所选项目以实际输出正确的行值。我正在使用.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 和一般编码的新手,所以也许这在该领域很常见,但它似乎很迟钝。

【问题讨论】:

    标签: vba ms-access listbox


    【解决方案1】:

    “选定”列表框属性不影响“值”之一

    它甚至不会触发事件

    “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”命名的用户表单
    • 以“Userform4”中“ListBox1”命名的ListBox

    最后在“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
    

    【讨论】:

      【解决方案2】:

      我遇到的问题不是在列表框中选择行,而是在我有行的地址时选择多个列。代码应该够用了,但是不行。

      .itemdata(control index).column(1)
      .itemdata(control index).column(2)  
      

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      相关资源
      最近更新 更多