1

グリッドビューをソート可能にしようとしています。ソートを許可し、以下に示すオンソート属性を追加しました

<asp:GridView ID="GWCase" runat="server"  DataKeyNames="detail, propertydetail,suspectdetail " BackColor="#CCCCCC" BorderColor="#999999" BorderStyle="Solid" BorderWidth="3px" CellPadding="4" CellSpacing="2" ForeColor="Black" Width="100%" AutoGenerateSelectButton="True" OnSelectedIndexChanged="GWCase_SelectedIndexChanged" AutoGenerateColumns="False" AllowPaging="True" PageSize="5" OnPageIndexChanging="GWCase_PageIndexChanging" AllowSorting="True" OnSorting="gridView_Sorting" CurrentSortField="memberreportid" CurrentSortDirection="ASC">
    <FooterStyle BackColor="#CCCCCC" />
    <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
    <PagerStyle BackColor="#CCCCCC" ForeColor="Black" HorizontalAlign="Left" />
    <RowStyle BackColor="White" />
    <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
    <SortedAscendingCellStyle BackColor="#F1F1F1" />
    <SortedAscendingHeaderStyle BackColor="#808080" />
    <SortedDescendingCellStyle BackColor="#CAC9C9" />
    <SortedDescendingHeaderStyle BackColor="#383838" />

<Columns>
     <asp:BoundField DataField="memberreportid" HeaderText="MemberReportID" SortExpression="memberreportid"/>
     <asp:BoundField DataField="typeofcrime" HeaderText="Type of Crime" SortExpression="typeofcrime" />
     <asp:BoundField DataField="crdatetime" HeaderText="ReportDateTime" SortExpression="crdatetime" />
     <asp:BoundField DataField="address" HeaderText="Address" SortExpression="address" />
     <asp:BoundField DataField="incidentdate" HeaderText="Incident Date" SortExpression="incidentdate" />
     <asp:BoundField DataField="incidenttime" HeaderText="Incident Time" SortExpression="incidenttime"/>
     <asp:BoundField DataField="property" HeaderText="Property" SortExpression="Property"/>
     <asp:BoundField DataField="victim" HeaderText="Victim" SortExpression="victim" />
     <asp:BoundField DataField="suspect" HeaderText="Suspect" SortExpression="suspect"/>
     <asp:BoundField DataField="detail" HeaderText="Detail" SortExpression="detail" Visible="false"/>
</Columns>
</asp:GridView>

これは、ソートを有効にするために使用した私のC#コードです

protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        SortDirection sortDirection = SortDirection.Ascending;
        string sortField = string.Empty;

        SortGridview((GridView)sender, e, out sortDirection, out sortField);

        string strSortDirection = e.SortDirection == SortDirection.Ascending ? "ASC" : "DESC";
        //Error happens here
        GWCase.DataSource = (e.SortExpression + " " + strSortDirection);
        GWCase.DataBind();
    }


    private void SortGridview(GridView gridView, GridViewSortEventArgs e, out SortDirection sortDirection, out string sortField)
    {
        sortField = e.SortExpression;
        sortDirection = e.SortDirection;

        if (gridView.Attributes["CurrentSortField"] != null && gridView.Attributes["CurrentSortDirection"] != null)
        {
            if (sortField == gridView.Attributes["CurrentSortField"])
            {
                if (gridView.Attributes["CurrentSortDirection"] == "ASC")
                {
                    sortDirection = SortDirection.Descending;
                }
                else
                {
                    sortDirection = SortDirection.Ascending;
                }
            }

            gridView.Attributes["CurrentSortField"] = sortField;
            gridView.Attributes["CurrentSortDirection"] = (sortDirection == SortDirection.Ascending ? "ASC" : "DESC");
        }
    } 

私が従うチュートリアルでは、グリッドビューをバインドフィールドにバインドしたため、使用しなかったデータレイヤーが必要でした。ただし、データソースを取得しようとすると、上記のエラーが表示されました。

これは私のグリッドビューをバインドする方法です

private void LoadGrid()
    {
        SqlConnection conn = new SqlConnection();
        conn.ConnectionString = "Data Source = localhost; Initial Catalog = MajorProject; Integrated Security= SSPI";
        conn.Open();

        DataSet ds = new DataSet();

        SqlDataAdapter da = new SqlDataAdapter("SELECT memberreportid, typeofcrime, crdatetime, address, detail, incidentdate, incidenttime, property, victim, suspect, detail, suspectdetail, propertydetail from memberreport where assignto = 'unassign'", conn);
        da.Fill(ds);

        GWCase.DataSource = ds.Copy();
        GWCase.DataBind();

        conn.Close();
    }
4

1 に答える 1

1

問題は次のコード行です。

GWCase.DataSource = (e.SortExpression + " " + strSortDirection);

GridViewこれは、最初にグリッドをバインドしたデータ ソースとは異なるタイプのデータ ソースにバインドするように に指示しています。たとえば、ユーザーがVictim列をクリックして並べ替えを選択した場合、上記のコードは文字列をデータ ソースとして設定しようとしますがvictim ascending、これは明らかに正しくありません。

迅速なページング/ソート機能をGridView最も簡単な方法で取得するには、DataTableデータ構造とともにデータ構造を使用することDataViewです。

以前の StackOverflow の質問では、これを行う例について詳しく説明しています。質問自体は、並べ替えとページングを容易にするための使用法DataTableと、並べ替え方向が昇順か降順かを維持するための使用法について詳しく説明しています。DataViewViewState

コード例を確認するには、「Gridview で効率的に並べ替えとページングを有効にする」をお読みください。

AllowPaging=Trueページング/ソートをより適切に処理するには、 のとのAllowSorting=True設定の代わりに、カスタムのページングとソートを組み込むことをお勧めしますGridView。この理由は、これらのGridView設定が、使用しているデータ ソース (通常はデータベース) からすべての行を要求し、すべてをメモリにロードするためです。20 行であればそれほど悪くはありませんが、10,000 行を想像してください。データの; メモリの使用が遅くなり、非効率的になります。真のページングは​​、ページに表示する正確な行数のみを取得し、ユーザーがナビゲートするときに別のページ チャンクを要求します。データベースを複数回呼び出すと、よりおしゃべりになりますが、メモリに関しては非常に高速で効率的です。

于 2013-08-06T03:10:41.243 に答える