[jquery][javascript]用jQuery幫GridView排序

用jQuery幫GridView排序

GridView一直都是我很喜歡用的資料控制項,功能強大的GridView除了可以顯示資料以外,還可以幫我們做到排序、分頁的功能。如果覺得在排序或是分頁的時候,畫面會閃一下很討厭的話,再加上Update Panel把他包起來,這樣通常都可以滿足老闆的需要。

 

不過不知道大家有沒有碰過當你的畫面上有很多控制項或是GridView的資料筆數相當多的時候,包在Update Panel裡面的GridView要做排序的動作就要花好幾秒的時間,當然這時候雖然青菜工程師如我一定是沒關係的,誰叫你要畫面不會閃,但老闆一定不能接受的,青菜工程師只好想辦法改了。

 

既然要畫面不閃,但是用Update Panel來做頁面上的資料要太多,傳回去又傳回來花太多時間,既然只是排序的功能,那就在Client端做吧。

 

前一陣子才去買了Learning jQuery,不過剛看完前三章而已,立刻先往後翻從書上找出排序的範例,雖然可以排序但有點殘缺,沒關係再加以改造一下吧。

$(document).ready(function() {
            $('table.SortTable').each(function() {

		
                var $table = $(this);

		
                $('th', $table).each(function(column) {
                    if ($(this).is('.SortColumn')) {

		
                        $(this).click(function() {
                            
                            var sColumnTitile;

		
                            switch (column) {
                                case 0:
                                    sColumnTitile = 'title';
                                    break;
                                case 1:
                                    sColumnTitile = 'link';
                                    break;
                                case 2:
                                    sColumnTitile = 'pubDate';
                                    break;
                                case 3:
                                    sColumnTitile = 'description';
                                    break;
                                case 4:
                                    sColumnTitile = 'create';
                                    break;
                            }
                            
                            var bSort = ($(this).html().indexOf('↑') > -1);

		
                            if (bSort)
                                $(this).html(sColumnTitile + '↓');
                            else
                                $(this).html(sColumnTitile + '↑');

		
                            var rows = $table.find('tbody > tr').get();

		
                            rows.sort(function(a, b) {

		
                                var keyA = $(a).children('td').eq(column).text().toUpperCase();
                                var keyB = $(b).children('td').eq(column).text().toUpperCase();

		
                                if (bSort) {
                                    if (keyA > keyB) return 1;
                                    if (keyA < keyB) return -1;
                                }
                                else {
                                    if (keyA < keyB) return 1;
                                    if (keyA > keyB) return -1;
                                }

		
                                return 0;
                            });

		
                            $.each(rows, function(index, row) {
                                $table.children('tbody').append(row);
                            })
                        });
                    };
                });
            });
        });

 

GridView也要加一些CssClass的定義好讓jQuery可以找到

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" CssClass="SortTable">
            <Columns>
                <asp:TemplateField HeaderText="title" HeaderStyle-CssClass="SortColumn">
                    <ItemTemplate>
                        <%# Eval("title")%>
                    </ItemTemplate>                   
                </asp:TemplateField>
                <asp:TemplateField HeaderText="link" HeaderStyle-CssClass="SortColumn">
                    <ItemTemplate>
                        <%# Eval("link")%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="pubDate" HeaderStyle-CssClass="SortColumn">
                    <ItemTemplate>
                        <%# Convert.ToDateTime(Eval("pubDate")).ToString("yyyy/MM/dd HH:ss")%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="description" HeaderStyle-CssClass="SortColumn">
                    <ItemTemplate>
                        <%# Eval("description")%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="create" HeaderStyle-CssClass="SortColumn">
                    <ItemTemplate>
                        <%# Eval("creator")%>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

 

耶!怎麼排序的時候連標題也一起排下去了,原來GridView render成html的時候沒有tbody的tag,這這,初學jQuery的青菜工程師要怎麼去改呢,在百試不得其的解的情況下,還是想辦法讓GridView可以輸入tbody的tag吧,還真的被我找到方法。這要從.cs下手[參考來源]。

DataSet ds = new DataSet();

		
        ds.ReadXml(Server.MapPath("rss.xml"));
        
        GridView1.DataSource = ds.Tables[2];
        GridView1.DataBind();

		
        GridView1.HeaderRow.TableSection = TableRowSection.TableHeader;

 

就這樣沒有花太多時間,就完成用jQuery幫GridView做排序,jQuery真是不錯用。喝~喝~喝~打完收工。

 

範例網頁

---------------

這是簽名檔,I love Dotblogs