有效地在Gridview中启用排序和分页

时间:2012-09-24 19:37:30

标签: c# asp.net sorting pagination

通过使用sample code作为指导,我设法将一些将在gridview上执行排序和分页的代码组合在一起。但是,我对网页编程比较陌生,所以我经常使用ViewState(我收集的是BAD)。结果,我想知道是否有办法让我的代码更有效率? (或者以不同的方式完成同样的事情?)

前端:

<asp:GridView ID="UserAccounts" runat="server" AllowSorting="true" AutoGenerateColumns="false" AllowPaging="true"
    OnSorting="gridView_Sorting" OnPageIndexChanging="gridView_PageIndexChanging" PageSize = "20">
    <Columns>
        <asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
        <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" />
        <asp:BoundField DataField="Roles" HeaderText="Role" SortExpression="Roles" />
        <asp:CheckBoxField DataField="IsLockedOut" HeaderText="Locked Out?" SortExpression="IsLockedOut" />
        <asp:CheckBoxField DataField="IsOnline" HeaderText="Online?" SortExpression="IsOnline" />
        <asp:BoundField DataField="LastLoginDate" HeaderText="Last Login Date" SortExpression="LastLoginDate" />
        <asp:HyperLinkField Text="Manage" DataNavigateUrlFields="UserName" DataNavigateUrlFormatString="ManageDetails.aspx?user={0}" />
    </Columns>
</asp:GridView>

生成表的代码:

private void BindUserAccounts()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("UserName");
        dt.Columns.Add("Email");
        dt.Columns.Add("Roles");
        dt.Columns.Add("IsLockedOut");
        dt.Columns.Add("IsOnline");
        dt.Columns.Add("LastLoginDate");

        var userRoles = from MembershipUser user in Membership.FindUsersByName(this.UsernameToMatch + "%")
                        let roles = Roles.GetRolesForUser(user.UserName)
                        select new
                        {
                            UserName = user.UserName,
                            Email = user.Email,
                            Roles = string.Join(", ", roles),
                            IsLockedOut = user.IsLockedOut,
                            IsOnline = user.IsOnline,
                            LastLoginDate = user.LastLoginDate
                        };

        foreach (var u in userRoles)
        {
            DataRow dr = dt.NewRow();
            dr["UserName"] = u.UserName;
            dr["Email"] = u.Email;
            dr["Roles"] = u.Roles;
            dr["IsLockedOut"] = u.IsLockedOut;
            dr["IsOnline"] = u.IsOnline;
            dr["LastLoginDate"] = u.LastLoginDate;

            dt.Rows.Add(dr);
        }

        UserAccounts.DataSource = dt;
        UserAccounts.DataBind();
        ViewState["DataSource"] = dt;
}

启用排序和分页:

protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        UserAccounts.PageIndex = e.NewPageIndex;
        BindUserAccounts();
    }

    protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dataTable = (DataTable)ViewState["DataSource"];

        if (dataTable != null)
        {
            DataView dataView = new DataView(dataTable);
            if ((string)ViewState["SortDir"] == "ASC" || String.IsNullOrEmpty((string)ViewState["SortDir"]))
            {
                dataView.Sort = e.SortExpression + " ASC";
                ViewState["SortDir"] = "DESC";
            }
            else if ((string)ViewState["SortDir"] == "DESC")
            {
                dataView.Sort = e.SortExpression + " DESC";
                ViewState["SortDir"] = "ASC";
            }

            UserAccounts.DataSource = dataView;
            UserAccounts.DataBind();
        }
    }

2 个答案:

答案 0 :(得分:0)

由于您将数据绑定到GridView的方式,您发布的代码效率非常高。可以实现更有效的方法,但不能改变数据绑定逻辑。

例如,更有效的方法是使用jQuery + dataTables在客户端处理分页和排序。另一种需要较少代码的方法可以使用SqlDataSource并将其设置为GridView的DataSource来完成 - 您不必在代码中执行求助/分页。但同样,两种方法都需要进行重大改变。您的代码与IMO一样高效。

<强>更新 Tim对他的评论提出了一个很好的观点 - 不要在ViewState上保留数据表。将它放在Session中(在开始将事物放入Session之前考虑数据的大小)或者只是让DB再次发送数据。将此DataTable添加到ViewState将大大增加页面大小。

答案 1 :(得分:0)

给出了很好的提示,看看用什么不是。谢谢你分享你的想法。我个人也认为会话比viewstate更轻松,更安全。我在这个网站http://blogfornet.com/2013/09/gridview-paging-and-sorting-example/找到了一个更简单的例子。这将有助于初学者理解。