我不能让我的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();
目前,当用户单击列标题时,我希望它列数据进行排序没有任何反应。 任何人任何想法什么我失踪?
如果有这样做,这将是有益的太,因为这看起来杂乱无章我的更好的方式!
首先,你需要添加一个事件:
<asp:GridView AllowSorting="True" OnSorting="gvName_Sorting" ...
然后,该事件是这样的:
protected void gvName_Sorting( object sender, GridViewSortEventArgs e )
{
...
//rebind gridview
}
基本上,你必须重新获取数据。
你说得对,它看起来凌乱,有一个更好的办法:ASP.Net MVC
不幸的是,这是一个显着不同的页面模型。
你也可以只重新分配在分拣处理程序的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;
}
我希望这帮助。 让我知道你是否需要额外的帮助来实现它。
请享用!
我不知道这一个,但如果你使用一个标准的SqlDataSource和你点击一个字段根据该字段进行排序时,SqlDataSource与数据再次填充,这是反弹到电网。 因此,排序不会发生在客户端,也可以做,只有当在SqlDataSource的selectmethod不DataReader的。
当处理排序时,你重新创建SqlDataSource和它反弹到GridView? 你可以把排序字段和方向的generatedSelectCommand,你用哪个呢? 或者把它在SqlDataSource的SortParameterName财产?
我绝对相信,你必须在SqlDataSource反弹到网格,因为你动态创建它,你必须再填充它。
迟到总比不到好?
有些此外基思的建议基本上是正确的。
事实是,你必须处理与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这导致页面是网络流量和浏览器以及轻得多。 能做到这一点,因为网格是完全重新每当页面后回来。
祝你今天愉快!
马丁