一步一步学习ObjectDataSource--(3)
ObjectDataSource公开了一些事件,这些事件基本上和SQL语句对应,SQL语句包含Select,Update,Delete和Insert,所以ObjectDataSource定义了Selecting,Inserting,Deleting和Updating 事件,
同时,对每个事件,除了一个-ing进行时状态还有一个-ed完成状态,即Selected,Inserted,Deleted和Updated事件。
另外,GridView也提供了RowUpdating,RowEditing,RowDeleting,RowInserting进行事件,和RowUpdated,RowDeleted完成事件。还有Paging(分页),Sorting排序等等事件。很多初学者对ObjectDataSource和GridView同时公开这么多事件
感觉不理解。或者说,不是很了解在什么情况下用什么事件。下面简单介绍一下Delete和Update事件。
(1)考虑如下一种情况,页面允许用户删除数据,所以,在页面,用户单击了Delete 按钮。此时将激发ObjectDataSource的Deleting和Deleted事件。那么如何使用这2个事件呢?
在Deleting事件里,用户单击了Delete,但是用户又不想删除了,那么我们可以在Deleting里,设置Cancel为true,阻止该事件。这就是Deleting的作用。
protected void ObjectDataSource1_Deleting(object sender, ObjectDataSourceMethodEventArgs e){e.Cancel = true;}
再考虑一下Deleting事件。 在删除DeleteEmployee方法时,我们除了传递EmployeeID,假设还要增加一个限制----删除的用户姓氏只能够为姓“Li”的用户。那么我们就可以再Deleting增加一个默认参数.先配置一下GridVIew,在DeleteParameters里,增加了 <asp:Parameter Name="LastName" DbType="String" /> 参数。
请看下面的示意代码:
<asp:ObjectDataSourceID="ObjectDataSource1"TypeName="EmployeeInfo"SelectMethod="GetEmployees"UpdateMethod="UpdateEmployee" DeleteMethod="DeleteEmployee"Runat="Server" OnDeleted="ObjectDataSource1_Deleted" OnDeleting="ObjectDataSource1_Deleting"><DeleteParameters><asp:Parameter Name="LastName" DbType="String" /></DeleteParameters>
然后就可以再Deleting里给参数赋值。
protected void ObjectDataSource1_Deleting(object sender, ObjectDataSourceMethodEventArgs e){e.InputParameters["FirstName"] = "Li";}
(2)考虑第二种情况,用户删除了数据,但是我们希望告诉用户,删除了几行,那么就可以利用Deleted事件。示意代码如下
protected void ObjectDataSource1_Deleted(object sender, ObjectDataSourceStatusEventArgs e){Label1.Text = e.AffectedRows;}
这就是Deleting和Deleted2个方法的作用。
(3)刚才已经说了,在Delete 按钮事件里,除了触发ObjectDataSource的Deleting和Deleted事件,还触发了GridVIew的RowDeleting和RowDeleted方法。同样可以再这些事件里,对数据/参数进行处理。
关于在RowUpdating事件
在GridView里,系统提供了NewValues,OldValues,Key可以对主键进行控制。
理解这种情况可以考虑如下一种情况。
(a)假设,数据库以ID为主键,那么如果需要把ID为5的张三修改为李四,那么只要SQL编写为如下即可(也就是我不需要传递张三这个值)
update table set username='李四' where id=5
(b)但是,假设据库以username为主键,没有ID这一列,我们要把username为张三的用户修改为李四,那么SQL需要编写如下(此时,必须传递张三这个参数)
update table set username='李四' where username='张三'
比较a和b,可以看到,一个是主键,我只要传递新值。而一个是除了传递新值,我还要传递旧值。因此你会发现在RowUpdate里看到NewValues和OldValues
就需要使用OldValuesParameterFormatString 参数,改参数默认值为{0},但是你可以通过修改进行使用。
关于这个参数,请参考我们前面的介绍。
(二)自定义触发DataSource控件事件。
通常,我们都是在页面上放置一个GridView,然后把DataSourceID绑定到ObjectDataSource上,这样,当页面在Page_Load里,会自动进行绑定,但是有时候,我们希望自己控制事件的绑定,例如我希望用户单击Button时,GridView才绑定到ObjectDataSource上,此时就可以用ObjectDataSource的Select方法,ObjectDataSource公开了Select,Insert,Delete和Update方法,也就是:
ObjectDataSource1.Select();ObjectDataSource1.Update();ObjectDataSource1.Delete();ObjectDataSource1.Insert();
对于每一个方法,都会触发相应的事件,例如调用Select方法时,会先触发ObjectDataSource的Selecting事件,然后是Selected事件,在上面,我们也说过,可以在这些事件里,为ObjectDataSource自定义参数,以及其他操作。
例如我再页面放置一个SqlDataSource:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString %>" SelectCommand="SELECT COUNT(*) FROM [Products] ">
</asp:SqlDataSource><asp:Label ID="Label1" runat="server" Text=""></asp:Label>
<br />
<asp:Button ID="Button1" Text="Check Reorder Status" runat="server" />
如果我希望用户单击Button时执行SQLDataSource,就可以调用Select方法:
protected void Button1_Click(object sender, EventArgs e)
{SqlDataSource1.Select(DataSourceSelectArguments.Empty)
}
ObjectDataSource的-ed事件会返回基础数据提供的记录数量。因此使用这些AffectedRows可以返回相应的记录数
protected void ObjectDataSource1_Selected(object sender, ObjectDataSourceStatusEventArgs e){int total= e.AffectedRows; //返回共有多少记录}protected void ObjectDataSource1_Inserted(object sender, ObjectDataSourceStatusEventArgs e){int insertCount= e.AffectedRows; //返回插入多少条记录}
(三)必须了解GridView,DataSource控件的事件顺序
(1)如前面几节介绍的最简单的GridView直接绑定到DataSource 方式,其事件流程可以用如下表示:
GridView默认调用DataSource的Select方法,然后出发Selecting事件,接着到数据库里获取数据,然后触发Selected事件,可以在Selected事件里,利用
e.AffectedRows获取记录数。整个流程类似如下:
下图显示了事件触发顺序。例如更新GridView时,
(a)先触发GridView的RowUpdating事件(准备更新的参数)
(b)接着系统准备UpdateParaeters参数 (准备更新的参数)
(3)调用ObjectDataSource的Update()方法
(4)进一步触发了ObjectDataSource的Updating事件。(利用e.Cancel=true可以阻止事件往下进行。)
(5)然后执行SQL对基础数据库进行更新。
(6)触发ObjectDataSource的Updated事件。(利用此事件,可以获取修改的记录数)
(7)触发GridView的RowUpdated事件。 (利用此事件,也可以获取修改的记录数)
如果了解了上面的Update方法,应该就很容易理解下图介绍的Insert()方法,先触发了Inserting事件,接着执行业务逻辑层里的具体插入方法,最后触发Inserted事件,返回插入的记录数
下面讨论有用户询问返回插入记录数的问题。先看一个简单的SqlDataSource的使用。
<%@Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server"> private void InsertShipper (object source, EventArgs e) {SqlDataSource1.Insert(); } </script> <html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"><title></title> </head> <body><form id="form1" runat="server"><asp:dropdownlistid="DropDownList1"runat="server"datasourceid="SqlDataSource1"datatextfield="CompanyName"datavaluefield="ShipperID" /><asp:sqldatasourceid="SqlDataSource1"runat="server"connectionstring="<%$ ConnectionStrings:MyNorthwind %>"selectcommand="SELECT CompanyName,ShipperID FROM Shippers"insertcommand="INSERT INTO Shippers (CompanyName,Phone) VALUES (@CoName,@Phone)"><insertparameters><asp:formparameter name="CoName" formfield="CompanyNameBox" /><asp:formparameter name="Phone" formfield="PhoneBox" /></insertparameters></asp:sqldatasource> <br /><asp:textboxid="CompanyNameBox"runat="server" /><br /><asp:textboxid="PhoneBox"runat="server" /><br /><asp:buttonid="Button1"runat="server"text="Insert New Shipper"onclick="InsertShipper" /></form></body> </html>
页面放置了一个SqlDataSource1,并把数据绑定到dropdownlist控件上,如果你单击Button,可以插入一天记录。
如果我们想要获取插入的记录数,可以直接使用Insert方法。
<script runat="server"> private void InsertShipper (object source, EventArgs e) {int insertCount= SqlDataSource1.Insert(); } </script>
上面说了,您可以调用Insert()获取插入记录数,但是有时候我们是通过数据绑定控件如GridView自动调用Insert的,此时你就可以使用DataSource1_Inserted事件,即
protected void SqlDataSource1_Inserted(object sender, SqlDataSourceStatusEventArgs e) {int insertCount= e.AffectedRows }
获取记录数。
转载于:https://www.cnblogs.com/mqingqing123/archive/2006/04/10/371118.html
一步一步学习ObjectDataSource--(3)相关推荐
- 【深度学习基础】一步一步讲解卷积神经网络
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送 本文转自:一步一步讲解卷积神经网络 卷积神经网络(Convoluti ...
- 通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本...
通过脚本案例学习shell(五) 通过创建DNS脚本一步一步教你将一个普通脚本规范到一个生产环境脚本 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 ...
- 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!
一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 本文根据<Professional ASP.NET MVC 1.0>中微软牛人Scott Guthrie 提供 ...
- 一步一步学习SignalR进行实时通信_6_案例
原文:一步一步学习SignalR进行实时通信_6_案例一步一步学习SignalR进行实时通信\_6_案例1 一步一步学习SignalR进行实时通信_6_案例1 前言 类的定义 各块功能 后台 上线 下 ...
- 据lovecherry的一步一步学Remoting序列文章学习.net Remoting日记(2)
今天学习了服务器端激活和客户端激活的区别!可还是出现了一点点的差错,经过对比得到正确的调用方法,整理如下: 1.服务器端激活,分为两种方式Singleton和SingleCall方式 Server端A ...
- Java程序员从笨鸟到菜鸟之(一百零八)一步一步学习webservice(二)webservice基本原理
本来这第二篇打算讲解"开发第一个基于XFire的webservice"的内容来着.但是想想.开发实例只是局限于了会用的层面上.如果想真正的理解webservice还是需要挖掘其原理 ...
- 一步一步学习iOS 5编程(第三版)-PDF中文版-正式发布!
目前,这是第一本介绍iOS 5.x 和 Xcode 4.4 的中文版书籍,尤其适合于iOS 编程开发初学者.本教程由 EntLib.com 团队编写.如有任何技术问题,欢迎留言. 电子版 – PDF ...
- GitChat · 大数据 | 一步一步学习大数据:Hadoop 生态系统与场景
目录(?)[-] Hadoop概要 Hadoop相关组件介绍 HDFS Yarn Hive HBase Spark Other Tools Hadoop集群硬件和拓扑规划 硬件配置 软件配置 Hado ...
- visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code
工欲善其事,必先利其器: 器欲尽其用,必先得其法. 前面两章我们分别安装了Python3.8和在三种模式下运行了Python的print()函数程序.在开始我们正式学习Python基础语法时,我们先把 ...
- (转) 一步一步学习ASP.NET 5 (四)- ASP.NET MVC 6四大特性
转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44459625 编者语 : 昨晚写好的文章居然csd ...
最新文章
- [JSOI2007]建筑抢修
- ValueError: Variable rnn/basic_rnn_cell/kernel already exists, disallowed. Did you mean to set reuse
- ubuntu12.04中shell脚本无法使用source的原因及解决方法
- linux查看passwd最后一行,Linux命令总结
- linux怎么运行g77,Linux安装g77编译器的技巧
- 6月8日任务(12.10 Nginx访问日志 12.11 Nginx日志切割 12.12 静态文件)
- Codeforces 405D 数学问题
- 序列化二叉树(C++)
- python使用长ping命令_在Python中调用Ping命令,批量IP的方法
- 单片机实验六 动态数码管实验
- SpringBoot水果商城后台管理系统(文末附源码)
- ping命令显示的TTL是什么意思
- Python——click模块
- 微信IPAD协议安卓协议DEMO,登录篇#1
- 104. 史上最全的数据库面试题,面试前刷一刷
- iOS12.3正式版不能更新是怎么回事(解决办法)
- Python生成器next方法和send方法区别详解
- Redis重大版本整理(Redis2.6-Redis6.0)
- Idea基本操作攻略
- spring:Failed to convert property value of type ‘java.lang.String‘ to required type ‘java.util.Date‘