我从类似帖子中找到的有关此问题的所有帮助都不适用于我如何设置GridView.
我已经让我的Gridview拥有动态创建的列,并且能够对其进行排序.我的分页也可以,但是如果我先排序然后转到另一个页面,它就会失去排序.
在我的Paging方法中需要更改什么来记住排序?
这是GridView的代码:
Protected Sub Page_Load(ByVal sender As Object,ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then Dim curLastName As New BoundField curLastName.HeaderText = "Last Name" curLastName.datafield = "LastName" curLastName.sortExpression = "LastName" GridView1.Columns.Insert(0,curLastName) Dim curFirstName As New BoundField curFirstName.HeaderText = "First Name" curFirstName.datafield = "FirstName" curFirstName.sortExpression = "FirstName" GridView1.Columns.Insert(1,curFirstName) Dim dt As DataTable = GetData().Tables(0) Dim dv As New DataView(dt) GridView1.DataSource = dv GridView1.DataBind() End If End Sub Private Function GetData() As DataSet Dim connectionstr As String connectionstr = ConfigurationManager.ConnectionStrings("dbConnectionString").ConnectionString.ToString() Dim myConnection As New sqlConnection(connectionstr) Dim ad As New sqlDataAdapter("SELECT * FROM EmployeeList where lastname like 'wil%'",myConnection) Dim ds As New DataSet() ad.Fill(ds) Return ds End Function Public Property GridViewSortDirection() As SortDirection Get If ViewState("sortDirection") Is nothing Then ViewState("sortDirection") = SortDirection.Ascending End If Return DirectCast(ViewState("sortDirection"),SortDirection) End Get Set(ByVal value As SortDirection) ViewState("sortDirection") = value End Set End Property Protected Sub GridView1_Sorting(ByVal sender As Object,ByVal e As GridViewSortEventArgs) Dim sortExpression As String = e.sortExpression If GridViewSortDirection = SortDirection.Ascending Then GridViewSortDirection = SortDirection.Descending SortGridView(sortExpression,"DESC") Else GridViewSortDirection = SortDirection.Ascending SortGridView(sortExpression,"ASC") End If End Sub Private Sub SortGridView(ByVal sortExpression As String,ByVal direction As String) Dim dt As DataTable = GetData().Tables(0) Dim dv As New DataView(dt) dv.sort = sortExpression & " " & direction GridView1.DataSource = dv GridView1.DataBind() End Sub Protected Sub GridView1_PageIndexChanging(ByVal sender As [Object],ByVal e As GridViewPageEventArgs) GridView1.PageIndex = e.NewPageIndex Dim dt As DataTable = GetData().Tables(0) Dim dv As New DataView(dt) GridView1.DataSource = dv GridView1.DataBind() End Sub
解决方法
这是一个完整的示例代码,包括分页,排序和数据绑定:
Sub Page_load(sender As Object,e As EventArgs) Handles Me.Load If Not Page.IsPostBack Then CreateGridColumns() BindGrid() End If End Sub Public Property SortExpression As String Get If ViewState("SortExpression") Is nothing Then ViewState("SortExpression") = "LastName ASC" End If Return ViewState("SortExpression").ToString End Get Set(value As String) ViewState("SortExpression") = value End Set End Property Private Sub CreateGridColumns() Dim curLastName As New BoundField curLastName.HeaderText = "Last Name" curLastName.datafield = "LastName" curLastName.sortExpression = "LastName" GridView1.Columns.Insert(0,curLastName) Dim curFirstName As New BoundField curFirstName.HeaderText = "First Name" curFirstName.datafield = "FirstName" curFirstName.sortExpression = "FirstName" GridView1.Columns.Insert(1,curFirstName) End Sub Private Sub BindGrid() Try Dim tblData = New DataTable Using sqlCon As New sqlClient.sqlConnection(ConfigurationManager.ConnectionStrings("dbConnectionString").ConnectionString.ToString()) Dim sql As String = "SELECT * FROM EmployeeList ORDER BY {0}" Dim sqlCmd = New sqlClient.sqlCommand() sqlCmd.CommandText = String.Format(sql,Me.sortExpression) sqlCmd.Connection = sqlCon Using objAdapter As New sqlClient.sqlDataAdapter(sqlCmd) objAdapter.Fill(tblData) End Using End Using GridView1.DataSource = tblData GridView1.DataBind() Catch ex As Exception ' Todo: log error ' throw End Try End Sub Private Sub GridView1_PageIndexChanging(sender As Object,e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles GridView1.PageIndexChanging Me.GridView1.PageIndex = e.NewPageIndex BindGrid() End Sub Private Sub GridView1_Sorting(sender As Object,e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles GridView1.sorting Dim currentSortColumn,currentSortDirection As String currentSortColumn = Me.sortExpression.Split(" "c)(0) currentSortDirection = Me.sortExpression.Split(" "c)(1) If e.sortExpression.Equals(currentSortColumn) Then ' switch sort direction ' Select Case currentSortDirection.toupper Case "ASC" Me.sortExpression = currentSortColumn & " DESC" Case "DESC" Me.sortExpression = currentSortColumn & " ASC" End Select Else Me.sortExpression = e.sortExpression & " ASC" End If BindGrid() End Sub