C#中如何对比验证TextBox值与ListView单元格值(限制销售数量)
解决销售数量不超过可用库存的验证问题
核心思路
在添加/更新商品到ListView前,先完成两项关键校验:
- 确保输入的可用数量和销售数量是有效正整数,避免转换异常
- 针对「新增商品」和「更新已有商品」两种场景,分别检查销售数量(更新时需累加已有数量)是否超过可用库存
具体实现
1. 新增数字验证辅助方法
先写一个通用方法,用来判断输入是否为有效整数:
private bool IsValidNumber(string input, out int number) { return int.TryParse(input, out number); }
2. 修改原有业务逻辑,插入验证步骤
在原有的添加/更新逻辑前加入校验,不通过则提示用户并终止操作:
// 辅助方法:清空所有输入文本框 private void ClearInputBoxes() { txtProductName.Text = ""; txtProductID.Text = ""; txtPrice.Text = ""; txtAvailableQty.Text = ""; txtSaleQty.Text = ""; txtTotalAmount.Text = ""; txtProduct.Text = ""; } // 你的商品添加/更新主方法 private void ProcessProduct() { // 第一步:验证可用数量和销售数量的合法性 int availableQty, saleQty; if (!IsValidNumber(txtAvailableQty.Text, out availableQty) || availableQty <= 0) { MessageBox.Show("请输入有效的可用数量!"); txtAvailableQty.Focus(); return; } if (!IsValidNumber(txtSaleQty.Text, out saleQty) || saleQty <= 0) { MessageBox.Show("请输入有效的销售数量!"); txtSaleQty.Focus(); return; } // 第二步:检查是否为已有商品,处理更新逻辑 bool productExists = false; for (int j = 0; j < ListView1.Items.Count; j++) { if (ListView1.Items[j].SubItems[1].Text == txtProductID.Text) { productExists = true; // 计算累计销售数量 int existingSale = Convert.ToInt32(ListView1.Items[j].SubItems[4].Text); int totalSale = existingSale + saleQty; // 校验累计数量是否超过库存 if (totalSale > availableQty) { MessageBox.Show($"该商品可用库存仅{availableQty},当前已售{existingSale},无法再添加{saleQty}!"); txtSaleQty.Focus(); return; } // 验证通过,执行更新 ListView1.Items[j].SubItems[1].Text = txtProductID.Text; ListView1.Items[j].SubItems[2].Text = txtProductName.Text; ListView1.Items[j].SubItems[3].Text = txtPrice.Text; ListView1.Items[j].SubItems[4].Text = totalSale.ToString(); ListView1.Items[j].SubItems[5].Text = (Convert.ToInt32(ListView1.Items[j].SubItems[5].Text) + Convert.ToInt32(txtTotalAmount.Text)).ToString(); txtSubTotal.Text = subtot().ToString(); Calculate(); ClearInputBoxes(); return; } } // 第三步:处理新增商品逻辑 if (!productExists) { if (saleQty > availableQty) { MessageBox.Show($"该商品可用库存仅{availableQty},无法销售{saleQty}!"); txtSaleQty.Focus(); return; } ListViewItem lst = new ListViewItem(); lst.SubItems.Add(txtProductID.Text); lst.SubItems.Add(txtProductName.Text); lst.SubItems.Add(txtPrice.Text); lst.SubItems.Add(txtSaleQty.Text); lst.SubItems.Add(txtTotalAmount.Text); ListView1.Items.Add(lst); txtSubTotal.Text = subtot().ToString(); Calculate(); ClearInputBoxes(); return; } }
关键优化点
- 用
int.TryParse替代Convert.ToInt32,避免无效输入导致的程序崩溃 - 拆分清空文本框逻辑为独立方法,让代码更简洁易维护
- 针对更新场景做累计数量校验,避免多次添加后超出库存
- 验证不通过时直接定位到对应输入框,提升用户操作体验
内容的提问来源于stack exchange,提问作者user11085963
相关产品推荐
相关产品推荐

