香烟购物车小案例
实现这个案例我们可以分为2个步骤
效果演示:

步骤 1:创建 Winform 项目并设计界面

步骤 2:编写代码实现切换逻辑
using System;
using System.Drawing;
using System.Windows.Forms;
namespace 购物车小案例
{
public partial class Form1 : Form
{
/// <summary>
/// 商品数据源:存储所有香烟信息的字符串数组。
/// 格式约定:"商品名称-参考价格:单价"
/// </summary>
string[] Smoke =
{
"中华(软)-参考价格:65",
"云烟(软珍品)-参考价格:23",
"芙蓉王(硬盒)-参考价格:25",
"玉溪(软)-参考价格:23",
"黄鹤楼(天下明楼)-参考价格:16",
"利群(黑硬)-参考价格:48",
"红塔山(经典1956)-参考价格:10",
"南京(炫赫门)-参考价格:16",
"七匹狼(白)-参考价格:10",
"黄山(金皖烟)-参考价格:20",
"苏烟(五星红衫树)-参考价格:22",
"娇子(X)-参考价格:10",
"黄金叶(爱尚)-参考价格:15",
"长白山(777)-参考价格:12",
"白沙(精品三代)-参考价格:10",
"双喜(硬经典)-参考价格:10",
"中南海(5mg)-参考价格:12",
"兰州(硬珍品)-参考价格:16",
"红双喜(硬)-参考价格:10",
"贵烟(跨越)-参考价格:15",
"钻石(荷花)-参考价格:32",
"泰山(佛光细支)-参考价格:35",
"白沙(和天下)-参考价格:100",
"贵烟(国酒香30)-参考价格:70",
"黄金叶(天叶)-参考价格:100"
};
public Form1()
{
InitializeComponent();
}
//窗体加载事件
private void Form1_Load(object sender, EventArgs e)
{
//使用for循环,添加购物车得每行信息
for (int i = 0; i < Smoke.Length; i++)
{
// 创建一个Label标签 它是一个行容器 表示每行的商品信息(复选框 按钮 Label)
Label labelBox = new Label();
// 按索引设置行的垂直位置
labelBox.Top = i * 30;
// 行高度
labelBox.Height = 30;
// 边框样式设置为带有边框
labelBox.BorderStyle = BorderStyle.FixedSingle;
// 设置每行的宽度,留出30宽显示右侧的滚动条
labelBox.Width = panel1.Width - 30;
// 用索引作为行的名称
labelBox.Name = i.ToString();
// 给每行中出现的控件绑定鼠标移动事件
labelBox.MouseMove += LabelBoxMove;
// 自定义的控件需要明确的添加到winform窗体指定的控件上
panel1.Controls.Add(labelBox);
// 创建出每行的控件
// 商品复选框
CheckBox Goods = new CheckBox();
Goods.Text = Smoke[i].Split('-')[0];// 从数组元素中分割出商品名称
Goods.Location = new Point(10, 5);// 复选框在该行的位置
Goods.AutoSize = true;// 自动调整大小
// 绑定一个点击事件
Goods.Click += GoodsClick;
// 添加到Label行容器中
labelBox.Controls.Add(Goods);
// 创建减少按钮
Button Minus = new Button();
Minus.Text = "-";
Minus.Width = 25;
Minus.Location = new Point(240, 5);
Minus.Click += MinusClick;// 绑定"减按钮点击事件"
labelBox.Controls.Add(Minus);
// 创建数量Label
Label Num = new Label();
Num.Text = "0";// 初始数量为0
Num.Width = 20;
Num.Location = new Point(270, 8);
labelBox.Controls.Add(Num);
// 创建相加按钮
Button Add = new Button();
Add.Text = "+";
Add.Width = 25;
Add.Location = new Point(290, 5);
// 相加点击事件
Add.Click += AddClick;
labelBox.Controls.Add(Add);
// 创建价格文本
Label Price = new Label();
Price.Text = Smoke[i].Split(':')[1] + "元";// 获取分割后数组中的第二个值价格
Price.Font = new Font("微软雅黑", 9);
Price.Location = new Point(460, 5);
labelBox.Controls.Add(Price);
}
}
// 计算总金额封装成一个方法
private void CalcMoney()
{
// 定义一个总和变量
int sum = 0;
for (int i = 0; i < panel1.Controls.Count/*Smoke.Length*/; i++)
{
// 首先先判断商品复选框是否被选中
CheckBox checkBox = panel1.Controls[i].Controls[0] as CheckBox;
if (checkBox.Checked)
{
// 计算总金额
// 先获取该行商品对应的价格
int price = int.Parse(panel1.Controls[i].Controls[4].Text.Split('元')[0]);
int num = int.Parse(panel1.Controls[i].Controls[2].Text);
sum += price * num;
}
}
// 赋值
label5.Text = "总金额:" + sum + "元";
}
// 定义一个索引变量
int index = 0;
// 给每行容器绑定鼠标移动事件
private void LabelBoxMove(object sender, MouseEventArgs e)
{
Label label = sender as Label;// 强制转换
index = int.Parse(label.Name);// 把每行容器的name属性赋值给索引变量index
}
// 给全选按钮绑定点击事件
private void checkBox1_Click(object sender, EventArgs e)
{
// 实现全选全不选
for (int i = 0; i < /*panel1.Controls.Count*/ Smoke.Length; i++)
{
CheckBox checkBox = panel1.Controls[i].Controls[0] as CheckBox;
checkBox.Checked = checkBox1.Checked; // 所有商品复选框与全选框状态一致
}
// 调用计算总金额方法
CalcMoney();
}
// 绑定一个每行复选框的点击事件
private void GoodsClick(object sender, EventArgs e)
{
// 遍历面板中所有的复选框 判断状态
// 定义一个布尔变量 标记是否所有商品都被选中
bool flag = true;
for (int i = 0; i < Smoke.Length; i++)
{
CheckBox checkBox = panel1.Controls[i].Controls[0] as CheckBox;
if (!checkBox.Checked)
{
// 代表为true
flag = false;
}
}
if (flag)
{
checkBox1.Checked = true;
}
else
{
checkBox1.Checked = false;
}
// 计算总金额
CalcMoney();
}
// 加数量按钮事件
private void AddClick(object sender, EventArgs e)
{
// 通过index获取当前行的"数量标签"
int num = int.Parse(panel1.Controls[index].Controls[2].Text);
num++;
// 再次赋值
panel1.Controls[index].Controls[2].Text = num.ToString();
// 计算总金额
CalcMoney();
}
// 减少按钮
private void MinusClick(object sender, EventArgs e)
{
int num = int.Parse(panel1.Controls[index].Controls[2].Text);
num--;
// 判断是否小于等于0
num = num <= 0 ? 0 : num;
// 再次赋值
panel1.Controls[index].Controls[2].Text = num.ToString();
// 计算总金额
CalcMoney();
}
}
}
希望对大家有所帮助。感谢大家的关注和点赞。

被折叠的 条评论
为什么被折叠?



