ASP.NET 徹底活用術のホームへ戻る

■複数の列を並べ替える ~dg5.aspx/dg5Sort.aspx

 

ポップアップウィンドにDataGridの列名の一覧を表示して、複数の列を昇順/降順に並べ替えできるようにします。親ウィンドウ(dg5.aspx)には、並べ替えのイメージボタンを配置します。[並べ替え]のボタンをクリックすると、ブラウザ側で動作するJavaScriptを登録してポップアップウィンドウ(dg5Sort.aspx)を開きます。

 

ポップアップウィンドウには、DropDownListDataGridButtonを配置しています。DropDownListには列名の一覧を表示します。DropDownListから列名を選択して[追加]ボタンをクリックすると、DataGridに移動します。DataGridからは、列の並べ替え順(昇順/降順)を選択することができます。[削除]ボタンをクリックすると、DropDownListに戻ります。

 

DropDownListから1個または複数の列名を選択したら、[適用]ボタンをクリックします。ポップアップウィンドウから[適用]ボタンをクリックすると、並べ替えする列名と昇順/降順の情報を親ウィンドウのTextBox(txtMessage)に書き込んだあと、親ウィンドウをポストバックさせます。親ウィンドウがポストバックしたら、TextBoxから並べ替えする情報を取得してDataGridを並べ替えします。

 

ポップアップウィンドウから親ウィンドウをポストバックさせる仕組み

 

dg5.aspxTextBoxOnPropertyChangeイベント登録

Page_Loadイベントハンドラで、TextBox(txtMessage)にクライアント側で動作するOnPropertyChangeイベントを登録します(TextBoxTextプロパティを書き換えると、OnProperyChangeイベントが発生してdg5.aspxがポストバックされて、ボタン(btnRefresh)のクリック時のイベントハンドラが実行されるようにします)。

 

TextBoxAttributesコレクションのAddメソッドを実行すると、次のようなOnPropertyChangeイベントが追加されます。JavaScriptの「__doPostBack('btnRefresh','')」は、GetPostBackEventReferenceメソッドが生成したものです。

<asp:TextBox id="txtMessage" runat="server"

  OnPropertyChange="__doPostBack('btnRefresh','')" ... />

 

Private Sub Page_Load(...)

  txtMessage.Attributes.Add("OnPropertyChange",  _

GetPostBackEventReference(btnRefresh))

End Sub

 

②ポップアップウィンドウ表示

dg5.aspxから[並べ替え]ボタンをクリックすると、RegisterClientScriptBlockメソッドを実行して、次のようなJavaScriptを登録してポップアップウィンドウにdg5Sort.aspxを表示します。

 

<script language='javascript'>

  window.open('dg5Sort.aspx','_blank','...');

</script>

 

③並べ替えする列をdg5.aspxTextBox(txtMessage)に書き込む

dg5Sort.aspxから並べ替えする列を選択して[適用]ボタンをクリックすると、RegisterClientScriptBlockメソッドで次のようなJavaScriptを登録して実行します。JavaScriptが実行されると、txtMessageValueプロパティに並べ替えする列が書き込まれます。このとき、txtMessageOnPropertyChangeイベントが発生して、dg5.aspxをポストバックします。

 

<script language='javascript'>

  window.opener.frmMain.txtMessage.value = '~並べ替えする列~';

</script>

 

④ボタン(btnRefresh)のクリック時のイベントハンドラ実行

dg5.aspxのボタン(btnRefresh)のクリック時のイベントハンドラが実行されて、選択した列が並べ替えられてDataGrid上に表示されます。

 

Public Sub btnRefresh_Click(...)

  Dim strSQL As String

  Dim strSortExpression As String = txtMessage.Text.Trim()

  If strSortExpression = String.Empty Then

    strSQL = "Select * From Customers"

  Else

    strSQL = "Select * From Customers" & _

      " Order By " & strSortExpression

  End If

  txtMessage.Text = strSortExpression

  Dim ds As DataSet = CreateDataSet(strSQL)

 ・・・

End Sub

 

 

図7:ポップアップウィンドウから親ウィンドウをポストバックさせる仕組み

 

 

 

図8:ポップアップウィンドウから都道府県、得意先名、得意先IDを選択して並べ替える

 

 

 

ASP.NET 徹底活用術のホームへ戻る