2012-02-19 12 views
4

この問題に関して同様の投稿から私が見つけたすべてのヘルプは、GridViewをどのように設定するのか機能しません。Gridviewがページングの後で並べ替えを維持しない

グリッドビューに動的に作成された列を持たせ、ソートを実行できるようにしました。私のページングも機能しますが、最初にソートして別のページに行くと、ソートが失われます。

並べ替えを覚えておくために、ページング方法を変更する必要はありますか?ここで

は、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

SortExpressionをパラメータとして(SortGridViewと同じように)行うGetDataメソッドを1つだけ使用してください。これは、PageIndexChangingとSorting(およびispostbackでない場合はpage_load)から呼び出される必要があります。 –

+0

応答Timに感謝します。私はまだこのすべてを学んでいるので、私はこのアドバイスをどのように実装するのか分かりません。私はSortGridViewがどのようにパラメータを取得しているのか分かりますが、各インスタンスのGetDataに値を渡す方法がわかりません。私が少し変更する必要があることを説明できますか?助けてくれてありがとう – Cineno28

答えて

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

ありがとうございます!ほんとうにありがとう! First_Length列とFirstName列を挿入するために、Page_Loadに行を追加しました。 (元のPage_Loadの最初の10行)。私が今行っている問題は、カラムがソートされ、適切にページングされるということですが、カラムをクリックしてDescからAscにソートすると、それを行うようには見えません。私は変更する必要がある何か他にありますか?すべてのあなたの助けをありがとう! – Cineno28

+0

@Cineno:2分前に列を作成するメソッドを追加しました;)すべてのコードを**すべて**適用しましたか? 'GridView1_Sorting'をデバッグしてください。 –

+0

再び助けてくれてありがとう。あなたが提供したコードを使用しましたが、実行しようとしたときにPageIndexChangingとSortingがプライベートにならないというメッセージが表示されていましたので、Publicに変更して実行しました。それは大丈夫ですか?申し訳ありませんが、アマチュアの質問ですが、これは初めてです。私はそれをステップ実行してソートをデバッグしました。私がそれに従っているなら、それは2度呼ばれるかもしれないので、DescをAscに変更しようとしている間、それはDescに戻ります。 – Cineno28

0

「ビジネス」はGridViewの持つWebフォームアプリケーションは、特定の必要があると判断した後、「事件などのために2ページを...」とすべてのイベント、ポストバック、リダイレクトなど...私は解放的な結論に達しました。

  1. 私は大量のトラフィック(データベースを使用して、したがって私の解決策)
  2. セッションがタイムアウトのために大きくないと、いくつかの重いヒット会社のため、このアプリケーションを維持し、サーバーラウンドロビンのための2つのノードを使用していませんよ醜いといくつかの問題 -
  3. 隠しフィールドは
  4. ViewStateが
  5. クッキーは、ユーザーが別のコンピュータに
  6. クエリ文字列を使用して仕事に行くされていない様々なアクションに失われるさまざまなアクションに失われますそれと一緒に。

私のソリューションの希望はこれをすべてスキップし、重要なデータの文字列をjsonのデータベーステーブルに保存することではありません。

私はこれが誰もが望むものではなく、私のようなさまざまな状況で実現していることを認識しています。何度もロジックをチェックしてViewStateなどをチェックしないように爽快です。

関連する問題