【问题标题】:Select item from a ComboBox从组合框中选择项目
【发布时间】:2013-12-04 22:03:44
【问题描述】:

我有 Access 2010 表单,它有一个组合框 cmbSubTopic,其中列出了两列(SubTopicIDSubTopic)。组合框绑定到包含SubTopicID 的字段。组合框中的SubTopicID 列是隐藏的,它只显示SubTopic。当用户从下拉列表中选择SubTopic 时,相应的SubTopicID 将存储在表中。我为表单的加载事件编写了一些 VBA 代码,以在表中查找 SubTopicID,并在 ComboBox 中选择相应的 SubTopic。我当前的代码是这样的:

Set rsST = dbs.OpenRecordset(strSqlst)
For i = 0 To Me.cmbSubTopic.ListCount - 1
    If Me.cmbSubTopic.Column(0, i) = rsST.Fields("SubTopicID").Value Then
        Me.cmbSubTopic.SetFocus
        Me.cmbSubTopic.Selected(i) = True
        Exit For
    End If
Next i

这给出了错误提示:

您输入的文本不是列表中的项目

我也试过用这个:

Me.cmbSubTopic = Me.cmbSubTopic.Selected(i)

这会选择 ComboBox 中的项目,但也会将 I 的值写入我不想要的表的 ID 字段中。

【问题讨论】:

  • 一般来说,对于有控制源的组合框你什么都不用做,因为它的值是底层表字段的值。
  • 有没有办法可以阻止在表单的 OnLoad 事件中将数据插入表中,然后允许在组合框的 AfterUpdate 事件中插入。

标签: vba ms-access combobox


【解决方案1】:

假设组合的第一列SubTopicID 也是它的“绑定列”属性,那么该列的值将用作组合的.Value 属性。这意味着您只需要为.Value 分配一个值即可选择匹配的组合行。

Me.cmbSubTopic.Value =  rsST.Fields("SubTopicID").Value

这种方法很简单,但我不确定它是否适合您的情况。我们对您的 rsST 记录集一无所知 --- 我假设记录集当前行中的 SubTopicID 字段是您希望在组合中选择的值。如果我误解了这一点,我们需要找出不同的东西。

如果组合绑定到表单记录源中的字段,则此建议也会更改存储的值。如果您不想这样,请“取消绑定”组合 --- 换句话说,将其 Control Source 属性设为空白。

【讨论】:

    【解决方案2】:

    这里有 2 个 subs - 一个用于传递文本 (SubTopic),第二个用于传递 ID (SubTopicId):

    Public Sub SelectComboBoxItemByText(cmb As ComboBox, Value As String)
        On Error GoTo ErrHandler_
    Dim i As Integer
        For i = 0 To cmb.ListCount - 1
            If cmb.Column(1, i) = Value Then
                cmb.SetFocus
                cmb.Selected(i) = True
                cmb.Text = Value
                Exit For
            End If
        Next i
    End Sub
    ExitProc_:
        DoCmd.Hourglass False
        Exit Sub
    ErrHandler_:
        DoCmd.Hourglass False
        Call LogError(Err, "basTools", "SelectComboBoxItemByText")
        Resume ExitProc_
        Resume ' use for debugging
    End Sub
    
    Public Sub SelectComboBoxItemById(cmb As ComboBox, Value As Integer)
        On Error GoTo ErrHandler_
    Dim i As Integer
        For i = 0 To cmb.ListCount - 1
            If cmb.Column(0, i) = Value Then
                cmb.SetFocus
                cmb.Selected(i) = True
                cmb = Value
                Exit For
            End If
        Next i
    ExitProc_:
        DoCmd.Hourglass False
        Exit Sub
    ErrHandler_:
        DoCmd.Hourglass False
        Call LogError(Err, "basTools", "SelectComboBoxItemById")
        Resume ExitProc_
        Resume ' use for debugging
    End Sub
    

    【讨论】:

      【解决方案3】:

      这是一个老问题,但我不妨在这里发布我的工作答案。您可以将 ItemData(idx) 分配给您的组合框:

           'Change the combobox slection to the second item 
           '(index starts with zero)
      
           cmb = cmb.ItemData(1)
      

      请注意,我一直在使用 MS Access 2007。更新的版本可能不再允许此分配。

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 2012-05-16
        • 2014-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多