2012-02-19 44 views
4

我已经能够从类似的帖子找到关于这个问题的所有帮助是不是为我如何设置我的GridView。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 

的排序和分页的工作,我只是不知道我在我的分页方法要记住的那种改变。谢谢你的帮助!

+0

你应该只使用一个'GetData'方法,应该把sortexpression作为参数(就像你的SortGridView一样)。这必须从PageIndexChanging和Sorting中调用(如果不是ispostback,则从page_load中调用)。 – 2012-02-19 17:14:04

+0

感谢Tim的回应。我仍然在学习所有这些,所以我不确定如何实施这个建议。我看到SortGridView是如何得到它的参数的,但我不确定如何将值传递给每个实例的GetData。你能描述一下我需要进一步改变吗?再次感谢您的帮助 – Cineno28 2012-02-19 18:09:55

回答

3

这里有包括寻呼一个完整的示例代码,排序和数据绑定:

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 
+0

非常感谢您的支持!对此,我真的非常感激!我在Page_Load中添加了行以插入FirstName和LastName列。 (我的原始Page_Load中的前10行)。我现在遇到的问题是列将进行排序并正确页面,但如果我单击一列以将其从Desc重新排序为Asc,似乎不会这样做。还有什么我需要改变。再次感谢您的帮助! – Cineno28 2012-02-19 22:32:29

+0

@Cineno:我已经添加了两分钟前创建列的方法;)你是否已经修改了**我的所有代码?调试'GridView1_Sorting'。 – 2012-02-19 22:36:11

+0

再次感谢您的帮助。我使用了您提供的代码,但是当我尝试运行它时,我收到一条消息,说PageIndexChanging和Sorting不能是私有的,所以我将它们更改为Public以使其运行。这可以吗?对不起,如果这是一个业余爱好者的问题,我是新来的。我通过逐步调试来调试排序。如果我正确地遵循它,它可能会被调用两次,因此在尝试将Desc改为Asc时,它会回到Desc。 – Cineno28 2012-02-19 23:03:50

0

后的“企业”决定与GridView的Web窗体应用程序所需的特定“的事件等等第2页......”随着所有活动,回传,REDIRECTS等等......我得出了解放的结论。

  1. 我不保持这个应用对于一些重击与公司大量的流量(因此我的解决方案使用的数据库)
  2. 会话并不伟大的时间,并在使用2个节点服务器循环赛
  3. 隐藏字段都会丢失各种动作
  4. ViewState获取各种动作
  5. 饼干不会有用户在使用不同的电脑
  6. 查询字符串的工作失去了 - 丑陋的一些问题与它一起。

我的解决方案的愿望是什么天才是跳过所有这些并将重要数据的字符串保存到json数据库表中。

我意识到这不是每个人都想做的事情,而是在与我的不同情况下。它是如此令人耳目一新,没有大量的逻辑检查和设置ViewState等..