天天看點

使用Ajax和Jquery實作GridView的展開、合并

<b>界面操作:</b>

<b></b>

Step 1 展現會員清單,如下圖

使用Ajax和Jquery實作GridView的展開、合并

Step 2 點選“某一會員”行 展現會員訂單清單

使用Ajax和Jquery實作GridView的展開、合并

 <b>實作思路: </b>

1、  使用使用者控件(CustomerOrders.ascx)展示訂單清單,此使用者控件隻需要包含Repeater控件并綁定資料源

2、  建立一個簡單頁面GridViewDrillDownjQueryQAjax.aspx,在此頁面引用使用者控件,展示使用者訂單清單

3、  在頁面GridViewDrillDownjQueryQAjax.aspx建立兩個DIV:一個用來展示會員資訊,一個用來展示某個會員的訂單資訊。當點選某一會員資訊時,展示此會員的訂單清單

<b>實作細節:</b>

1、  建立使用者控件(CustomerOrders.ascx),拖資料源控件 和 Repeater控件到頁面,主要代碼如下

 在使用者控件的背景代碼中有一屬性CustomerId,它主要用來傳遞參數

使用Ajax和Jquery實作GridView的展開、合并
使用Ajax和Jquery實作GridView的展開、合并

Code

&lt;asp:SqlDataSource ID="sqlDsOrders" runat="server" ConnectionString="&lt;%$ ConnectionStrings:Northwind %&gt;"

    SelectCommand="SELECT [OrderID], [OrderDate], [RequiredDate], [Freight], [ShippedDate] FROM [Orders] WHERE ([CustomerID] = @CustomerID)"&gt;

    &lt;SelectParameters&gt;

        &lt;asp:Parameter Name="CustomerID" Type="String" DefaultValue="" /&gt;

    &lt;/SelectParameters&gt;

&lt;/asp:SqlDataSource&gt;

&lt;asp:Repeater ID="List" DataSourceID="sqlDsOrders" runat="server"&gt;

    &lt;HeaderTemplate&gt;

        &lt;table class="grid" cellspacing="0" rules="all" border="1" style="border-collapse: collapse;"&gt;

            &lt;tr&gt;

                &lt;th scope="col"&gt;&amp;nbsp;&lt;/th&gt;

                &lt;th scope="col"&gt;Order ID&lt;/th&gt;

                &lt;th scope="col"&gt;Date Ordered&lt;/th&gt;

                &lt;th scope="col"&gt;Date Required&lt;/th&gt;

                &lt;th scope="col" style="text-align: right;"&gt;Freight&lt;/th&gt;

                &lt;th scope="col"&gt;Date Shipped&lt;/th&gt;

            &lt;/tr&gt;

    &lt;/HeaderTemplate&gt;

    &lt;ItemTemplate&gt;

        &lt;tr class='&lt;%# (Container.ItemIndex%2==0) ? "row" : "altrow" %&gt;'&gt;

            &lt;td class="rownum"&gt;&lt;%# Container.ItemIndex+1 %&gt;&lt;/td&gt;

            &lt;td style="width: 80px;"&gt;&lt;%# Eval("OrderID") %&gt;&lt;/td&gt;

            &lt;td style="width: 100px;"&gt;&lt;%# Eval("OrderDate","{0:dd/MM/yyyy}") %&gt;&lt;/td&gt;

            &lt;td style="width: 110px;"&gt;&lt;%# Eval("RequiredDate", "{0:dd/MM/yyyy}")%&gt;&lt;/td&gt;

            &lt;td style="width: 50px; text-align: right;"&gt;&lt;%# Eval("Freight","{0:F2}") %&gt;&lt;/td&gt;

            &lt;td style="width: 100px;"&gt;&lt;%# Eval("ShippedDate", "{0:dd/MM/yyyy}")%&gt;&lt;/td&gt;

        &lt;/tr&gt;

    &lt;/ItemTemplate&gt;

    &lt;FooterTemplate&gt;

        &lt;/table&gt;

    &lt;/FooterTemplate&gt;

&lt;/asp:Repeater&gt;

 2、 重寫使用者控件(CustomerOrders.ascx)的OnLoad處理事件,代碼如下:

使用Ajax和Jquery實作GridView的展開、合并
使用Ajax和Jquery實作GridView的展開、合并

protected override void OnLoad(EventArgs e)

    {

        this.sqlDsOrders.SelectParameters["CustomerID"].DefaultValue = this.CustomerId;

        base.OnLoad(e);

    }

3、  建立一個簡單頁面GridViewDrillDownjQueryQAjax.aspx,在此頁面引用使用者控件(CustomerOrders.ascx),展示使用者訂單清單。下面的背景方法主要用來根據會員編号(CustomerId)獲得會員的訂單清單。

使用Ajax和Jquery實作GridView的展開、合并
使用Ajax和Jquery實作GridView的展開、合并

[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,展示此會員的訂單清單。

使用Ajax和Jquery實作GridView的展開、合并
使用Ajax和Jquery實作GridView的展開、合并

 &lt;asp:GridView Width="100%" AllowPaging="True" ID="gvCustomers" AutoGenerateColumns="False"

                                            DataSourceID="sqlDsCustomers" runat="server" ShowHeader="False"&gt;

                                            &lt;Columns&gt;

                                                &lt;asp:TemplateField&gt;

                                                    &lt;ItemTemplate&gt;

                                                        &lt;div class="group" style="display:inline" id='&lt;%#String.Format("customer{0}",Container.DataItemIndex) %&gt;' 

                                                            onclick='showhide(&lt;%#String.Format("\"#customer{0}\"",Container.DataItemIndex) %&gt;,

                                                                              &lt;%#String.Format("\"#order{0}\"",Container.DataItemIndex) %&gt;,

                                                                              &lt;%#String.Format("\"{0}\"",Eval("CustomerID")) %&gt;)'&gt;

                                                            &lt;asp:Image ID="imgCollapsible" CssClass="first" ImageUrl="~/Assets/img/plus.png"

                                                                Style="margin-right: 5px;" runat="server" /&gt;&lt;span class="header"&gt;

                                                                    &lt;%#Eval("CustomerID")%&gt;:

                                                                    &lt;%#Eval("CompanyName")%&gt;(&lt;%#Eval("TotalOrders")%&gt; Orders) &lt;/span&gt;

                                                        &lt;/div&gt;                                                        

                                                        &lt;div id='&lt;%#String.Format("order{0}",Container.DataItemIndex) %&gt;' class="order"&gt;&lt;/div&gt;

                                                    &lt;/ItemTemplate&gt;

                                                &lt;/asp:TemplateField&gt;

                                            &lt;/Columns&gt;

                                        &lt;/asp:GridView&gt;

5、第一個Divi的用戶端點選事件處理代碼調用showhide(div1Id,div2Id,customerId)方法,主要代碼如下:

使用Ajax和Jquery實作GridView的展開、合并
使用Ajax和Jquery實作GridView的展開、合并

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

                                }

                            });

                }

                    //Toggle expand/collapse                   

                    $(detail).slideToggle("normal");

                    $(master).children()[0].src = src;

            }

解釋:

type: 請求方式使用“post”

url:   請求的URL

data:  要傳的參數

beforeSend:請求發送之前所要做的操作

contentType: 設定contentType為application/json; charset=utf-8

datatype: 設定傳回類型為 json

success:請求成功傳回正确的結果後 所要操作的事情,比如向第二個div追加訂單清單html代碼,然後滑動展示。

Error: 請求失敗,彈出失敗資訊

至此,使用Ajax和Jquery實作GridView的展開和合并完畢。

版權

作者:靈動生活 郝憲玮

如果你認為此文章有用,請點選底端的【推薦】讓其他人也了解此文章,

使用Ajax和Jquery實作GridView的展開、合并

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

繼續閱讀