WinForm+C#小案例--->用代码实现窗体设计的香烟购物车小案例

ModelEngine·创作计划征文活动 10w+人浏览 1.4k人参与

香烟购物车小案例

实现这个案例我们可以分为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();
        } 
    }
}

希望对大家有所帮助。感谢大家的关注和点赞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值