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

前言

紧接上篇->基于C#开发web网页管理系统模板流程-登录界面和主界面_c#的网页编程-CSDN博客

已经完成了登录界面和主界面,本篇将完善主界面的管理员录入和编辑功能,事实上管理员录入和编辑的设计套路适用于所有静态表的录入和编辑

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

(一)管理员-录入

点击菜单中的管理员-录入,网页给出输入信息的界面,用户输入完信息后判断其合法性

如果不合法提示重新输入,合法则保留信息到本地数据库

(二)管理员--编辑


一,新建gly文件夹

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


二,设计管理员-录入界面

(注:部分操作与上一篇的基本雷同,因此省去不必要的图片操作,自行根据文字提示完成操作)

(一)添加设计工作台

在gly文件下【右键】->【添加新建项】创建一个【包含母版页的Web窗体】,将其命名为glyadd.aspx

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

(二)插入与调整表格

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

顶部点击【表】->插入表格

重点!该表格的列数为2,行数=你数据库中管理员表的字段数+2

例如:我的管理员表有6个字段,因此设置该表为8(6+2)行

(三)修改表格背景色

这一步在上一篇的标题【三.(一).(3)】已经详细讲过,要重点注意的问题还是表格的选中问题(要点一下表头才能全选表格,而不是只选中表格中的4行,两者是有区别的!如果全选表格的话表的边框会加粗、而且右边的属性栏会有【TABLE】的标签而不是【TD】之类的标签,如果不正确的全选表格,对表格的一些整体操作会只作用于部分单元格从而导致最终显示结果乱版)

确认全选表格后,右边下滑找到【style】属性(如果右边没有属性窗口,对表格右键可以找到),点击该属性右边的三个小点,会弹出修改样式窗口,点击【背景】,在【background-color】中选择想要的背景色,点击确定,表格颜色成功修改

(四)添加提示用户输入的信息

本步操作就是美化以下录入界面,给用户提示在哪里输入信息,合并单元格、居中、放大字体、加粗字体等操作不再赘述,顺便调整一下表格的大小

读者在设计时应符合自己对用户的预期输入,并贴合数据库中字段需要录入的数据

 (五)添加控件

给表格右边添加相应的文本框等录入控件,这样才能接收用户的输入

我们需要用到如下图红框中的这三个控件

(工具箱点左边的【工具箱】按钮展开)

这里我添加了5个【TextBox】、2个【RadioButton】、2个【Button】等控件,读者请根据实际需要添加合适的控件

(1)性别单选按钮

这里重点解释一下【RadioButton】的作用,因为需要录入性别信息,性别只有两种选择,【RadioButton】则能实现这一操作

点击控件后在属性栏中的【Text】修改他们的名字分别为男、女,再将这两个按钮的属性中的【GroupName】修改为同一名字,确保两个按钮在同一分组(这样才能实现非男即女的按钮单选)

(2)日历输入生日

然后再解释一下怎么设计成以日历的形式让用户快速输入日期信息

单击输入日期的文本框控件,在属性中找到【TextMode】属性,修改为【Date】,如果你需要用户的输入精确到时分秒,也可以修改为【DateTime

(3)两个按钮改名

改一下两个【Button】控件的名字,方便用户明白它们的功能,也是在属性栏中的【Text】修改

(4)为录入按钮和重置按钮添加脚本以实现其功能

双击录入按钮,将下面的脚本复制到弹出的文件【glyadd.aspx.cs】中并【Ctrl+S】快捷键保存,脚本的功能已经在注释中做出了详细解释,请仔细查看!

(注:这整个脚本包含录入和重置这两个按钮的脚本)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Odbc;   //ODBC命名空间namespace ckgl.admin.gly
{public partial class glyadd : System.Web.UI.Page{protected void Button1_Click(object sender, EventArgs e)//录入按钮脚本{//根据你实际的设计进行对应的输入内容合法判断if (TextBox1.Text == "" || TextBox2.Text == ""){Response.Write("<script language=javascript> alert('管理员编号或密码不得为空!');</script>");return;}if (TextBox3.Text == ""){Response.Write("<script language=javascript> alert('管理员姓名不得为空!');</script>");return;}if (RadioButton1.Checked == false && RadioButton2.Checked == false){Response.Write("<script language=javascript> alert('请选择管理员性别!');</script>");return;}if (TextBox4.Text == "" || TextBox5.Text == ""){Response.Write("<script language=javascript> alert('管理员生日或电话不得为空!');</script>");return;}if (TextBox1.Text.Length != 6){Response.Write("<script language=javascript> alert('管理员编号为六位长度!');</script>");return;}//创建连接对象、打开数据库OdbcConnection con = DB.Lianjie();con.Open();//编写sql语句,查询重复的管理员编号string sql1 = " select * from glyb where gno='" + TextBox1.Text + "' ";OdbcCommand mycommand1 = new OdbcCommand(sql1, con);OdbcDataReader sdr = mycommand1.ExecuteReader();if (sdr.Read())//如果有重复,给出提示信息{Response.Write("<script language=javascript> alert('管理员编号已存在,请更换!');</script>");return;}//管理员录入,对于性别信息需要特殊处理成男、女文本string xb = "";if (RadioButton1.Checked == true)xb = "男";if (RadioButton2.Checked == true)xb = "女";string sql2 = " insert into glyb values('" + TextBox1.Text + "', '" + TextBox2.Text + "' , '" + TextBox3.Text + "','" + xb + "', ";sql2 += " '" + TextBox4.Text + "','" + TextBox5.Text + "') ";OdbcCommand mycommand2 = new OdbcCommand(sql2, con);// Response.Write(sql2);//调试用,正常不用这两行// return;mycommand2.ExecuteNonQuery();   //用于录入,修改,删除时Response.Write("<script language=javascript> alert('录入成功!');</script>");con.Close();  //关闭数据库}protected void Button2_Click(object sender, EventArgs e)//重置按钮脚本{//重置的思想很简单,直接把所有文本框置为空字符串,所有选择按钮置为false(即未选状态)//我这里有5个文本框,依次置空TextBox1.Text = TextBox2.Text = TextBox3.Text = TextBox4.Text = TextBox5.Text = "";//两个选择性别的按钮,置为falseRadioButton1.Checked = RadioButton2.Checked = false;}}
}


三,设计管理员-编辑界面

(一)添加设计工作台

在gly文件下【右键】->【添加新建项】创建一个【包含母版页的Web窗体】,将其命名为glyedit.aspx

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

(二)插入与调整表格

管理员编辑界面的表格的列数固定为3,行数需要根据你自己管理系统需要查询的字段数来决定,行数=你需要查询的字段数+2

例如:在我的管理员表中,我需要查询的字段只有编号、姓名、电话这三个(其它字段基本没有查询的必要,密码不能展示给其它用户、性别要么查男要么查女,查出来很多记录没有意义,生日也属于隐私没必要查,总之根据你自己需要用户能够查询到的字段来设计即可)

因此设置该表为5(3+2)行

(三)修改表格背景色

(四)添加提示用户输入的信息

(五)添加控件

以上这四块内容基本是重复的套路操作,因此省去大量篇幅(如果忘了操作则重看本篇标题【】的(2)(3)(4)(5),都是一样的套路),自由发挥设计即可,参考下图

完成以上操作之后,我们还要在上图绿框部分的大单元格处添加一个用于显示数据的控件,点击选中它之后,在【工具箱】->【数据】中找到【GridView】,双击后添加

(六)配置odbc数据源

本步操作用于管理系统能够连接到数据源从而显示查询结果,已经在上一篇(基于C#开发web网页管理系统模板流程-登录界面和主界面-CSDN博客)的标题【一.(三).(2)】处做过详细演示,如果你还没建立odbc数据源连接,请自行跳转查看教程

按下图操作,点击【<新建数据源>

按如下图操作创建数据源

点完确定后回到这个窗口,点【下一步】,下一个窗口(这个窗口的截图我省略了)再点下一步

配置Select语句,在这里选择你数据库中的管理员表

注:如果在本步操作你无法选择【指定来自表或视图的列】这个选项,从而导致你无法选择你的管理员表,错误原因在于你创建的odbc数据源未指定你的数据库),即下图绿框部分中红字特地强调的内容你没有做,此时你必须重新创建数据源

严格按照 上一篇(基于C#开发web网页管理系统模板流程-登录界面和主界面-CSDN博客)的标题【一.(三).(2)】所说的做,且新的数据源不能和原来错误的数据源同名(除非你删除原来错误的数据源,但如果你是5.1版本的odbc可能会发现删除不了,如果你想删除参考本篇->odbc用户dsn点删除点配置没反应个人解决经验-CSDN博客)

然后选【指定自定义SQL语句或存储过程(S)】再点下一步

接下来我们要创建SELECT、UPDATE、DELETE这三部分的SQL语句

SELECT的SQL语句就是【select * from 管理员表名】这样的形式

UPDATE的SQL语句是【update 管理员表名 set 字段1=? ,字段2=?,字段3=?,... where 管理员编号字段=?】的形式

DELETE的SQL语句是【delete from 管理员表名 where 管理员编号字段=?

你需要确认自己管理员表名及其中的字段来对这3条语句进行适当修改,很简单的(但要求你仔细确认字段名是否正确,否则会导致后续的查询bug),你看看就知道了,参考下图

做完三条SQL编写的工作后,继续点下一步,在这个【测试查询】的窗口中也可以点测试查询(T)验证一下SELECT语句(其它更新、删除语句无法在此处验证),确认无误后点完成(实在后期遇到bug也没多大关系,可以修改配置的)

此时可以发现管理员表中的字段已经被绑定到控件中了

(七)设计编辑和删除功能

展开控件菜单,将【启用分页】、【启用编辑】、【启用删除】勾选上,此时可能需要你调整一下表格大小以适应这些内容

(1)设置分页

选中GridView控件后在属性栏中的【PageSize】处可以修改每页显示的记录数,可以根据自己设计需求进行设置

(2)将编辑、删除功能置于查询结果后方

一般来说习惯将编辑、删除功能置于查询结果后方,当然这也根据你自己喜好去设置

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

(3)编辑和删除功能测试

在编辑界面直接运行,我们来测试一下编辑和删除功能,这一步可能产生的bug会非常多,博主也是被硬控了一天半多的时间

运行来到编辑界面,这里我随便准备了4条数据

点击第四条数据的删除,成功删除

点击第一条的编辑功能,修改其gname的值

点更新,成功修改

读者需要确保自己的编辑和删除功能能够实现上文所描述的,如果无法实现,提供以下可能的处理措施——

①检查自己在本篇标题【三.(6)】编写的三条SQL语句是否正确(语法、字段名、关键字之间是否空格隔开等)

②点击删除功能时弹出如下错误

解决方法是:再点开配置数据源,在【配置Select语句】的窗口选择【高级】,将【使用开放式开发(O)】这个选项勾选,最后点确定

(注:最好再去检查一下那三条自定义SQL语句是否错误,有可能会被系统修改成默认值,需要你手动再改回来)

③点击编辑功能,修改值后点更新,但是数据没有被修改

解决方法是:点击【编辑列】,确认你的【管理员编号】(这里我是gno)字段的属性【ReadOnly】是否为True,因为前文已经说过这个字段是不能被更改的,所以要设置为只可读

(补充必看)(4)给删除功能添加确认删除提示

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

点击右下角的【】,在模板列的后台代码(即绿色框起来的部分,如果没有绿框内的代码,说明你为进行本篇标题【三.(7).2】处内容的操作)中找到如下图红色下划线所在行的删除按钮后台代码,添加如红色下划线所示的代码在【Text="删除"】的后面

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

测试功能:

做完修改后注意保存,运行后来到管理员编辑界面,对任意一条记录进行删除操作,出现如下确认删除的提示,证明功能无误

 (5)为录入按钮和重置按钮添加脚本以实现其功能

双击录入按钮,将下面的脚本复制到弹出的文件【glyedit.aspx.cs】中并【Ctrl+S】快捷键保存,脚本的功能已经在注释中做出了详细解释,请仔细查看!

(注:这整个脚本包含录入和重置这两个按钮的脚本)

using System;
using System.Collections.Generic;
using System.Data.Odbc;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace ckgl.admin.gly
{public partial class glyedit : System.Web.UI.Page{protected void Button1_Click(object sender, EventArgs e){OdbcConnection con = DB.Lianjie();con.Open();string sql = " select * from glyb where ";if (TextBox1.Text != "")sql += " gno='" + TextBox1.Text + "' and ";if (TextBox2.Text != "")sql += " gname='" + TextBox2.Text + "' and ";if (TextBox3.Text != "")sql += " gtele='" + TextBox3.Text + "' and ";sql += " '1'='1' "; //复合查询关口语句,这样的设计代码的思路是:如果三个文本框都为空,即用户未输入任何匹配信息,那么查询结果就是所有记录OdbcCommand mycommand1 = new OdbcCommand(sql, con);OdbcDataReader sdr = mycommand1.ExecuteReader();if (sdr.Read()){SqlDataSource1.SelectCommand = sql;GridView1.DataBind();   //刷新查询窗口,刷新才能显示查询结果}else{Response.Write("<script language=javascript> alert('查无此人!');</script>");return;}con.Close();}protected void Button2_Click(object sender, EventArgs e){//重置的思想很简单,直接把所有文本框置为空字符串//我这里有3个文本框,依次置空TextBox1.Text = TextBox2.Text = TextBox3.Text = "";}}
}


四,添加菜单

我们先找到上一篇的标题【三.(二).(4)】处(如下图)创立的主菜单(即母版页Site1.Master),当时我们只是草率的创立了几个新节点,出了【退出】这个选项的功能,其它菜单还没有完善

在项目中找到之前创建在admin文件夹下的Site.Master这个母版页

右键点击这个菜单栏->【编辑节点】,给它的子节点命名成几个有意义的菜单选项名,比如本篇我们是实现管理员的录入和编辑功能,因此将第一个节点命名成【管理员】,然后给该节点添加两个子节点,分别命名为【录入】和【编辑】,两个平行关系子节点的创建不好描述,但你试试就知道很简单的

但是仅是修改它的文本可做不到对应的跳转到录入页面的功能,我们需要实现的功能是点击录入后就跳转到录入页面,需要做的是修改【NavigateUrl】的值

同理,点击编辑就跳转到编辑页面,也是修改【NavigateUrl】的值

菜单效果效果如下,至于其它节点的名称和关系,则根据读者自己的管理系统来进行设计


五,测试

建议从登录窗口开始完整测试一遍,这里为了节省篇幅就直接从管理员功能的界面开始测试

(一)录入界面功能测试

(1)空输入拦截测试

读者自行测试所有信息的空输入拦截

(2)管理员编号长度合法性测试

因为前面的脚本有规定管理员的编号长度固定为6,因此此处进行测试

(3)重置输入测试

点击重置,应该把输入的信息清空


(二)编辑界面功能测试

(1)查询测试

匹配信息全为空时,查询结果为所有记录

编号匹配测试

姓名匹配测试

电话匹配测试

无记录查询测试

(2)重置输入测试

(3)编辑与删除测试

先故意录入一条测试用的记录

删除记录测试

编辑记录测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红外成像人员检测数据集VOC+YOLO格式5838张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5838 标注数量(xml文件个数)&#xff1a;5838 标注数量(txt文件个数)&#xff1a;5838 标注…

数据大屏vue3+ts+axios+MockJS+dataV+echarts

一、官网/文档 vue3&#xff1a;https://cn.vuejs.org/api/TypeScript&#xff1a;https://www.tslang.cn/docs/handbook/basic-types.htmlaxios&#xff1a;http://www.axios-js.com/zh-cn/docs/MockJS&#xff1a;http://mockjs.com/dataV&#xff1a;http://datav.jiamingh…

失落的方舟台服注册接收不到验证码 注册怎么验证手机号教程

《失落的方舟》&#xff08;Lost Ark&#xff09;是一款引人入胜的大型多人在线角色扮演游戏&#xff08;MMORPG&#xff09;&#xff0c;由韩国知名游戏开发商Smilegate精心打造。这款游戏凭借其绚丽的视觉效果、错综复杂的故事情节、媲美动作游戏的战斗机制以及无边无际的探索…

Golang | Leetcode Golang题解之第104题二叉树的最大深度

题目&#xff1a; 题解&#xff1a; func maxDepth(root *TreeNode) int {if root nil {return 0}queue : []*TreeNode{}queue append(queue, root)ans : 0for len(queue) > 0 {sz : len(queue)for sz > 0 {node : queue[0]queue queue[1:]if node.Left ! nil {queue…

Android JetPack ViewModel

一、什么是ViewModel&#xff1f; Android ViewModel在我们使用MVVM开发模式时会经常用到&#xff0c;对我来说就是好用&#xff0c;好维护。 它相对于MVC模式&#xff0c; 一来可以减少Activity层的代码&#xff0c;可以把一些业务逻辑和对数据的交互到ViewModel层去&#…

代码随想录算法训练营第五十三天||1143.最长公共子序列、1035.不相交的线、53. 最大子序和

文章目录 一、1143.最长公共子序列 思路 二、1035.不相交的线 思路 三.53. 最大子序和 思路 一、1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原…

最小生成树【做题记录】c++(Prim,Kruskal)

目录 Prim算法求最小生成树 【算法思想】 【算法实现】 【数据结构设计】 【算法步骤】 【输入输出】 【代码示例】 Kruskal算法求最小生成树 【算法思想】 判断是否会产生回路的方法 【算法描述】 【图的存储结构】 【输入输出】 【代码示例】 Prim算法求最小生…

AirBnb架构简史

2007 年&#xff0c;布莱恩切斯基 (Brian Chesky) 和乔加比亚 (Joe Gabbia) 搬到了旧金山。他们一边想为自己的创业想法筹集资金&#xff0c;一边又需要支付房租。 碰巧的是&#xff0c;当时城里正要举行一个设计会议&#xff0c;这意味着很多设计师都会寻找住处。他们想出了在…

Java 五种内部类演示及底层原理详解

内部类 什么是内部类 在A类的内部定义B类&#xff0c;B类就被称为内部类 发动机类单独存在没有意义 发动机为独立个体 可以在外部其他类里创建内部类的对象去调用方法 类的五大成员 属性 方法 构造方法 代码块 内部类 内部类的访问特点 内部类可以直接访问外部类的成员&a…

AI手语研究数据集;视频转视频翻译和风格化功能如黏土动画;AI检测猫咪行为;开放源码的AI驱动搜索引擎Perplexica

✨ 1: Prompt2Sign 多语言手语数据集&#xff0c;便捷高效用于手语研究。 Prompt2Sign 是一个全面的多语言手语数据集&#xff0c;旨在通过工具自动获取和处理网络上的手语视频。该数据集具有高效、轻量的特点&#xff0c;旨在减少先前手语数据集的不足之处。该数据集目前包含…

AI架构设计7:TGI

这个专栏主要关注围绕着AI运用于实际的业务场景所需的系统架构设计。整体基于云原生技术&#xff0c;结合开源领域的LLMOps或者MLOps技术&#xff0c;充分运用低代码构建高性能、高效率和敏捷响应的AI中台。该专栏需要具备一定的计算机基础。 若在某个环节出现卡点&#xff0c;…

员工管理和激励怎么做?试试场景化激励解决方案!

截止到2020年底&#xff0c;中国企业主体数量达3858.3万&#xff0c;同比增速达11.1%。如何留住人才、激励人才以强化人才与企业“黏性”&#xff0c;最大化提升员工的忠诚度与敬业度&#xff0c;成为企业未来人才发展战略的主要方向之一。 一、传统激励方式存在哪些不足 传统的…

香橙派 AIpro初体验

香橙派&#xff08;Orange Pi&#xff09;AI Pro开发板是一款高性能的AI开发板&#xff0c;由香橙派联合华为精心打造。香橙派&#xff08;Orange Pi&#xff09;&#xff0c;作为深圳市迅龙软件有限公司倾力打造的开源产品品牌&#xff0c;致力于向全球个人及企业用户提供卓越…

设计软件有哪些?建模和造型工具篇(3),渲染100邀请码1a12

这次我们接着介绍建模工具。 1、FloorGenerator FloorGenerator是由CG-Source开发的3ds Max插件&#xff0c;用于快速创建各种类型的地板和瓷砖。该插件提供了丰富的地板样式和布局选项&#xff0c;用户可以根据需要轻松创建木质地板、石板地板、砖瓦地板等不同风格的地面。F…

人生二选一:央企就业?美国做博士后?—请看她的抉择

一位30岁的女博士&#xff0c;收到国内央企和德国、美国的博士后邀请函&#xff0c;她该如何选择&#xff1f;知识人网小编推荐这篇文章&#xff0c;为大家解开谜题的同时&#xff0c;也给有同样纠结的学者提供一些启迪。 去年12月底的一个晚上&#xff0c;我收到美国一所高校发…

100个 Unity小游戏系列六 -Unity 抽奖游戏专题四 翻卡游戏

一、演示效果 二、知识点讲解 2.1 布局 void CreateItems(){reward_data_list reward_data_list ?? new List<RewardData>();reward_data_list.Clear();for (int i 0; i < ItemCount; i){GameObject item;if (i 1 < itemParent.childCount){item itemParent…

Python解析网页-requests_html

目录 1、什么是requests_html 2、安装与配置 3、快速入门 4、图片下载 1.什么是requests_html requests_html是一个Python库&#xff0c;用于从Web页面中提取数据。 它提供了对HTML内容的解析和处理功能&#xff0c;使您可以轻松地从网页中提取文本、链接、图像和其他元素。…

嵌入式UI开发-lvgl+wsl2+vscode系列:4、动画(Animations)

文章目录 一、前言二、动画示例1、示例1&#xff08;基础按钮label的组合动画&#xff09;2、示例2&#xff08;回放效果动画&#xff09;3、示例3&#xff08;贝塞尔曲线3动画&#xff09;4、示例4&#xff08;动画时间轴&#xff09; 三、最后 一、前言 接下来我们进行动画的…

Golang | Leetcode Golang题解之第101题对称二叉树

题目&#xff1a; 题解&#xff1a; func isSymmetric(root *TreeNode) bool {u, v : root, rootq : []*TreeNode{}q append(q, u)q append(q, v)for len(q) > 0 {u, v q[0], q[1]q q[2:]if u nil && v nil {continue}if u nil || v nil {return false}if …

JWT使用方法

目录 基础概念 依赖 生成令牌 工具类 控制层 解析令牌 工具类 网关过滤器 效果 基础概念 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准&#xff08;(RFC 7519).该token被设计为紧凑且安全的&#xff0c;特别适用于分布式站点…