【问题标题】:Editing listbox item编辑列表框项目
【发布时间】:2021-12-15 22:05:18
【问题描述】:

所以我有一个列表框,它显示使用 select sql 查询在 Order 表中输入的所有订单。现在我还想添加从列表框中编辑项目的功能,我看到右键单击编辑列表项选项,但是当我单击它时,它只是打开表单但不填充字段。该表单具有未绑定的文本框,但我无法弄清楚如何根据右键单击的条目来填充它们。我还尝试从 vba 打开目标表单并使用以下代码通过 vba 填写字段

Private Sub editrecordbttn_Click()
Dim valSelect As Variant
Dim v As Variant
Dim selector As Variant
Dim strValue As String ' just used for the demonstration
Dim splitvalue() As String
Dim selectedsampid As String
Dim selectedcusid As String
Dim Records As DAO.Recordset
Dim SQLcus As String
Dim SQLsamp As String
 
For Each valSelect In Me.searchlistbox.ItemsSelected
    strValue = strValue & "" & Me.searchlistbox.ItemData(valSelect) & "," & "" & Me.searchlistbox.Column(1, valSelect) & ","
Next valSelect
 
    ' to remove trailing comma
strValue = Left(strValue, Len(strValue) - 1)

splitvalue() = Split(strValue, ",")
selectedsampid = splitvalue(0)
selectedcusid = splitvalue(1)

DoCmd.OpenForm ("Add Sample")
Forms![Add Sample].fnametxt.SetFocus


'query and fill cus info
SQLcus = "SELECT * FROM CustomerInfo WHERE CusID = '" & selectedcusid & "';"
Set Records = CurrentDb.OpenRecordset(SQLcus)
Me!clienttypetxt = Records![Client type].Value

    

结束子

【问题讨论】:

  • 为什么要使用未绑定的表单?为什么不绑定表单并使用 DoCmd.OpenForm 的 WHERE CONDITION 参数应用过滤条件?
  • @June7 好吧,我用来添加订单的表单具有未绑定的控件,因为它需要将表单数据分成多个表,我想重用相同的表单,但如果它适用于绑定表单,我会试试看,我只是不知道如何为要打开的新表单设置记录集
  • 为什么一个表格可以输入多个表格?您显示的 SQL 仅引用一个表,那么如何涉及多个表?编辑问题以显示示例数据结构。我从未使用未绑定的表单进行数据输入/编辑。代码对我来说毫无意义。为什么要构建一个 CSV 字符串然后拆分它?

标签: ms-access vba7


【解决方案1】:

好的,假设我们有一个列表框,我们这样做:

假定列表框的第一列是行的 PK 或“ID”。

所以,我们有这个:

因此您选择一行,然后单击按钮。

按钮代码如下所示:

Private Sub cmdEdit_Click()

  Debug.Print "Hotel list id selected = " & Me.HotelList
  
  DoCmd.OpenForm "frmEditHotels", , , "ID = " & Me.HotelList
  
  
End Sub

因此,在大多数情况下,为了获得更好的用户体验,按照上述方式处理可能会更好。

当然,您会在列表框(或组合)中填充不是来自数据库的值的“列表”。在这种情况下,您可以使用“编辑”列表选项。这允许您指定表单(或使用内置编辑器)。

所以,如果这不是您输入的列表,而是来自数据库,那么不要尝试使用内置的“列表编辑”

(添加一个类似上面的按钮,并启动带有“where”子句的表单,以将表单加载到 ONE 数据记录中,就像我在上面所做的那样。

因为很多时候,一个列表框的数据会来自一个表,那么编辑列表选项并没有什么特别的用途。并且使用表格(而不是列表)来填充+驱动组合/列表框是一个更好的设计,无论如何也是一个想法。 如果您想要多个用户,情况尤其如此,因为“列表”编辑功能意味着并建议每个编辑列表的用户现在将拥有自己的列表,而不是使用每个人都可以编辑的表格。

此外,没有理由使用循环来填充该列表框。我们可以这样做:

' setup critera for listbox.

Dim strSQL     As String

' prompt user for Hotel city - we just hard code for this exmaple.

Dim strCity    As String

strCity = "Banff"

strSQL = "SELECT ID,FirstName, LastName, City,HotelName FROM tblHotels " & _
        "WHERE City = '" & strCity & "' " & "ORDER BY HotelName"
        
Me.HotelList.RowSource = strSQL

注意我们没有一些 MESSAY 值列表,但可以将数据 (sql) 直接推送到列表框。我们不仅没有循环,而且我们也不必担心大小限制。

使用“值列表”(那些杂乱无章的分隔“;”列表),那么你有一个 4,000 个字符的相当小的限制。不要占用很多较大的行来“炸毁”列表框,因为它不能处理很多行。

其实我还是经常建议你使用向导来构建列表框,你可以选择一个数据源(sql),或者MUCH的出租人选择“值列表”。

价值列表是一个不错的选择,如果你说几个选项,比如先生,夫人或什么不是,它不是一些大桌子,但只能说 5-10 个选项。

还有更大的吗?使用数据表驱动的列表框,避免使用值列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多