zoukankan      html  css  js  c++  java
  • 一步一步学习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:ObjectDataSource
            ID="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:dropdownlist
            id="DropDownList1"
            runat="server"
            datasourceid="SqlDataSource1"
            datatextfield="CompanyName"
            datavaluefield="ShipperID" />
    
    
          <asp:sqldatasource
            id="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:textbox id="CompanyNameBox" runat="server" /> <br /><asp:textbox id="PhoneBox" runat="server" /> <br /><asp:button id="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
    }

     获取记录数。

  • 相关阅读:
    经典的Java基础面试题集锦
    2016春招Android开发实习生(网易传媒)笔试
    十三、集合点和事务
    十一、LoadRunner组成和工作原理
    Java+selenium之WebDriver常见特殊情况如iframe/弹窗处理(四)
    修改jar包内容并打包上传到私服
    Information:java: Multiple encodings set for module chunk platf "GBK" will be used by compile
    十、创建、运行和监控测试场景
    在gitlab新建分支,IDEA切换时找不到的解决办法
    Git 代码撤销、回滚到任意版本(当误提代码到本地或master分支时)
  • 原文地址:https://www.cnblogs.com/mqingqing123/p/371118.html
Copyright © 2011-2022 走看看