Access数据库PriceTable记录加载至标签并按材质分组制作价目表
我来给你整理一套完整的解决方案,一步步来就能搞定这个Access价目表分组展示的需求:
完整实现方案(Access 价目表分组展示)
第一步:先搞定窗体布局
- 打开你的Access窗体设计视图,添加4个Frame控件(带边框的容器),分别命名为
fraPlastic、fraWood、fraSteel、fraWax,对应四种材质。 - 把这四个Frame摆到窗体的四个区域(比如分两行两列,或者上下左右各一个),然后给每个Frame设置标题,比如
fraPlastic.Caption = "塑料材质价目",让用户一眼就能区分分组。 - 调整Frame的大小,确保能放下6条记录的标签。
第二步:编写窗体加载事件代码
我们需要在窗体的Load事件里完成三个核心操作:清除旧标签、读取数据、动态创建分组标签。
代码完整示例
Private Sub Form_Load() Dim rs As Recordset Dim lbl As Label Dim ctl As Control Dim xPos As Integer, yPos As Integer Dim currentMaterial As String ' -------------------------- ' 第一步:清除之前创建的动态标签 ' -------------------------- ' 遍历塑料Frame的控件,删除动态标签(给动态标签加前缀lbl_方便识别) For Each ctl In fraPlastic.Controls If ctl.ControlType = acLabel And Left(ctl.Name, 4) = "lbl_" Then DoCmd.DeleteObject acControl, ctl.Name End If Next ctl ' 处理木材Frame For Each ctl In fraWood.Controls If ctl.ControlType = acLabel And Left(ctl.Name, 4) = "lbl_" Then DoCmd.DeleteObject acControl, ctl.Name End If Next ctl ' 处理钢材Frame For Each ctl In fraSteel.Controls If ctl.ControlType = acLabel And Left(ctl.Name, 4) = "lbl_" Then DoCmd.DeleteObject acControl, ctl.Name End If Next ctl ' 处理蜡Frame For Each ctl In fraWax.Controls If ctl.ControlType = acLabel And Left(ctl.Name, 4) = "lbl_" Then DoCmd.DeleteObject acControl, ctl.Name End If Next ctl ' -------------------------- ' 第二步:读取PriceTable的数据,按材质排序 ' -------------------------- Set rs = CurrentDb.OpenRecordset("SELECT * FROM PriceTable ORDER BY Material, ID") If rs.EOF And rs.BOF Then MsgBox "价目表中没有记录!" rs.Close Set rs = Nothing Exit Sub End If ' -------------------------- ' 第三步:动态创建标签并分组到对应Frame ' -------------------------- xPos = 10 ' 标签在Frame内的起始X坐标(缇单位) yPos = 10 ' 起始Y坐标 currentMaterial = rs!Material ' 记录当前材质 Do While Not rs.EOF ' 创建新标签 Set lbl = CreateControl(Me.Name, acLabel, acDetail, , , xPos, yPos, 300, 25) ' 设置标签名称(用ID做后缀,避免重复) lbl.Name = "lbl_" & rs!ID ' 设置标签显示内容,可按需调整格式 lbl.Caption = "ID: " & rs!ID & " | 数量: " & rs!Piece & " | 单价: " & rs!Price ' 设置标签样式(可选) lbl.FontSize = 10 lbl.ForeColor = vbBlack lbl.BorderStyle = acBorderNone ' 根据材质把标签放到对应的Frame里 Select Case rs!Material Case "塑料" lbl.Parent = fraPlastic Case "木材" lbl.Parent = fraWood Case "钢材" lbl.Parent = fraSteel Case "蜡" lbl.Parent = fraWax End Select ' 调整下一个标签的位置,材质变化时重置Y坐标 If Not rs.EOF Then If rs!Material <> currentMaterial Then yPos = 10 currentMaterial = rs!Material Else yPos = yPos + 30 ' 标签之间的垂直间距 End If End If rs.MoveNext Loop ' 清理资源 rs.Close Set rs = Nothing Set lbl = Nothing End Sub
第三步:测试与调整
- 运行窗体,检查四个分组区域是否分别显示对应材质的6条记录。
- 如果标签排列太挤/太松,可调整代码里的
yPos = yPos + 30数值,或者标签的高度(25)。 - 如果标签内容太长,可调整标签宽度(
300),或者修改Caption的显示格式。
关键细节说明
- 用Frame做容器是最便捷的分组方式,它能自动约束内部控件的区域,移动Frame时标签会同步跟随。
- 每次加载窗体先清除旧标签,避免重复创建导致窗体控件冗余。
- 按
Material排序后遍历记录,能确保同材质记录连续处理,分组逻辑更顺畅。
内容的提问来源于stack exchange,提问作者arc95
相关产品推荐
相关产品推荐

