如何在使用自定义数据源在ASP.NET GridView的列进行排序?(How to sort co

2019-07-05 01:33发布

我不能让我的GridView控件以使用户当我使用自定义SqlDataSource的排序数据的列。

我有一个GridView,其中在ASP参考它的HTML代码是最小:

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

然后在GridView ...

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

目前,当用户单击列标题时,我希望它列数据进行排序没有任何反应。 任何人任何想法什么我失踪?

如果有这样做,这将是有益的太,因为这看起来杂乱无章我的更好的方式!

Answer 1:

首先,你需要添加一个事件:

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

然后,该事件是这样的:

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

基本上,你必须重新获取数据。

你说得对,它看起来凌乱,有一个更好的办法:ASP.Net MVC

不幸的是,这是一个显着不同的页面模型。



Answer 2:

你也可以只重新分配在分拣处理程序的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;
}

我希望这帮助。 让我知道你是否需要额外的帮助来实现它。

请享用!



Answer 3:

我不知道这一个,但如果你使用一个标准的SqlDataSource和你点击一个字段根据该字段进行排序时,SqlDataSource与数据再次填充,这是反弹到电网。 因此,排序不会发生在客户端,也可以做,只有当在SqlDataSource的selectmethod不DataReader的。

当处理排序时,你重新创建SqlDataSource和它反弹到GridView? 你可以把排序字段和方向的generatedSelectCommand,你用哪个呢? 或者把它在SqlDataSource的SortParameterName财产?

我绝对相信,你必须在SqlDataSource反弹到网格,因为你动态创建它,你必须再填充它。



Answer 4:

迟到总比不到好?

有些此外基思的建议基本上是正确的。

事实是,你必须处理与gridView_Sorting事件排序。 有没有必要进行数据绑定()GridView的前面,例如在Page_Load事件。 在那里,你应该只调用GridView.Sort()方法,而不是.DataBind()。 这是怎么一回事呢:

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这导致页面是网络流量和浏览器以及轻得多。 能做到这一点,因为网格是完全重新每当页面后回来。

祝你今天愉快!

马丁



文章来源: How to sort columns in an ASP.NET GridView if using a custom DataSource?