ASP.NET + Oracle Part3 のホームへ戻る

●並べ替えにオートリバース機能を追加 (ch54DataGrid2.aspx)

 

DataGridの並べ替えにオートリバース機能を追加して、列を昇順/降順に並べ替えできるようにします。このサンプルでは、以下のノウハウを習得することができます。

 

DataGridの列を昇順/降順に並べ替える方法

▼ページクラスにプロパティを追加する方法

▼ビューステート(ViewState)の使い方

DataViewをキャシングして並べ替えを高速化する方法

 

 

1. SortExpression/SortDirectionプロパティ追加

 

ch54DataGrid1.aspxの未使用領域をダブルクリックして、コードビューに切り替えます。コードビューが表示されたら、モジュールクラスの最後に、以下のSortExpressionSortDirectionプロパティを追加します。

 

Public Property SortExpression() As String

  Get

    Dim obj As Object = ViewState("SortExpression")

    If obj Is Nothing Then

      Return String.Empty

    End If

    Return CType(obj, String)

  End Get

 

  Set(ByVal Value As String)

    ViewState("SortExpression") = Value

  End Set

End Property

 

Public Property SortDirection() As String

  Get

    Dim obj As Object = ViewState("SortDirection")

    If obj Is Nothing Then

      Return String.Empty

    End If

    Return CType(obj, String)

  End Get

 

  Set(ByVal Value As String)

    ViewState("SortDirection") = Value

  End Set

End Property

 

2. Page_Loadイベントの書き換え

 

コードビューのPage_Loadイベントを、以下のように書き換えます。

 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

cccHandles MyBase.Load

  If Not IsPostBack Then

    Me.SortExpression = "CustomerID"

    Me.SortDirection = "asc"

    BindGrid()

  End If

End Sub

 

3. BindGridメソッドの書き換え

 

コードビューのBindGridメソッドを、以下のように書き換えます。

 

Private Sub BindGrid()

  Dim dv As DataView = CreateDataView("CustomerPackage.GetCustomers")

 

  dv.Sort = Me.SortExpression & " " & Me.SortDirection

  DataGrid1.DataSource = dv

  DataGrid1.DataBind()

End Sub

 

4. DataGrid1_SortCommandイベントの書き換え

 

コードビューのDataGrid1_SortCommandイベントを、以下のように書き換えます。

 

Private Sub DataGrid1_SortCommand(ByVal source As Object,

cccByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs)

cccHandles DataGrid1.SortCommand

  If Me.SortExpression <> e.SortExpression Then

    Me.SortExpression = e.SortExpression

    Me.SortDirection = "asc"

  Else

    If Me.SortDirection = "asc" Then

      Me.SortDirection = "desc"

    Else

      Me.SortDirection = "asc"

    End If

  End If

  BindGrid()

End Sub

 

5. ブラウザに表示

 

ソリューションエクスプローラから[ch54DataGrid2.aspx]を右クリックしてブラウザに表示します。DataGridCustomers表が表示されます。デフォルトでは、得意先IDの昇順に表示されます。DataGridのヘッダーから[ID]のリンクをクリックすると、得意先IDの降順に表示されます。このサンプルでは、ヘッダーのリンクをクリックすると昇順/降順を自動的に切り替えます。

 

fig5-4-7

DataGridの列を昇順/降順に自動切換えする

 

 

■解説

 

DataGridの並べ替えを昇順/降順に自動的に切り替えるには、カレントの状態をWebページがポストバックされても保持しておく必要があります。このサンプルでは、カレントの状態をビューステートに保存して保持しています。

 

ビューステートには、SortExpressionSortDirectionを格納します。SortExpressionにはカレントの列名、SortDirectionにはカレントの並べ替えオプション(Asc/Desc)を格納します。

 

このサンプルでは、ビューステートの値を直接参照/設定する代わりに、プロパティを追加して参照/設定しています。ビューステートを直接参照するとき、その都度Nullのチェックが必要ですが、プロパティ化するとNullを意識せずに参照できます。

 

If Not ViewState("SortDirection") Is Nothing Then

  Dim strDirection As String = ViewState("SortDirection")

  If strDirection = "asc" Then

    ・・・

  End If

End If

 

ページクラスに新規に追加したプロパティは、「Me.」を入力すると候補リストに表示されます。

 

If Me.SortDirection = "asc" Then

  ・・・

End If

 

DataGridに並べ替え機能を追加すると、ヘッダーから見出しをクリックしたときWebページがポストバックされて、Page_LoadDataGrid1_SortCommandの順にイベントが発生します。DataGrid1_SortCommandイベントでは、BindGridメソッドを実行してOracleデータベースのCustomers表からすべての行を読み込んで並べ替えします。

 

Private Sub DataGrid1_SortCommand(ByVal source As Object,

cccByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs)

cccHandles DataGrid1.SortCommand

  If Me.SortExpression <> e.SortExpression Then

    Me.SortExpression = e.SortExpression

    Me.SortDirection = "asc"

  Else

    If Me.SortDirection = "asc" Then

      Me.SortDirection = "desc"

    Else

      Me.SortDirection = "asc"

    End If

  End If

  BindGrid()

End Sub

 

DataGridの並べ替え処理を高速化するには、Customers表が格納されているDataViewWebサーバーのメモリ上にキャッシュします。DataViewをキャッシュするには、BindGridメソッドを以下のように書き換えます。

 

DataViewをキャッシュするには、Cache(“key”) = DataViewのように記述します。キャッシュされているDataViewを取得するには、DataView = Cache(“key”)のように記述します。なお、キャッシュからDataViewを取得したらすでに無効になっていないか必ず確認する必要があります。

 

Private Sub BindGrid()

  Dim dv As DataView = Cache("ch54DataGrid3DataView")

  If dv Is Nothing Then

    dv = CreateDataView("CustomerPackage.GetCustomers")

    Cache("ch54DataGrid3DataView") = dv

  End If

 

  dv.Sort = Me.SortExpression & " " & Me.SortDirection

  DataGrid1.DataSource = dv

  DataGrid1.DataBind()

End Sub

 

ASP.NET + Oracle Part3 のホームへ戻る