如果使用自定义DataSource,如何对ASP.NET GridView中的列进行排序?

Ben*_*n L 4 c# asp.net gridview sqldatasource

当我使用自定义SqlDataSource时,我无法使用GridView使用户能够对数据列进行排序.

我有一个GridView,其中HTML中引用它的代码是最小的:

<asp:GridView id="grid" runat="server" AutoGenerateColumns="False" AllowSorting="True">
</asp:GridView>
Run Code Online (Sandbox Code Playgroud)

在代码隐藏中,我附加了一个动态创建的SqlDataSource(它包含的列并不总是相同,因此用于创建它的SQL是在运行时构造的).例如:

我设置了专栏......

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

grid.Columns.Add(column);
Run Code Online (Sandbox Code Playgroud)

数据源......

SqlDataSource dataSource = new SqlDataSource(
    "System.Data.SqlClient",
    connectionString, 
    generatedSelectCommand);
Run Code Online (Sandbox Code Playgroud)

那么gridview ......

grid.DataSource = dataSource;
grid.DataKeyNames = mylistOfKeys;
grid.DataBind();
Run Code Online (Sandbox Code Playgroud)

当我希望它对列数据进行排序时,当用户点击列标题时,没有任何反应.任何想法,我缺少什么?

如果有一个更好的方式这样做也会有所帮助,因为这看起来很混乱!

小智 5

您还可以在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;
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.如果您需要额外的帮助来实现它,请告诉我.

请享用!


Kei*_*ith 4

首先您需要添加一个事件:

<asp:GridView AllowSorting="True" OnSorting="gvName_Sorting" ...
Run Code Online (Sandbox Code Playgroud)

那么该事件看起来像:

protected void gvName_Sorting( object sender, GridViewSortEventArgs e )
{
    ...
    //rebind gridview
}
Run Code Online (Sandbox Code Playgroud)

您基本上必须再次获取数据。

你是对的,它看起来很乱,有更好的方法:ASP.Net MVC

不幸的是,这是一个完全不同的页面模型。