艾伟_转载:使用Ajax和jQuery实现GridView的展开、合并

简介: 需求简介:电子商务网站中,查询会员的订单,点击“會員”,展现此会员的订单列表。 界面操作: Step 1 展现会员列表,如下图   Step 2 点击“某一会员”行 展现会员订单列表   实现思路: 1、  使用用户控件(CustomerOrders.

需求简介:电子商务网站中,查询会员的订单,点击“會員”,展现此会员的订单列表。 

界面操作:

 

Step 1 展现会员列表,如下图

 

 

Step 2 点击“某一会员”行 展现会员订单列表

 

 实现思路:

1、  使用用户控件(CustomerOrders.ascx)展示订单列表,此用户控件只需要包含Repeater控件并绑定数据源

2、  新建一个简单页面GridViewDrillDownjQueryQAjax.aspx,在此页面引用用户控件,展示用户订单列表

3、  在页面GridViewDrillDownjQueryQAjax.aspx新建两个DIV一个用来展示会员信息,一个用来展示某个会员的订单信息。当点击某一会员信息时,展示此会员的订单列表

实现细节:

1  新建用户控件(CustomerOrders.ascx),拖数据源控件 Repeater控件到页面,主要代码如下

 在用户控件的后台代码中有一属性CustomerId,它主要用来传递参数

 

Code
<asp:SqlDataSource ID="sqlDsOrders" runat="server" ConnectionString="<%$ ConnectionStrings:Northwind %>"
    SelectCommand
="SELECT [OrderID], [OrderDate], [RequiredDate], [Freight], [ShippedDate] FROM [Orders] WHERE ([CustomerID] = @CustomerID)">
    
<SelectParameters>
        
<asp:Parameter Name="CustomerID" Type="String" DefaultValue="" />
    
SelectParameters>
asp:SqlDataSource>
<asp:Repeater ID="List" DataSourceID="sqlDsOrders" runat="server">
    
<HeaderTemplate>
        
<table class="grid" cellspacing="0" rules="all" border="1" style="border-collapse: collapse;">
            
<tr>
                
<th scope="col">  th>
                
<th scope="col">Order ID th>
                
<th scope="col">Date Ordered th>
                
<th scope="col">Date Required th>
                
<th scope="col" style="text-align: right;">Freight th>
                
<th scope="col">Date Shipped th>
            
tr>
    
HeaderTemplate>
    
<ItemTemplate>
        
<tr class='<%# (Container.ItemIndex%2==0) ? "row" : "altrow" %>'>
            
<td class="rownum"><%# Container.ItemIndex+1 %> td>
            
<td style="width: 80px;"><%# Eval("OrderID") %> td>
            
<td style="width: 100px;"><%# Eval("OrderDate","{0:dd/MM/yyyy}") %> td>
            
<td style="width: 110px;"><%# Eval("RequiredDate", "{0:dd/MM/yyyy}")%> td>
            
<td style="width: 50px; text-align: right;"><%# Eval("Freight","{0:F2}") %> td>
            
<td style="width: 100px;"><%# Eval("ShippedDate", "{0:dd/MM/yyyy}")%> td>
        
tr>
    
ItemTemplate>
    
<FooterTemplate>
        
table>
    
FooterTemplate>
asp:Repeater>

 

 

 

 

 2、 重写用户控件(CustomerOrders.ascx)的OnLoad处理事件,代码如下:  

Code
protected override void OnLoad(EventArgs e)
    {
        
this.sqlDsOrders.SelectParameters["CustomerID"].DefaultValue = this.CustomerId;
        
base.OnLoad(e);
    }

 

 3、  新建一个简单页面GridViewDrillDownjQueryQAjax.aspx,在此页面引用用户控件(CustomerOrders.ascx),展示用户订单列表。下面的后台方法主要用来根据会员编号(CustomerId)获得会员的订单列表。

 

 

Code
[System.Web.Services.WebMethod()]
    
public static string GetOrders(string customerId)
    {
        System.Threading.Thread.Sleep(
500);
        Page page 
= new Page();
        CustomerOrders ctl 
= (CustomerOrders)page.LoadControl("~/CustomerOrders.ascx");
        ctl.CustomerId 
= customerId;
        page.Controls.Add(ctl);
        System.IO.StringWriter writer 
= new System.IO.StringWriter();
        HttpContext.Current.Server.Execute(page, writer, 
false);
        
string output = writer.ToString();
        writer.Close();
        
return output;
    }

以上3步主要完成的是后台代码,那么接下来我们需要做的是: 使用Ajax读取数据并折叠展示。

 

4、  在页面(GridViewDrillDownjQueryQAjax.aspx)新建两个Div 如下:

第一个Div用来展示会员信息,第二个Div用来展示此会员下的订单列表。当用点击会员信息时(第一个Div),初始化Ajax请求并返回html代码到第二个Div,展示此会员的订单列表。

Code
 <asp:GridView Width="100%" AllowPaging="True" ID="gvCustomers" AutoGenerateColumns="False"
                                            DataSourceID
="sqlDsCustomers" runat="server" ShowHeader="False">
                                            
<Columns>
                                                
<asp:TemplateField>
                                                    
<ItemTemplate>
                                                        
<div class="group" style="display:inline" id='<%#String.Format("customer{0}",Container.DataItemIndex) %>' 
                                                            onclick='showhide(
<%#String.Format("\"#customer{0}\"",Container.DataItemIndex) %>,
                                                                              
<%#String.Format("\"#order{0}\"",Container.DataItemIndex) %>,
                                                                              
<%#String.Format("\"{0}\"",Eval("CustomerID")) %>)'>
                                                            
<asp:Image ID="imgCollapsible" CssClass="first" ImageUrl="~/Assets/img/plus.png"
                                                                Style
="margin-right: 5px;" runat="server" /><span class="header">
                                                                    
<%#Eval("CustomerID")%>:
                                                                    
<%#Eval("CompanyName")%>(<%#Eval("TotalOrders")%> Orders)  span>
                                                        
div>                                                        
                                                        
<div id='<%#String.Format("order{0}",Container.DataItemIndex) %>' class="order"> div>
                                                    
ItemTemplate>
                                                
asp:TemplateField>
                                            
Columns>
                                        
asp:GridView>

 

5、第一个Divi的客户端点击事件处理代码调用showhide(div1Id,div2Id,customerId)方法,主要代码如下:

  

Code
function showhide(master,detail,customerId)
            { 
                
//First child of master div is the image
                var src = $(master).children()[0].src;
                
//Switch image from (+) to (-) or vice versa.
                if(src.endsWith("plus.png"))
                    src 
= src.replace('plus.png','minus.png');
                
else
                    src 
= src.replace('minus.png','plus.png');
                
//if the detail DIV is empty Initiate AJAX Call, if not that means DIV already populated with data             
                if($(detail).html() == "")
                {
                    
//Prepare Progress Image
                    var $offset = $(master).offset();
                    $(
'#progress').css('visibility','visible');
                    $(
'#progress').css('top',$offset.top);
                    $(
'#progress').css('left',$offset.left+$(master).width());                    
                    
//Prepare Parameters
                    var params = '{customerId:"'+ customerId +'"}';                    
                    
//Issue AJAX Call
                    $.ajax({
                            type: 
"POST"//POST
                            url: "GridViewDrillDownjQueryAjax.aspx/GetOrders"//Set call to Page Method
                            data: params, // Set Method Params
                            beforeSend: function(xhr) {
                                xhr.setRequestHeader(
"Content-type""application/json; charset=utf-8");},
                            contentType: 
"application/json; charset=utf-8"//Set Content-Type
                            dataType: "json"// Set return Data Type
                            success: function(msg, status) {
                                $(
'#progress').css('visibility','hidden');
                                $(master).children()[
0].src = src;
                                $(detail).html(msg);
                                $(detail).slideToggle(
"normal"); // Succes Callback
                                },
                            error: 
function(xhr,msg,e){
                                alert(msg);
//Error Callback
                                }
                            });
                }
                
else
                {
                    
//Toggle expand/collapse                   
                    $(detail).slideToggle("normal");
                    $(master).children()[
0].src = src;
                }
            }

 

解释:

type: 请求方式使用“post

url:   请求的URL

data:  要传的参数

beforeSend:请求发送之前所要做的操作

contentType 设置contentTypeapplication/json; charset=utf-8

datatype: 设置返回类型为 json

success:请求成功返回正确的结果后 所要操作的事情,比如向第二个div追加订单列表html代码,然后滑动展示。

Error 请求失败,弹出失败信息

 

至此,使用AjaxJquery实现GridView的展开和合并完毕。

 

英文地址:http://mosesofegypt.net/post/GridView-Grouping-Master-Detail-Drill-Down-Using-jQuery-AJAX.aspx

目录
相关文章
N..
|
5月前
|
XML JSON 前端开发
jQuery实现Ajax
jQuery实现Ajax
N..
58 1
|
5月前
|
XML 前端开发 JavaScript
jQuery中ajax如何使用
jQuery中ajax如何使用
63 0
|
4月前
|
前端开发 JavaScript
杨校老师课堂之基于Servlet整合JQuery中的Ajax进行表单提交[基于IDEA]
杨校老师课堂之基于Servlet整合JQuery中的Ajax进行表单提交[基于IDEA]
42 0
杨校老师课堂之基于Servlet整合JQuery中的Ajax进行表单提交[基于IDEA]
|
13天前
|
前端开发 JavaScript 数据处理
JQuery 拦截请求 | Ajax 请求拦截
【10月更文挑战第4天】
36 1
|
27天前
|
JSON 前端开发 JavaScript
jQuery AJAX 方法
jQuery AJAX 方法
28 1
|
29天前
|
JSON JavaScript 前端开发
Jquery常用操作汇总,dom操作,ajax请求
本文汇总了jQuery的一些常用操作,包括DOM元素的选择、添加、移除,表单操作,以及如何使用jQuery发送Ajax请求,涵盖了GET、POST请求和文件上传等常见场景。
|
1月前
|
JSON 前端开发 JavaScript
jQuery AJAX 方法
jQuery AJAX 方法
18 1
|
2月前
|
前端开发 JavaScript Java
SpringBoot+JQuery+Ajax实现表单数据传输和单文件或多文件的上传
关于如何在SpringBoot项目中结合JQuery和Ajax实现表单数据的传输以及单文件或多文件上传的教程。文章提供了完整的前后端示例代码,包括项目的`pom.xml`依赖配置、SpringBoot的启动类`App.java`、静态资源配置`ResourceConfig.java`、配置文件`application.yml`、前端HTML页面(单文件上传和多文件上传加表单内容)以及后端控制器`UserController.java`。文章最后展示了运行结果的截图。
107 0
SpringBoot+JQuery+Ajax实现表单数据传输和单文件或多文件的上传
|
2月前
|
XML JSON 前端开发
AJAX是什么?原生语法格式?jQuery提供分装好的AJAX有什么区别?
AJAX是什么?原生语法格式?jQuery提供分装好的AJAX有什么区别?
30 0
|
2月前
|
JavaScript 前端开发
Ajax的使用(jquery的下载)
这篇文章是关于Ajax学习笔记的分享,包括JQuery的下载方式、Ajax的主要参数说明,以及如何在网页中使用Ajax进行异步请求的示例代码。