●並べ替えにオートリバース機能を追加 (ch54DataGrid2.aspx)
DataGridの並べ替えにオートリバース機能を追加して、列を昇順/降順に並べ替えできるようにします。このサンプルでは、以下のノウハウを習得することができます。
▼DataGridの列を昇順/降順に並べ替える方法
▼ページクラスにプロパティを追加する方法
▼ビューステート(ViewState)の使い方
▼DataViewをキャシングして並べ替えを高速化する方法
1. SortExpression/SortDirectionプロパティ追加
ch54DataGrid1.aspxの未使用領域をダブルクリックして、コードビューに切り替えます。コードビューが表示されたら、モジュールクラスの最後に、以下のSortExpressionとSortDirectionプロパティを追加します。
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)
Handles 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,
ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs)
Handles 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]を右クリックしてブラウザに表示します。DataGridにCustomers表が表示されます。デフォルトでは、得意先IDの昇順に表示されます。DataGridのヘッダーから[ID]のリンクをクリックすると、得意先IDの降順に表示されます。このサンプルでは、ヘッダーのリンクをクリックすると昇順/降順を自動的に切り替えます。

図 DataGridの列を昇順/降順に自動切換えする
■解説
DataGridの並べ替えを昇順/降順に自動的に切り替えるには、カレントの状態をWebページがポストバックされても保持しておく必要があります。このサンプルでは、カレントの状態をビューステートに保存して保持しています。
ビューステートには、SortExpressionとSortDirectionを格納します。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_Load→DataGrid1_SortCommandの順にイベントが発生します。DataGrid1_SortCommandイベントでは、BindGridメソッドを実行してOracleデータベースのCustomers表からすべての行を読み込んで並べ替えします。
Private Sub DataGrid1_SortCommand(ByVal source As Object,
ByVal e As System.Web.UI.WebControls.DataGridSortCommandEventArgs)
Handles 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表が格納されているDataViewをWebサーバーのメモリ上にキャッシュします。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