5

カスタム SqlDataSource を使用しているときに、ユーザーがデータの列を並べ替えることができるように GridView を取得できません。

HTML での ASP 参照のコードが最小限である GridView があります。

<asp:GridView id="grid" runat="server" AutoGenerateColumns="False" AllowSorting="True">
</asp:GridView>

コード ビハインドでは、動的に作成された SqlDataSource をアタッチします (含まれる列は常に同じであるとは限らないため、作成に使用される SQL は実行時に構築されます)。例えば:

柱を立てた...

BoundField column = new BoundField();
column.DataField = columnName;
column.HeaderText = "Heading";
column.SortExpression = columnName;

grid.Columns.Add(column);

データソース...

SqlDataSource dataSource = new SqlDataSource(
    "System.Data.SqlClient",
    connectionString, 
    generatedSelectCommand);

それからグリッドビュー...

grid.DataSource = dataSource;
grid.DataKeyNames = mylistOfKeys;
grid.DataBind();

現時点では、列データを並べ替えると予想されるときに、ユーザーが列見出しをクリックしても何も起こりません。私が見逃しているものは誰ですか?

これを行うためのより良い方法があれば、これは私には面倒に見えるので、それも役に立ちます!

4

4 に答える 4

6

Sorting ハンドラーで DataBind() を呼び出す前に、datasource.SelectCommand を再割り当てすることもできます。このようなもの:

protected void gvItems_Sorting(object sender, GridViewSortEventArgs e)
{
    GridView gv = (GridView)sender;
    SqlDataSource ds = (SqlDataSource)gv.DataSource;
    ds.SelectCommand = ds.SelectCommand + " order by " 
        + e.SortExpression + " " + GetSortDirection(e.SortDirection);
    gvItems.DataSource = ds;
    gvItems.DataBind();
}

string GetSortDirection(string sSortDirCmd)
{
    string sSortDir;
    if ((SortDirection.Ascending == sSortDirCmd))
    {
        sSortDir = "asc";
    }
    else
    {
        sSortDir = "desc";
    }
    return sSortDir;
}

これが助けになることを願っています。実装するために追加のヘルプが必要な場合はお知らせください。

楽しみ!

于 2010-12-13T15:11:07.167 に答える
4

まず、イベントを追加する必要があります:

<asp:GridView AllowSorting="True" OnSorting="gvName_Sorting" ...

次に、そのイベントは次のようになります。

protected void gvName_Sorting( object sender, GridViewSortEventArgs e )
{
    ...
    //rebind gridview
}

基本的に、データを再度取得する必要があります。

あなたはそれが乱雑に見え、より良い方法があることは正しいです:ASP.Net MVC

残念ながら、これは大幅に異なるページ モデルです。

于 2008-09-26T09:39:15.823 に答える
0

遅くなるよりはましですか?

基本的に正しいものであるキースの提案のためのいくつかの追加。

真実は、gridView_Sortingイベントでの並べ替えを処理する必要があるということです。たとえばPage_Loadイベントで、以前にGridViewをDataBind()する必要はありません。そこでは、.DataBind()ではなくGridView.Sort()メソッドのみを呼び出す必要があります。方法は次のとおりです。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then

        Me.gridView.Sort(Request.QueryString("sortExpression"), Request.QueryString("sortDirection"))

    End If

End Sub

次に、gridView_Sortingイベントを見てみましょう。

そこで、データソースを適切な並べ替えにプッシュする必要があります。GridView自体はそれを処理しません(この場合は少なくとも)。

Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gridView.Sorting
    If IsPostBack Then
        e.Cancel = True
        Dim sortDir As SortDirection = SortDirection.Ascending
        If e.SortExpression = Me.Q_SortExpression And Me.Q_SortDirection = SortDirection.Ascending Then
            sortDir = SortDirection.Descending
        End If
        RedirectMe(e.SortExpression, sortDir)
    Else
        Dim sortExpr As String = e.SortExpression + " " + IIf(e.SortDirection = SortDirection.Ascending, "ASC", "DESC")
        Dim dv As System.Data.DataView = Me.dsrcView.Select(New DataSourceSelectArguments(sortExpr))
        Me.gridView.DataSource = dv
        Me.gridView.DataBind()
    End If
End Sub

ソートパラメータをストアドプロシージャに渡すなど、データソースにソート機能をコーディングする必要はありません。すべての並べ替えは、上記のコードで行われます。

さらに、gridView.EnableViewStateをFalseに切り替えると、ネットワークトラフィックとブラウザのページが大幅に明るくなります。ページがポストバックされるたびにグリッドが完全に再作成されるため、これを行うことができます。

良い1日を!

マーティン

于 2010-06-03T10:39:24.890 に答える
0

これについてはわかりませんが、標準の SqlDataSource を使用し、フィールドをクリックしてそのフィールドに従って並べ替えると、SqlDataSource にデータが再度入力され、グリッドに再バインドされます。そのため、並べ替えはクライアント側では行われず、SQLDataSource の selectmethod が DataReader でない場合にのみ実行できます。

並べ替えイベントを処理するとき、SqlDataSource を再作成して GridView に再バインドしますか? ソート フィールドと方向を、使用する generatedSelectCommand に入れることはできますか? または、SQLDataSource の SortParameterName プロパティに入れますか?

SqlDataSource をグリッドに再バインドする必要があることは間違いありません。その場で作成するため、再度入力する必要があります。

于 2008-09-26T09:30:22.427 に答える