0

サンプル コードをガイドとして使用することで、グリッドビューで並べ替えとページングを実行するコードをまとめることができました。ただし、私は Web ページのプログラミングに比較的慣れていないため、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>

テーブルを生成するコード ビハインド:

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

2 に答える 2

0

何を使用しないかを確認するために提供された良いヒント。あなたの考えを共有してくれてありがとう。また、個人的には、セッションはビューステートよりも軽量で安全だと考えています。このサイトhttp://blogfornet.com/2013/09/gridview-paging-and-sorting-example/ でもう1 つの簡単な例を見つけました。初心者の理解に役立ちます。

于 2013-09-27T11:32:58.347 に答える
0

投稿したコードは、データを GridView にバインドする方法により、可能な限り効率的です。より効率的な方法を実現できますが、データ バインディング ロジックを変更しないと実現できません。

たとえば、これを行うより効率的な方法は、jQuery+ dataTablesを使用してクライアント側でページングと並べ替えを処理することです。必要なコードが少なくて済む別の方法は、GridViewSqlDataSourceの として使用および設定することで実現できDataSourceます。コードで再ソート/ページングを行う必要はありません。しかし、繰り返しになりますが、どちらのアプローチにも大幅な変更が必要です。あなたのコードは IMO と同じくらい効率的です。

更新: Tim は、彼のコメントについて適切な指摘をしました。ViewState でデータ テーブルを永続化しないでください。それをセッションに入れるか(データをセッションに入れ始める前にデータのサイズを考慮してください)、単にDBにデータを再度送信するように依頼してください。この DataTable を ViewState に追加すると、ページ サイズが大幅に増加します。

于 2012-09-24T19:55:23.913 に答える