Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Gridview中高效地启用排序和分页_C#_Asp.net_Sorting_Pagination - Fatal编程技术网

C# 在Gridview中高效地启用排序和分页

C# 在Gridview中高效地启用排序和分页,c#,asp.net,sorting,pagination,C#,Asp.net,Sorting,Pagination,通过使用作为指导,我成功地拼凑了一些代码,这些代码将在gridview上执行排序和分页。然而,我对网页编程还比较陌生,所以我经常使用ViewState(据我所知,这是不好的)。因此,我想知道是否有任何方法可以提高我的代码的效率?(或者完成同一件事的不同方式?) 前端: <asp:GridView ID="UserAccounts" runat="server" AllowSorting="true" AutoGenerateColumns="false" AllowPaging="true

通过使用作为指导,我成功地拼凑了一些代码,这些代码将在gridview上执行排序和分页。然而,我对网页编程还比较陌生,所以我经常使用ViewState(据我所知,这是不好的)。因此,我想知道是否有任何方法可以提高我的代码的效率?(或者完成同一件事的不同方式?)

前端:

<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>
要启用排序和分页,请执行以下操作:

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();
        }
    }

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

例如,更有效的方法是使用jQuery+在客户端处理分页和排序。使用
SqlDataSource
并将其设置为GridView的
DataSource
,可以实现从您的部件中获得更少代码的另一种方法-您不必在代码中执行重新调用/分页。但同样,这两种方法都需要重大改变。您的代码尽可能地高效

更新:
Tim在他的评论中提出了一个很好的观点——不要在ViewState上持久化数据表。要么将其放入会话(在开始将内容放入会话之前考虑数据的大小),要么简单地要求DB再次发送数据。将此DataTable添加到ViewState将大大增加页面大小。

提供了一些好的提示,让您了解如何使用不可用的内容。谢谢分享你的想法。我个人也认为会话比viewstate更轻松、更安全。我在这个网站上找到了一个更简单的例子。这将有助于初学者理解。

在ViewState中保持排序方向的值是可以的。您需要看到的只是返回并绑定您所在页面的记录。正如我所记得的,您不需要每个代码块。您只需要将datasource设置为该用户角色查询。这可以加快排序和比较值的速度,您只需要对查询应用正确的linq扩展。这将起作用,因为您已经在查询的“选择部分”中指定了列名。不要将整个
DataTable
添加到ViewState中。它增加了页面的大小并降低了性能,而且可以在客户端解密ViewState,因此DataTable不安全。使用Session,或者-甚至更好-根本不要持久化它,因为GridView默认使用ViewState;DataTable DataTable=(DataTable)UserAccounts.DataSource;在gridview_排序中。然而,我必须问,是否值得研究在这个应用程序中使用SQLDATASOURCE?@Tony,但是您是否仍然有
ViewState[“DataSource”]=dt行在
BindUserAccounts
?如果是,请将其拆下。该行仍然将DT添加到
ViewState
。您需要将其置于会话或再次调用数据库。例如:在BindUserAccounts的最后一行中,do:
Session[“DataSource”]=dtDataTableDataTable=(DataTable)会话[“DataSource”]是的,我也删除了,谢谢。Viewstate仅用于asc/desc行排序。
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();
        }
    }