• 基于C#开发web网页管理系统模板流程-主界面管理员入库和出库功能完善


    点击返回目录->

    基于C#开发web网页管理系统模板流程-总集篇-CSDN博客


    前言

    紧接上篇->基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善-CSDN博客

    本篇将完善主界面的管理员入库和出库功能,同样的,管理员入库和出库的设计套路适用于动态表的录入和编辑

    首先还是介绍一下本项目将要实现的功能

    (一)入库界面

    根据时间自动生成入库单号、根据入库数量和入库单价自动生成入库总价

    完成基本的入库、查询、重置功能,能够通过勾选CheckBox控件进行指定字段的条件查询

    (二)出库界面

    下拉选择货品后自动产生库存(下图出库数量之后的红色数字),根据时间自动生成出库单号、根据出库数量和销售单价自动生成销售总价,输入出库数量时能判断库存是否足够

    完成基本的入库、查询、重置功能,能够通过勾选CheckBox控件进行指定字段的条件查询

    (注:本篇开始不再会像前两篇那样事无巨细地介绍操作流程和配图,出现过的类似操作都会一笔带过)


    一,新建crkgl文件夹

    (crkgl,即“出入库管理”的缩写)

    在admin文件下再新建一个crkgl文件夹以方便脚本管理,我们将把实现出入库功能的脚本放在这个文件夹下,以此类推,当你实现菜单的其它选项的功能时,也应采用这个思路


    二,设计入库界面

    (一)添加设计工作台

    创建一个【包含母版页的Web窗体】,将其命名为rkgl.aspx

    点击添加后再弹出的【选择母版页】窗口中选择唯一一个母版页Site.Master

    (二)插入与调整表格

    在刚刚新建的文件中点击右下角的【设计】,在紫色窗口中键入几个回车方便操作

    入库界面的表格的列数固定为3,行数需要根据你自己管理系统需要查询的字段数来决定

    行数=入库表中的字段数+2

    例如:在我的入库表中有7个字段,因此设置该表为9(7+2)行

    (三)对表格进行自己喜欢的修饰并并添加相关提示信息

    参考设计如图

    (四)添加控件并配置控件

    如下图,共添加:6个【TextBox】,3个【Button】,1个【DropDownList】(这两类控件都在【工具箱】->【标准】中找到),1个【GridView】(这个控件在【工具箱】->【数据】中)

    DropDownList】控件能够实现下拉直接选择数据库中已存在的货品号,可以根据自己的具体需要使用此控件

    (1)控件修饰

    添加控件后对表格再次修饰,将3个按钮依次改为入库、查询、重置

    (2)控件属性配置

    需要对一些控件的属性进行配置

    ①一些固定的、用户已经输入的、在数据库中已存在的信息预期能够自动生成,减少用户的二次输入,因此直接将这类信息的文本框禁用。通过脚本自动导入,例如:入库单号(通过时间自动生成)、管理员号(数据库中导入)、入库总价(通过入库数量*入库单价直接生成)

    ②对相关文本框能够接收的数据类型进行限制,例如:入库数量和入库单价(设置为Number类型),入库时间(设置为Date类型)

    ③将入库数量和入库单价的【AutoPostBack】属性设置为True,目的是为了能够“一旦入库数量或入库单价的信息被输入,就自动调用该控件的相关脚本,自动生成入库总价的信息”

    (五)配置GridVeiw

    (1)GridView数据源配置

    详细教程见上篇标题【三.(六)】处内容->基于C#开发web网页管理系统模板流程-主界面管理员录入和编辑功能完善-CSDN博客

    流程和之前的基本一致,主要是以下两处注意修改——

    ①配置Select语句处注意修改成入库表

    ②编写自定义SQL语句

    入库表通常不编写Update修改语句(实际使用中店员不应具备修改已入库记录的权限,容易做假账,即便能修改,也涉及到修改日志、修改原因等信息的记录,十分棘手,因此只编写查询和删除语句)

    (2)配置删除功能

    ①启用分页和删除功能

    将删除功能移至右端

    将【CommandField】列设置为TemplateField(模板列)是必须进行的操作!这关系到下文设置删除提示的操作!

    ②给删除功能添加确认删除提示

    为避免用户误删记录,必须给删除功能添加对应的确认提示

    点击右下角的【源】,在模板列的后台代码(即绿色框起来的部分,如果没有绿框内的代码,说明你为进行上文将【CommandField】列设置为TemplateField(模板列)的操作)中找到如下图红色下划线所在行的删除按钮后台代码,添加如红色下划线所示的代码在【Text="删除"】的后面

    OnClientClick="return confirm('真的要删除吗?')"

    (六)配置DropDownList

    (1)DropDownList数据源配置

    为货品号这个字段的下拉式菜单添加一个新的数据源,流程和前面配置数据源时基本一致

    到【配置Select语句】这个窗口时注意切换成货品表

    自定义语句只需要一条查询语句,此处的查询语句读者根据自己的管理系统来决定想要查询的内容

    此处采用一种“货品号和货品名绑定显示”的查询机制,因此使用了如下这条SQL语句

    select hno, concat(hno, hname) as hpm from hpb

    (2)功能预览

    (七)为控件录入脚本以实现功能

    (零)补充两个控件

    需要为货品号和入库时间添加一组(两个)【CheckBox】控件,以实现选中其中一个字段,就按该字段进行条件查询,不勾选,就进行无条件查询,如下图

    控件所在位置如下

    在需要勾选的字段之后添加这个控件

    此时觉得它的名字有点碍眼,分别去它们的属性中找到【Text】,输入一个空格

    这样只有选择框了,顺眼很多!

    (一)所有控件脚本

    (已经是第三篇了,不知道读者有没有注意到,同一个.aspx文件中的所有控件的脚本是放在同一个.cs文件中的)

    打开【rkgl.aspx.cs】文件,将下面的代码复制到该文件中,即可实现所有控件的功能,实现思路见代码注释!

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.UI;
    6. using System.Web.UI.WebControls;
    7. using System.Data.Odbc; //ODBC命名空间
    8. namespace ckgl.admin.crkgl
    9. {
    10. public partial class rkgl : System.Web.UI.Page
    11. {
    12. protected void Page_Load(object sender, EventArgs e)
    13. {
    14. TextBox2.Text = "100001";//测试用,从入库管理脚本运行后直接录入这个管理员号
    15. }
    16. //TextBox3(入库数量)和TextBox4(入库单价)都不为空,就根据它们的内容刷新TextBox5(入库总价)的内容
    17. protected void TextBox3_TextChanged(object sender, EventArgs e)
    18. {
    19. if (TextBox3.Text != "" & TextBox4.Text != "")
    20. {
    21. TextBox5.Text = (Convert.ToInt32(TextBox3.Text) * Convert.ToInt32(TextBox4.Text)).ToString();
    22. }
    23. }
    24. protected void TextBox4_TextChanged(object sender, EventArgs e)
    25. {
    26. if (TextBox3.Text != "" & TextBox4.Text != "")
    27. {
    28. TextBox5.Text = (Convert.ToInt32(TextBox3.Text) * Convert.ToInt32(TextBox4.Text)).ToString();
    29. }
    30. }
    31. protected void Button1_Click(object sender, EventArgs e)
    32. {
    33. //录入按钮被点击时,对数据进行合法性检测
    34. if (TextBox3.Text == "")
    35. {
    36. Response.Write("");
    37. return;
    38. }
    39. if (TextBox4.Text == "")
    40. {
    41. Response.Write("");
    42. return;
    43. }
    44. if (TextBox6.Text == "")
    45. {
    46. Response.Write("");
    47. return;
    48. }
    49. //根据本地时间(年月日时分秒,建议精确到秒,这样做才会因为输入的先后单号,不会出现相同的单号)自动生成一个入库单号
    50. TextBox1.Text = DateTime.Now.Year.ToString(); //取日期年
    51. TextBox1.Text += DateTime.Now.Month.ToString();
    52. TextBox1.Text += DateTime.Now.Day.ToString();
    53. TextBox1.Text += DateTime.Now.Hour.ToString();
    54. TextBox1.Text += DateTime.Now.Minute.ToString();
    55. TextBox1.Text += DateTime.Now.Second.ToString();
    56. //链接数据库,执行SQL语句
    57. OdbcConnection con = DB.Lianjie();
    58. con.Open();
    59. string sql1 = " insert into rkb values('" + TextBox1.Text + "','" + TextBox2.Text + "','" + DropDownList1.Text + "',";
    60. sql1 += " " + TextBox3.Text + "," + TextBox4.Text + "," + TextBox5.Text + ",'" + TextBox6.Text + "') ";
    61. OdbcCommand mycommand1 = new OdbcCommand(sql1, con);
    62. mycommand1.ExecuteNonQuery();
    63. Response.Write("");//成功执行即成功录入,给出提示
    64. //入库成功后,使用查询语句获取本地数据库新的记录(按入库时间排序)
    65. string sql2 = "select * from rkb order by rk_date desc";
    66. OdbcCommand mycommand2 = new OdbcCommand(sql2, con);
    67. OdbcDataReader sdr = mycommand2.ExecuteReader();
    68. if (sdr.Read())
    69. {
    70. SqlDataSource1.SelectCommand = sql2;//将查询到的新记录显示
    71. GridView1.DataBind();
    72. }
    73. con.Close();
    74. }
    75. protected void Button2_Click(object sender, EventArgs e)
    76. {
    77. //根据勾选的字段来决定查询结果
    78. OdbcConnection con = DB.Lianjie();
    79. con.Open();
    80. string sql = " select * from rkb where ";
    81. if (CheckBox1.Checked == true)
    82. sql += " hno='" + DropDownList1.Text + "' and ";
    83. if (CheckBox2.Checked == true)
    84. sql += " rk_date='" + TextBox6.Text + "' and ";
    85. sql += " '1'='1' ";//用于吞掉末尾的原sql语句的and关键字
    86. OdbcCommand mycommand = new OdbcCommand(sql, con);
    87. OdbcDataReader sdr = mycommand.ExecuteReader();
    88. if (sdr.Read())
    89. {
    90. SqlDataSource1.SelectCommand = sql;
    91. GridView1.DataBind();
    92. }
    93. else
    94. {
    95. Response.Write("");
    96. return;
    97. }
    98. con.Close();
    99. }
    100. protected void Button3_Click(object sender, EventArgs e)
    101. {
    102. //将可输入的字段置空,就是重置了
    103. TextBox3.Text = "";
    104. TextBox4.Text = "";
    105. TextBox6.Text = "";
    106. }
    107. }
    108. }


    三,设计出库界面

    出库界面的设计和入库界面基本雷同了,碍于篇幅和蒟蒻博主的精力,接下来就不详细说明了,但只要你弄明白了入库界面,出库界面一定不在话下!

    (一)添加设计工作台

    (二)插入与调整表格

    依旧是固定列数3,行数=入库表中的字段数+2,下图是用于参考的出库表

    (三)对表格进行自己喜欢的修饰并并添加相关提示信息

    (四)添加控件并配置控件

    (1)添加控件

    控件总览图——

    控件清单——

    6个TextBox:出库单号、管理员号、出库数量、销售单价、销售总价、出库日期

    1个DropDownList:货品号

    2个CheckBox:货品号、出库日期

    1个GridView:置于表格右方

    1个Label:置于出库数量后方

    (Label标签的作用是将来通过脚本自动显示剩余的库存,以提示用户不要超库存出库)

    (2)控件配置

    (未说明的保留默认设置)

    出库单号之后的TextBox1、管理员号之后的TextBox2、销售单价之后的TextBox4、销售总价之后的TextBox5

    出库日期之后的TextBox6

    货品号、出库日期之后的CheckBox1、CheckBox2

    (Text属性中输入一个空格)

    出库数量之后的Label

    (不需要空格,删除默认文本即可)

    (改颜色增加区分度)

    货品号之后的DropDownList1、出库数量之后的TextBox3

    (这个属性的目的是一旦控件的文本被修改就自动响应脚本,使出库数量之后的Label能够实时显示出剩余库存)

    对货品号之后的DropDownList以及表格右方的GridView进行数据源配置,在设计入库界面时已经详细讲解过!

    1,GridView配置注意点

    自定义SQL语句

    编辑列,将删除转换为模板列

    在【】中添加删除确认代码

    OnClientClick="return confirm('真的要删除吗?')"

    2,DropDownList配置注意点

    自定义SQL语句

    显示数据字段设置

    (五)为控件录入脚本以实现功能

    打开【ckgl.aspx.cs】文件,将下面的代码复制到该文件中,即可实现所有控件的功能,实现思路见代码注释!

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.UI;
    6. using System.Web.UI.WebControls;
    7. using System.Data.Odbc; //ODBC命名空间
    8. using System.Collections.Specialized;
    9. namespace ckgl.admin.crkgl
    10. {
    11. public partial class ckgl : System.Web.UI.Page
    12. {
    13. protected void Page_Load(object sender, EventArgs e)
    14. {
    15. TextBox2.Text = "100001";//测试用,从入库管理脚本运行后直接录入这个管理员号
    16. }
    17. protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    18. {
    19. OdbcConnection con = DB.Lianjie();
    20. con.Open();
    21. //一大段代码用来计算入库数量和出库数量,库存 = 入库数量 - 出库数量
    22. string sql1 = " select IFNULL(price,0) as xsj from hpb where hno='" + DropDownList1.Text + "'"; //查货品销售价
    23. string sql2 = " select IFNULL(sum(rk_num),0) as rksl from rkb where hno='" + DropDownList1.Text + "'"; //查入库数量 "
    24. string sql3 = " select IFNULL(sum(ck_num),0) as cksl from ckb where hno='" + DropDownList1.Text + "'"; //查出库数量 "
    25. OdbcCommand mycommand1 = new OdbcCommand(sql1, con);
    26. OdbcCommand mycommand2 = new OdbcCommand(sql2, con);
    27. OdbcCommand mycommand3 = new OdbcCommand(sql3, con);
    28. OdbcDataReader sdr1 = mycommand1.ExecuteReader();
    29. OdbcDataReader sdr2 = mycommand2.ExecuteReader();
    30. OdbcDataReader sdr3 = mycommand3.ExecuteReader();
    31. if (sdr1.Read())
    32. TextBox4.Text = sdr1["xsj"].ToString();
    33. int rksl = 0, cksl = 0, kcsl;
    34. if (sdr2.Read())
    35. rksl = Convert.ToInt32(sdr2["rksl"]);
    36. if (sdr3.Read())
    37. cksl = Convert.ToInt32(sdr3["cksl"]);
    38. kcsl = rksl - cksl;
    39. Label1.Text = kcsl.ToString();//将剩余库存用Label显示出来
    40. }
    41. protected void TextBox3_TextChanged(object sender, EventArgs e)
    42. {
    43. if (Label1.Text != "" && (Int32.Parse(TextBox3.Text) > Int32.Parse(Label1.Text)))//检测剩余库存是否满足出库数量
    44. {
    45. Response.Write("");
    46. return;
    47. }
    48. if (TextBox3.Text != "" & TextBox4.Text != "")
    49. {
    50. TextBox5.Text = (Convert.ToInt32(TextBox3.Text) * Convert.ToInt32(TextBox4.Text)).ToString();
    51. }
    52. }
    53. protected void Button1_Click(object sender, EventArgs e)//入库
    54. {
    55. if (TextBox3.Text == "")
    56. {
    57. Response.Write("");
    58. return;
    59. }
    60. if (TextBox6.Text == "")
    61. {
    62. Response.Write("");
    63. return;
    64. }
    65. TextBox1.Text = DateTime.Now.Year.ToString(); //取日期年
    66. TextBox1.Text += DateTime.Now.Month.ToString();
    67. TextBox1.Text += DateTime.Now.Day.ToString();
    68. TextBox1.Text += DateTime.Now.Hour.ToString();
    69. TextBox1.Text += DateTime.Now.Minute.ToString();
    70. TextBox1.Text += DateTime.Now.Second.ToString();
    71. OdbcConnection con = DB.Lianjie();
    72. con.Open();
    73. string sql1 = "insert into ckb values('" + TextBox1.Text + "','" + DropDownList1.Text + "',";
    74. sql1 += "'" + TextBox2.Text + "'," + TextBox3.Text + "," + TextBox4.Text + "," + TextBox5.Text + ",'" + TextBox6.Text + "')";
    75. OdbcCommand mycommand1 = new OdbcCommand(sql1, con);
    76. mycommand1.ExecuteNonQuery();
    77. Response.Write("");
    78. string sql2 = "select * from ckb order by ck_date desc";
    79. OdbcCommand mycommand2 = new OdbcCommand(sql2, con);
    80. OdbcDataReader sdr = mycommand2.ExecuteReader();
    81. if (sdr.Read())
    82. {
    83. SqlDataSource1.SelectCommand = sql2;
    84. GridView1.DataBind();
    85. }
    86. con.Close();
    87. }
    88. protected void Button2_Click(object sender, EventArgs e)//查询
    89. {
    90. OdbcConnection con = DB.Lianjie();
    91. con.Open();
    92. string sql = "select * from ckb where ";
    93. if (CheckBox1.Checked == true)//按货品号查询
    94. sql += " hno='" + DropDownList1.Text + "' and ";
    95. if (CheckBox2.Checked == true)//按出库日期查询
    96. sql += " ck_date='" + TextBox6.Text + "' and ";
    97. sql += " '1'='1'";//吞掉一个and保证sql语法正确
    98. OdbcCommand mycommand = new OdbcCommand(sql, con);
    99. OdbcDataReader sdr = mycommand.ExecuteReader();
    100. if (sdr.Read())
    101. {
    102. SqlDataSource1.SelectCommand = sql;
    103. GridView1.DataBind();
    104. }
    105. else
    106. {
    107. Response.Write("");
    108. return;
    109. }
    110. con.Close();
    111. }
    112. protected void Button3_Click(object sender, EventArgs e)
    113. {
    114. TextBox3.Text = "";//将相关控件置空和false即重置
    115. TextBox6.Text = "";
    116. CheckBox1.Checked = false;
    117. CheckBox2.Checked = false;
    118. }
    119. }
    120. }


    四,添加菜单

    在母版页【Site.Master】中添加相应的出入库菜单

    修改对应的【NavigateUrl】属性,链接到对应的出入库界面

  • 相关阅读:
    数据密集型应用存储与检索设计
    电脑入门:电脑不认新硬盘时该怎么办?
    Linux
    CATT的应用
    Android 设置默认应用
    关于java字符串拼接处理方法的总结
    为什么说制造企业需要部署MES管理系统
    50-51 - C++对象模型分析
    最「难搞」的英伟达也开源了,下一个会是谁?
    考研数学05-12年真题总结
  • 原文地址:https://blog.csdn.net/liKeQing1027520/article/details/139219386