C#制作简易超市柜台结账系统

这篇具有很好参考价值的文章主要介绍了C#制作简易超市柜台结账系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

该程序用于Windows编程课程设计,涉及到的知识主要有:C#窗体应用开发、数据库连接和常规的增删改查、SqlConnection和SqlDataAdapter的使用方法、dataGridView的使用方法、控件联动以及文件读写操作。

程序主界面

c# 购物应用,c#,数据库,Powered by 金山文档

后台库存管理界面

c# 购物应用,c#,数据库,Powered by 金山文档

历史消费记录

c# 购物应用,c#,数据库,Powered by 金山文档

消费记录的导出

c# 购物应用,c#,数据库,Powered by 金山文档

开发环境

Windows10, Visual Studio2019, Microsoft SQL Server

项目文件结构

c# 购物应用,c#,数据库,Powered by 金山文档

Form1:程序主窗口

Form2:后台库存管理界面

Form3:历史消费记录查询

Database1.mdf:手动添加的数据库文件

Properties:项目配置,主要用于配置数据库连接字符串

开发笔记

新建项目选择Windows窗体应用(.Net Framework) C#

c# 购物应用,c#,数据库,Powered by 金山文档

每个窗体包含一个设计界面和一个代码文件,设计界面用于窗体布局,布局完成后双击控件进入该控件的点击响应函数,在函数内编写事件响应代码

c# 购物应用,c#,数据库,Powered by 金山文档

添加数据库文件:在解决方案右键,选择添加->新建项,选择“基于服务的数据库”

c# 购物应用,c#,数据库,Powered by 金山文档
c# 购物应用,c#,数据库,Powered by 金山文档

在数据库中添加3张表:Cart, History, Product,分别存放购物车里的商品、历史消费记录、商品的基本信息,表的定义如下:(建表可以通过图形界面进行操作)

CREATE TABLE [dbo].[Cart] (
    [Name]  NVARCHAR (50) NOT NULL,
    [Price] MONEY         NULL,
    [Num]   INT           NULL,
    [Total] MONEY         NULL,
    PRIMARY KEY CLUSTERED ([Name] ASC)
);
CREATE TABLE [dbo].[History] (
    [Id]      INT            IDENTITY (1, 1) NOT NULL,
    [Content] NVARCHAR (MAX) NULL,
    [Total]   MONEY          NULL,
    [Time]    DATETIME       NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);
CREATE TABLE [dbo].[Product] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [Name]        NVARCHAR (50)  NULL,
    [Price]       MONEY          NOT NULL,
    [Stock]       INT            NOT NULL,
    [Description] NVARCHAR (MAX) NULL,
    [Class]       NVARCHAR (20)  NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    CHECK ([Price]>=(0)),
    CHECK ([Stock]>=(0))
);

下面是一个将商品信息表的商品名称加载到list控件的例子,有助于了解SqlConnection和SqlDataAdapter以及DataTable的基本使用方法

//将所有商品名称加载到listbox1
SqlConnection con = new SqlConnection(Properties.Settings.Default.Database1ConnectionString);
SqlDataAdapter da1 = new SqlDataAdapter("select Name from Product", con);
DataTable dt1 = new DataTable();
da1.Fill(dt1);
listBox1.DataSource = dt1;
listBox1.DisplayMember = "Name";
listBox1.ValueMember = "Name";

核心代码

主窗口加载函数:

a.将商品的所有类别加载到下拉框

b.将所有商品名称加载到list列表

c.将购物车内容加载到datagridview

private void Form1_Load(object sender, EventArgs e)
{
    //将商品的所有类别加载到下拉框里
    con = new SqlConnection(Properties.Settings.Default.Database1ConnectionString);
    SqlDataAdapter da = new SqlDataAdapter("select distinct Class from Product", con);
    DataTable dt = new DataTable();
    da.Fill(dt);
    DataRow dr = dt.NewRow();
    dr[0] = "所有";
    dt.Rows.InsertAt(dr, 0);
    comboBox1.DataSource = dt;
    comboBox1.DisplayMember = "Class";
    comboBox1.ValueMember = "Class";

    //将所有商品名称加载到listbox1
    SqlDataAdapter da1 = new SqlDataAdapter("select Name from Product", con);
    DataTable dt1 = new DataTable();
    da1.Fill(dt1);
    listBox1.DataSource = dt1;
    listBox1.DisplayMember = "Name";
    listBox1.ValueMember = "Name";

    //将购物车内容加载到datagridview1
    SqlDataAdapter da2 = new SqlDataAdapter("select * from Cart",con);
    DataTable dt2 = new DataTable();
    da2.Fill(dt2);
    dataGridView1.DataSource = dt2;
}

下拉框与list列表联动,当选中下拉框的某个商品类别,list列表自动显示属于这种类别的商品

//根据下拉框选择的类别将相应商品加载到listbox1
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    SqlDataAdapter da = new SqlDataAdapter();
    if (comboBox1.SelectedValue.ToString() == "所有")//如果选择的类别是“所有”,加载所有商品
    {
        da.SelectCommand = new SqlCommand("select Name from Product", con);
    }
    else//否则加载指定类别的商品
    {
        da.SelectCommand = new SqlCommand("select Name from Product where Class=N'" + comboBox1.SelectedValue.ToString() + "'", con);
    }
    DataTable dt = new DataTable();
    da.Fill(dt);
    //绑定数据源
    listBox1.DataSource = dt;
    listBox1.DisplayMember = "Name";
    listBox1.ValueMember = "Name";
}

点击添加按钮,将选中的商品添加到右侧购物车。添加过程需要完成以下几件事:

a.首先查看要添加的商品是否有足够的库存

b.库存足够则可以添加到购物车,分两种情况,购物车已有该商品(找到该商品只增加数量)和没有添加过该商品(从商品Product查找相关属性,补充一条记录插入到购物车Cart)

c.更改商品的库存量

d.计算总金额并显示到消费栏

private void button1_Click(object sender, EventArgs e)
{
    //如果添加的数量为0,则不做任何处理
    if (numericUpDown1.Value == 0)
    {
        toolStripStatusLabel1.Text = "完成";
        return;
    }

    //首先查看要添加的商品是否有足够的库存
    SqlCommand cmd = new SqlCommand("select Stock from Product where Name=N'" + listBox1.SelectedValue.ToString() + "'", con);
    con.Open();
    int stock = Convert.ToInt32(cmd.ExecuteScalar());
    con.Close();
    if(stock< Convert.ToInt32(numericUpDown1.Value))//如果库存小于要添加的数目,说明库存不足
    {
        MessageBox.Show("该商品库存不足!","提示");
        toolStripStatusLabel1.Text = "完成";
        return;
    }

    //库存足够则可以添加到购物车Cart,即执行插入操作,分两种情况,购物车已有该商品(找到该商品只增加数量)和没有添加过该商品(从商品Product查找相关属性,补充一条记录插入到购物车Cart)
    SqlDataAdapter da = new SqlDataAdapter("select * from Cart", con);
    SqlCommandBuilder scb = new SqlCommandBuilder(da);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dt.PrimaryKey = new DataColumn[] { dt.Columns["Name"] };//设置主键,为了下面find指定的商品
    DataRow row = dt.Rows.Find(listBox1.SelectedValue.ToString());
    if (row == null)//没有找到记录,说明是第一次添加该商品
    {
        cmd.CommandText = "select Price from Product where Name=N'" + listBox1.SelectedValue.ToString() + "'";
        con.Open();
        string price = cmd.ExecuteScalar().ToString();
        con.Close();
        row = dt.NewRow();
        row.BeginEdit();
        row[0] = listBox1.SelectedValue.ToString();
        row[1] = Convert.ToDouble(price);
        row[2] = Convert.ToInt32(numericUpDown1.Value);
        row[3] = Convert.ToDouble(price) * Convert.ToInt32(numericUpDown1.Value);
        row.EndEdit();
        dt.Rows.InsertAt(row, 0);
    }
    else//找到了则只需要增加该记录的Num值
    {
        row.BeginEdit();
        row[2] = Convert.ToInt32(row[2]) +Convert.ToInt32(numericUpDown1.Value);
        row[3] = Convert.ToDouble(row[1]) * Convert.ToInt32(row[2]);
        row.EndEdit();
    }
    dataGridView1.DataSource = dt;
    da.Update(dt);//提交记录到购物车Cart

    //从商品Product中减去库存
    con.Open();
    cmd.CommandText = "update Product set Stock-="+ numericUpDown1.Value + " where Name=N'" + listBox1.SelectedValue.ToString() + "'";
    cmd.ExecuteNonQuery();

    //计算总金额填到消费栏里(红色)
    cmd.CommandText = "select sum(Total) from Cart";
    label2.Text = cmd.ExecuteScalar().ToString();
    con.Close();
}

在实付金额文本框输入数字时,同步改变找零的数值

private void textBox1_TextChanged(object sender, EventArgs e)
{
    try
    {
        double cost = Convert.ToDouble(label2.Text);
        double pay = Convert.ToDouble(textBox1.Text);
        double ret = pay - cost;
        label6.Text = ret.ToString();
    }
    catch (FormatException)//如果发现输入的金额不合法,什么也不做,也就是不改变找零的数值
    {
        return;
    }
}

点击完成支付时,需要判断输入的金额是否足够,或者有没有添加商品;支付成功则删除购物车里的内容,并将控件恢复初始值

private void button2_Click(object sender, EventArgs e)
{
    //第一种情况,没有购物就点击支付
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandText = "select count(Name) from Cart";
    if (Convert.ToInt32(cmd.ExecuteScalar()) == 0)
    {
        con.Close();
        MessageBox.Show("您还没有选择商品!","提示");
        toolStripStatusLabel1.Text = "完成";
        return;
    }
    con.Close();

    //第二种情况,输入的金额小于消费额,或者输入非法数据
    double ret = Convert.ToDouble(label6.Text);
    if (ret < 0)
    {
        MessageBox.Show("您付的钱不够!", "提示");
        toolStripStatusLabel1.Text = "完成";
        return;
    }
    try
    {
        double pay = Convert.ToDouble(textBox1.Text);
    }
    catch (FormatException)
    {
        MessageBox.Show("您付的钱不够!", "提示");
        toolStripStatusLabel1.Text = "完成";
        return;
    }

    //把记录写到购物历史History中
    con.Open();
    cmd.CommandText = "select Name,Num from Cart";
    SqlDataReader sdr = cmd.ExecuteReader();
    string content = "";//把记录读到该字符串,作为购物记录的Content属性值,形式为(营养快线x2,橘子x3...)
    while (sdr.Read())
    {
        content += "、" + sdr.GetValue(0).ToString() + "x" + sdr.GetValue(1).ToString();
    }
    sdr.Close();
    content = content.Substring(1);//去掉第一个字符“、”
    cmd.CommandText = "insert into History(Content,Total,Time) values(N'"+content+"',"+Convert.ToDouble(label2.Text)+",'"+DateTime.Now.ToLocalTime()+"')";
    cmd.ExecuteNonQuery();
    con.Close();

    //清空购物车的内容
    cmd.CommandText = "delete from Cart";
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();

    //重置datagridview1
    SqlDataAdapter da = new SqlDataAdapter("select * from Cart", con);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;

    //重置以下控件的值
    numericUpDown1.Value = 1;
    label2.Text = "0";
    label6.Text = "0";
    textBox1.Text = "";

    //购物成功提示
    MessageBox.Show("欢迎下次光临!", "提示");
}

选中购物车的一行或多行,点击删除按钮触发删除事件,将选中的商品从购物车移除

private void button3_Click(object sender, EventArgs e)
{
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    //遍历选择的每一行
    for (int i = 0; i < dataGridView1.SelectedRows.Count; i++)
    {
        string name = dataGridView1.SelectedRows[i].Cells[0].Value.ToString();
        int num = Convert.ToInt32(dataGridView1.SelectedRows[i].Cells[2].Value);//获取当前行的Name值
        cmd.CommandText = "delete from Cart where Name=N'" + name + "';update Product set Stock+="+num+ " where Name=N'" + name + "';";
        cmd.ExecuteNonQuery();//执行删除
    }

    //让datagridview重新显示删除后购物车Cart的内容
    SqlDataAdapter da = new SqlDataAdapter("select * from Cart", con);
    DataTable dt = new DataTable();
    da.Fill(dt);
    dataGridView1.DataSource = dt;

    //重新计算总消费额
    cmd.CommandText = "select sum(Total) from Cart";
    label2.Text = cmd.ExecuteScalar().ToString();
    con.Close();
}

以上只讲解了主窗口的代码,剩下两个窗口的代码也是类似的,实现思路在代码中均有注释

完整代码见:

https://github.com/FonlinGH/SimpleCheckoutSystem文章来源地址https://www.toymoban.com/news/detail-776183.html

到了这里,关于C#制作简易超市柜台结账系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • asp.net古代服饰系统VS开发sqlserver数据库web结构c#编程包含购物答题功能点

    一、源码特点         asp.net 古代服饰系统 是一套完善的web设计管理系统(含购物 答题),系统采用mvc模式(BLL+DAL+ENTITY)系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境 为vs2010,数据库为sqlserver2008,使用c#语言开发 asp.net 月下逢古代服饰系统1 二、功能

    2024年02月07日
    浏览(50)
  • 【毕业设计】基于微信小程序的超市购物系统 购物商城微信小程序

    超市是我们日常生活中必不可少的一部份,但是每当到了节假日的时候我们都能够遇到这样的问题,排队结账的队伍总是一眼望不到头,毫不夸张的说排队结账的时间都要赶超选购的时间了,这是传统超市需要转型的原因之一;其次超市的物品种类丰富,就是因为物品种类丰

    2024年02月09日
    浏览(57)
  • 新手向 使用C#自带方法制作unity存档系统(无插件)

    纯原创,自制 本人还是个在校的高中生,能力不精如果有漏洞欢迎指出 先放出我们示范项目的样子 演示项目工程文件下载 后面会在B站发详细的视频教程(所以文章之后肯会改) 嫌麻烦的直接复制到项目里就可以用哦 (全部的SaveSystem源码最后放出方便大家复制) 可以存储

    2024年02月10日
    浏览(54)
  • asp.net闲置物品购物网系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

    一、源码特点         asp.net闲置物品购物网系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语 言开发 asp.net 闲置物品购物网 二、功能介绍 前台主要功能: 首页 公告浏览 商品浏

    2024年02月07日
    浏览(48)
  • 基于SpringBoot的苏果超市商品销售管理系统+93704(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案

    在网络信息的时代,众多的软件被开发出来,给用户带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,超市只能以用户为导向,按品种小批量组织生产,以产品的持续创新作为超市最重要的竞争手段。 系统采用了B/S结构,将所有业务模块采用以

    2024年02月19日
    浏览(60)
  • thinkphp+vue+html超市零食品美食推荐系统零食购物商城网站7v281

    本系统的开发使获取食品推荐系统信息能够更加方便快捷,同时也使食品推荐系统管理信息变的更加系统化、有序化。系统界面较友好,易于操作 运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vue.js 服务器:apache 数据库:mysql 数据库工具:Navicat/ph

    2024年02月03日
    浏览(33)
  • 如何用C#写一个简易的上位机

    上位机的界面如下  有点不好看,自己可以按照自己的来设计,这里着重功能的实现 直接上代码,打开VS新建项目,选择Windows窗口应用(NET。Framework)创建好项目  选择视图,打开工具箱(快捷键 Ctrl + Alt + x)  在工具箱中,输入GroupBox ,拖拽到界面中,调节合适的大小,把

    2024年02月16日
    浏览(27)
  • C# Tcplistener,Tcp服务端简易封装

    我最近有个需求要写Tcp服务端,我发现Tcp服务端的回调函数比较麻烦,简化Tcp的服务,我打算自己封装一个简单的Tcp服务端。 C# TCP应用编程三 异步TCP应用编程 C# Tcpclient Tcplistener 服务器接收多个客户端消息通讯 关于C#Socket断开重连问题 我最近有个Tcp服务端的项目,发现TcpL

    2024年02月04日
    浏览(35)
  • C# 简易TCP网口调试助手(一) 客户端Client

      最近的上位机开发工作中开始频繁涉及到网口、串口的通讯,网上找了各种资料和帖子都没怎么找到好用的开源代码或者工具。目前找到几个好一点的方式来实现的网口和串口通讯工具包,先写个好用的TCP的negut包记录下来,将使用的步骤写下来做个记录。   本博客主要用

    2024年04月13日
    浏览(47)
  • 测试C#调用Aplayer播放视频(3:编写简易播放器)

      学习了参考文献1中的示例代码,也找出了前一篇文章中自己测试控件但无法播放视频的问题(没有将解码库文件复制到可执行程序所在的codecs文件夹内),本文基于APlayer组件编写简单的视频播放器,主要实现以下功能: 序号 功能 说明 1 自定义logo 调用SetCustomLogo函数设

    2024年02月05日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包