6/29 原型编码阶段:(2) GridView的数据库操作
如果我们在页面内设置了DataSource控件如:SqlDataSource,AccessDataSource,ObjectDataSource,XMLDataSource或者SiteMapDataSource,那么就可以用DataSourceID来指定,并且内置了绑定,分页,排序,更新,删除等操作,一行代码都不用写。
如果我们用ADO.NET编写代码,便是绑定的DataSource,所以要明确声明GridView.DataBind(),而且所有的分页,排序,更新,删除代码都需要自己手工写。
由于列表表格的列标题直接来自于字段名,是英文的,因此首先 我们把他们改成中文名:
DataSourceID="SqlDataSource1">
<Columns>
<asp:BoundField DataField="ClerkID" HeaderText="员工编号" InsertVisible="False" ReadOnly="True"
SortExpression="ClerkID" />
<asp:BoundField DataField="RealName" HeaderText="员工姓名" SortExpression="RealName" />
<asp:BoundField DataField="JobNum" HeaderText="工号" SortExpression="JobNum" />
<asp:BoundField DataField="DeptID" HeaderText="部门编号" SortExpression="DeptID" />
</Columns>
</asp:GridView>
中文列名可以直接在源中修改,也可以用gridview控件的编辑列功能设置选定的字段以及每个字段的显示标题。
在这里提一下数值格式化字符串,比如我们的员工显示规则是4位 000x ,而数据库中存放的是 1,2,3那么就应该修改这一项的格式化字串,见红色代码(注意要将HtmlEncode设成"False",格式化输出才有效,但是HtmlEncode设成True可以防止字段中可能有的HTML标签和js脚本生效,避免执行恶意代码),为了让输出表格更好看,我选择了自动套用格式“雨天”,以下的蓝色代码就是系统自动修改的部分。
BorderStyle="None" BorderWidth="1px" CellPadding="3" DataSourceID="SqlDataSource1" AutoGenerateColumns="False" Font-Size="10pt">
<FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
<RowStyle BackColor="#EEEEEE" ForeColor="Black" />
<SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
<HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="Gainsboro" />
<Columns>
<asp:BoundField DataField="ClerkID" HeaderText="员工编号" DataFormatString="{0:000#}" HtmlEncode="False"
InsertVisible="False" ReadOnly="True" SortExpression="ClerkID" />
</Columns>
</asp:GridView>
页面显示结果如下:
员工编号 | 姓名 | 工号 |
---|---|---|
0001 | 陈公客 | 1001 |
0002 | 王公客 | 1002 |
0003 | 张大客 | 3001 |
0004 | 李大客 | 3002 |
我注意到了,如果对非数值型,比如字符型的字段:工号,使用格式化字符串是无效的。
下面我们对GridView添加 新增,修改和删除功能,按如下步骤设置:
确定后,系统会自动更新GridView控件的代码。这时点击智能标签,选中启用编辑,启用删除项。
页面中员工列表就自动带上了编辑和删除功能。但是目前编辑和删除是采用的文字链接的方式,我想先改成按钮方式:
点击GridView智能标签,选择编辑列,选择选定的字段CommandField,将外观属性ButtonType由Link改成Button,同时可以将该Filed移到表格的最后一列。运行效果如下,使用编辑可以立刻编辑对应的记录,按更新得以更新数据库:
员工编号 | 姓名 | 工号 | 部门编号 | |
---|---|---|---|---|
0001 | 陈公客 | 1001 | 1 | |
0002 | 王公客 | 1002 | 1 | |
0003 | 张大客 | 3001 | 3 | |
0004 | 李大客 | 3002 | 3 |
看起来很简单,一切都有系统内置的代码来实现,但是这里面有几个问题:
1.数据库操作冲突,假设A编辑0001号记录,同时B也在编辑,A将工号修改后保存,这时B看到的仍然是原始的记录信息,可能他修改了姓名后也保存。但这是数据库中并非B所期望只修改了姓名。
上面操作截图的第三步:使用开放式并发能够避免这个问题,在上述情况下,B的操作将被取消。因为系统检测到B更新的记录不是最新的,如果B按下更新,那么他的修改将不会进入数据库,并且立刻返回到A修改过的最新员工列表。
2.在系统包办下,所有的数据库操作都没有提示,如果出现更新出错,插入异常,怎么办?
GridView控件提供了很多事件来让我们自定义相应的处理程序。如果想知道更新某条记录是否成功,我们把更新操作返回所影响的行数返回并显示给用户。
单击GridView属性窗口的闪电图标(事件),双击RowUpdated事件行,vs2005创建一个事件处理程序,编写代码如下:
{
if (e.ExceptionHandled)
{
//string exceptionMessage = e.Exception.Message;
}
else
{
//int numRowsChanged = e.AffectedRows;
foreach (DictionaryEntry myDE in e.NewValues)
{
string key = myDE.Key.ToString();
string Val = myDE.Value.ToString();
}
}
//为什么上面的两个变量exceptionMessage,numRowsChanged在下面无法调用?
//比如这样判断 if (numRowsChanged == 0) 就编译出错:当前上下文中不存在名称“numRowsChanged”
//我不太熟悉c#的语法
if (e.AffectedRows == 0)
{
textAffectedRows.Text = "0";
textOpMsg.Text = "Error";
}
else
{
textOpMsg.Text = "OK!";
}
}
同时我们在页面中插入两个textbox控件textAffectedRows,textOpMsg用来显示信息,有了这样一个程序,如果更新成功,
返回信息:
影响行数:
如果冲突导致更新失败,显示:
返回信息:
影响行数:
虽然很简单,但是多了一些自己的代码在里面。接下来我再做一下自定义的按钮和动作。 假设页面中有一个HTML <select size=10></select>的列表标签用来存放所选择的员工姓名,我们首先对GridView增加选中和取消选中按钮,再在页面中放置ListBox控件用来显示所选择的员工列表。
对GridView选择列,增加两个ButtonField,Text和CommandName分别对应 "选中""AddSelect"和"取消选中""CancelSelect"
在页面中对GridView增加红色部分,或者在属性中的双击相应的事件:
DataSourceID="SqlDataSource1" BackColor="White" BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" GridLines="Vertical" OnRowUpdated="GridView1_RowUpdated" OnRowCommand="GridView1_RowCommand">
当点击按钮时,会引发GridView的RowCommand事件,编写代码如下:
{
//取得当前行的索引
int index = Convert.ToInt32(e.CommandArgument);
GridViewRow selectedRow = GridView1.Rows[index];
//取得该行的员工姓名字段
TableCell clerkName = selectedRow.Cells[1];
//判断按下何按钮
switch (e.CommandName)
{
case "AddSelect":
ClerkSelectList.Items.Add(clerkName.Text);
break;
case "CancelSelect":
if (ClerkSelectList.Items.Count > 0)
{
int I = 0;
while (I <= ClerkSelectList.Items.Count - 1)
{
if (ClerkSelectList.Items[I].Text == clerkName.Text)
{
ClerkSelectList.Items.Remove(ClerkSelectList.Items[I]);
break;
}
else
{
I++;
}
}
}
break;
}
}
上述代码中,e.CommandArgument取得按下ButtonField按钮所在的行索引,通过该索引取得实际的GridViewRow,并用GridViewRow.Cell[1]取得字段值。e.Commandname用来区分用户按下了哪个ButtonField按钮,运行结果就不截图了。
如果我们要自定义按钮的显示,比如按钮显示选中-后面跟上员工的名字,可以设置按钮的DataTextField和DataTextFormatString属性:
这样显示的结果就相当个性化了,提示也非常明显:
员工编号 | 姓名 | 工号 | 部门编号 | 按钮字段一 | 按钮字段二 | |
---|---|---|---|---|---|---|
0001 | 陈公客 | 1001 | 1 | |||
0002 | 王公客 | 1002 | 1 | |||
0003 | 张大客 | 3001 | 3 | |||
0004 | 李大客 | 3002 | 3 |
接下来应该学习最有作用的CommandField命令按钮字段了,虽然外观看起来和ButtonField一样,但是CommandField内置了Select,Edit,Update,Delete和Insert的命令。操作数据库得用好他们。
转载于:https://www.cnblogs.com/hulu/archive/2007/06/29/800769.html
6/29 原型编码阶段:(2) GridView的数据库操作相关推荐
- dbeaver 设置编码_DBeaver 一个神奇的数据库操作软件
本文标识 : MQ0002 本文编辑 : 长安月下赏美人儿 编程工具 : MySQL 阅读时长 : 4分钟 背景介绍 系统名称:Windows10 系统类型:64 位操作系统 DBeaver 版本:6 ...
- 软件工程编码阶段_软件工程的编码阶段
软件工程编码阶段 The coding phase in the software engineering paradigm is usually defined after the designin ...
- GridView的常用操作(增删改查)
GridView的常用操作(增删改查) void BindData() { string sql = "select top 10 ID,jobno, ...
- mysql concat 不同字符集_字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8?...
字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8? 如何将整个MySQL数据库字符集转换为UTF-8并将整理转换为UTF-8? 17个解决方案 591 votes 使用utf8 ...
- MySQL查看与修改编码方式(mysql、数据库、表)
mysql默认的编码方式是latin1,通过以下命令查看 show variables like 'char%'; 或者: show variables like 'character%'; mysq ...
- matlab imread 出错 错误使用 fopen 文件名包含未包括在文件系统编码中的字符。 某些操作可能无法按预......
提示错误一 错误使用 imread>parse_inputs (line 450) 文件名或 URL 参数必须为字符向量. 出错 imread (line 322) [filename, fmt ...
- C#操作数据库、打字程序,GridView访问数据库、程序打包本地sqlite数据库文件
这里写自定义目录标题 访问数据库的类 程序打包本地sqlite数据库文件 访问数据库的类 class MyMeans //访问数据库的类--类包含了程序使用的数据和方法声明.类一般包含多个方法.方法定 ...
- 5获取按钮返回值消息_大数据从入门到深入:JavaEE 之 项目实战 项目基础编码阶段(5)...
2.5 学生信息删除 2.5.1 产品经理阶段 操作要求 : 点击页面的删除按钮,弹出删除提示框,确定后删除学生信息和学生的考试成绩; 2.5.2 项目经理阶段 业务分析 : 删除学生信息的时候还要删 ...
- 点击按钮取GridView当前被操作行的数据
在GridView里加一个模版列,里面放一些按钮,然后呢,点击这些按钮的时候,要可以取到GridView当前被点击的行的字段里的内容 一般有两种情况,只需要取一个字段的值,和要取多个字段的值,其实都是 ...
最新文章
- Effective C++ Item 30 inline里里外外
- oracle XE解决端口占用等问题
- mybatis 源码分析, 初始化
- IP分类以及特殊IP
- @scheduled 每30s 执行一次_全球首发5G神U麒麟820,荣耀30S卡位5G档位最强,售价2399起...
- 数据竞赛入门-金融风控(贷款违约预测)三、特征工程
- Makefile简易教程
- C语言 FileStreaming fseek
- 2020没赚到,你真的该好好想想了
- 《移动平台开发实践》第1周作业
- Elastic Stack应用性能监控APM初窥门径
- 麻将项目开发--bug mj157
- 小熊派折叠开发板(一)- 开发板介绍
- 设计模式之CS和BS结构的区别
- Python全栈工程师(15:Socket编程4-paramiko模块和SSH秘钥)
- Unity3d C# 使用Universal Media Player(ump)插件播放视频的众坑之无法播放视频和VLC播放器依赖的问题
- 移动硬盘格式化后数据恢复
- ubuntu系统搭建软raid
- 给赞!移动端网页调试利器-uc开发者工具
- 转.CNNIC,我不信任你! ——从“受信任的根证书”里赶走CNNIC
热门文章
- 【DataBase】【SQL语言】【第三天】
- mysql-基本命令
- sql中小数位四舍五入控制
- MySQL技术内幕 InnoDB存储引擎 之 InnoDB体系架构
- Create C++ Windows Forms Application in Visual Studio 2017
- Linux优化和目录结构
- 聊聊kafka client chunkQueue 与 MaxLag值
- 关于 Oracle DB CONSTRAINT约束的一些SQL ORA-02292: integrity constraint violated
- 覆盖(override)和重载(overload)
- Delphi 复习代码