如何在POS系统的FlowLayoutPanel中生成全部分类按钮并展示商品列表
POS系统分类按钮与商品列表展示实现方案
你的现有代码已经完成了从数据库读取分类动态生成按钮的核心逻辑,以下是补全优化后的完整实现:
1. 优化分类加载方法(避免重复生成按钮+新增全部分类)
修改LoadCategory方法代码如下:
Sub LoadCategory() ' 先清空原有分类按钮,避免重复加载 FlowLayoutPanel1.Controls.Clear() ' 先添加「全部」分类按钮,默认显示所有商品 Dim BtnAll As New Button BtnAll.Width = 100 BtnAll.Height = 35 BtnAll.Text = "全部" BtnAll.FlatStyle = FlatStyle.Flat BtnAll.BackColor = Color.FromArgb(55, 176, 213) BtnAll.ForeColor = Color.White BtnAll.Cursor = Cursors.Hand BtnAll.TextAlign = ContentAlignment.MiddleLeft FlowLayoutPanel1.Controls.Add(BtnAll) AddHandler BtnAll.Click, AddressOf filter_click cn.Open() cm = New SqlCommand("Select * From TblCategory", cn) dr = cm.ExecuteReader While dr.Read Dim BtnCategory As New Button ' 循环内声明按钮变量,避免全局变量污染 BtnCategory.Width = 100 BtnCategory.Height = 35 BtnCategory.Text = dr.Item("Category").ToString BtnCategory.FlatStyle = FlatStyle.Flat BtnCategory.BackColor = Color.FromArgb(55, 176, 213) BtnCategory.ForeColor = Color.White BtnCategory.Cursor = Cursors.Hand BtnCategory.TextAlign = ContentAlignment.MiddleLeft FlowLayoutPanel1.Controls.Add(BtnCategory) AddHandler BtnCategory.Click, AddressOf filter_click End While dr.Close() cn.Close() End Sub
2. 补全商品加载方法(FlowLayoutPanel展示商品列表)
新增LoadMenu方法实现逻辑,假设存储商品的表为TblProduct,包含商品分类、名称、价格等字段,放置商品的容器为flpProductList(可替换为你实际使用的FlowLayoutPanel控件名),代码如下:
Private _filter As String = "全部" ' 全局筛选变量,默认显示全部商品 Sub LoadMenu() ' 清空原有商品按钮 flpProductList.Controls.Clear() cn.Open() Dim sql As String ' 根据筛选条件拼接SQL If _filter = "全部" Then sql = "Select * From TblProduct" Else sql = "Select * From TblProduct Where Category = @Category" End If cm = New SqlCommand(sql, cn) If _filter <> "全部" Then cm.Parameters.AddWithValue("@Category", _filter) End If dr = cm.ExecuteReader While dr.Read ' 生成商品按钮 Dim BtnProduct As New Button BtnProduct.Width = 120 BtnProduct.Height = 80 BtnProduct.Text = dr.Item("ProductName").ToString & vbCrLf & "¥" & dr.Item("Price").ToString("0.00") BtnProduct.FlatStyle = FlatStyle.Flat BtnProduct.BackColor = Color.WhiteSmoke BtnProduct.ForeColor = Color.Black BtnProduct.Cursor = Cursors.Hand BtnProduct.Tag = dr.Item("ProductId").ToString ' 存储商品ID方便后续加购逻辑 flpProductList.Controls.Add(BtnProduct) ' 绑定商品点击事件,点击后加购到订单 AddHandler BtnProduct.Click, AddressOf AddToOrder End While dr.Close() cn.Close() End Sub
3. 可选优化:分类按钮点击状态高亮
修改filter_click方法,增加按钮选中状态区分,优化交互体验:
Public Sub filter_click(sender As Object, e As EventArgs) If LblTransNo.Text = String.Empty Then MsgBox("请先点击新建订单!", vbCritical) Return End If ' 所有分类按钮恢复默认颜色 For Each btn As Button In FlowLayoutPanel1.Controls.OfType(Of Button)() btn.BackColor = Color.FromArgb(55, 176, 213) Next ' 当前点击的按钮设置选中色 Dim clickBtn As Button = CType(sender, Button) clickBtn.BackColor = Color.FromArgb(20, 120, 160) _filter = clickBtn.Text LoadMenu() End Sub
内容的提问来源于stack exchange,提问作者Chaker
相关产品推荐
相关产品推荐

