行196-200では、「適用」と「閉じる」のButtonを定義しています。適用ボタンには、OnClickイベントを登録しています。OnClickイベントでは、選択済みのListBoxからカラムを取得してSession変数に保存して親ウィンドウに渡します。閉じるボタンには、クライアント側で動作するonClickイベントを登録します。クライアント側のonClickイベントでは、子ウィンドウを閉じます。</html>◆サブプログラムPopupColumns.aspxの解説(コード編)PopupColumns.aspxは、Webフォームから選択したカラムをSession変数に保存して親ウィンドウに渡します。Session変数を親ウィンドウに渡すには、子ウィンドウから親ウィンドウをポストバックさせる必要があります。Page_Load()イベントの処理このイベントは、ページがロードされたときに発生します。このイベントでは、ページの初期化を行います。行9では、Session変数に保存されているカラムを取得します。Ifでは、ページが最初にロードされたか調べています。ページが最初にロードされたときは、閉じるボタンにクライアント側で動作するonClickイベントを登録しています。onClickイベントでは、、JavaScriptのwindow.close()メソッドを実行して子ウィンドウを閉じます。行12では、BindAvailableListBox()を呼び出してListBoxに選択可能なカラムをバインドします。行13では、BindSelectedListBox()を呼び出してListBoxに選択済みのカラムをバインドします。選択済みのカラムは、Session変数に保存されています。クリックしたときに発生します。このイベントでは、左側のListBoxから選択したアイテムを右側のListBoxに移動します。行18-20では、左側のListBoxからアイテムが選択されているか調べています。選択されていないときは、何もしないで戻ります。行21では、ListBoxから選択したアイテム(ListItem)を取得しています。行22では、右側のListBoxに、選択したアイテムを追加しています。アイテムを追加するには、ItemsコレクションのAdd()メソッドを使用します。Add()メソッドの引数には、ListItemを指定します。ListItemの引数には、Text/Valueプロパティを指定します。行23では、左側のListBoxから選択したアイテムを削除します。アイテムを削除するには、ItemsコレクションのRemoveAt()メソッドを使用します。RemoveAt()メソッドには、アイテムのインデックス番号を指定します。ListBoxのSelectedIndexプロパティには、選択したアイテムのインデックス番号が格納されています。クリックしたときに発生します。このイベントでは、左側のListBoxからすべてのアイテムを右側のListBoxに移動します。Each...Nextでは、ListBoxのItemsコレクションからListItemを取り出しています。行29では、ItemsコレクションのAdd()メッドで右側のListBoxにアイテムを追加しています。行31では、ItemsコレクションのClear()メソッドで左側のListBoxからすべてのアイテムを削除しています。クリックしたときに発生します。このイベントでは、右側のListBoxから選択したアイテムを左側のListBoxに戻します。行35-37では、右側のListBoxからアイテムが選択されているか調べています。選択されていないときは、何もしないで戻ります。行38では、ListBoxから選択したアイテム(ListItem)を取得しています。行39では、左側のListBoxに、選択したアイテムを追加しています。アイテムを追加するには、ItemsコレクションのAdd()メソッドを使用します。行40では、右側のListBoxから選択したアイテムを削除します。アイテムを削除するには、ItemsコレクションのRemoveAt()メソッドを使用します。クリックしたときに発生します。このイベントでは、右側のListBoxからすべてのアイテムを左側のListBoxに戻します。Each...Nextでは、ListBoxのItemsコレクションからListItemを取り出しています。行46では、ItemsコレクションのAdd()メッドで左側のListBoxにアイテムを追加しています。行48では、ItemsコレクションのClear()メソッドで右側のListBoxからすべてのアイテムを削除しています。btnApply_Click()イベントの処理このイベントは、Webフォームから適用ボタンをクリックしたときに発生します。このイベントでは、Webフォームから選択したカラムを取得して親ウィンドウに渡します。Withでは、StringBuilderのAppend()メソッドでListBoxから選択したカラムを追加しています。行55では、右側のListBoxからListItemCollectionを作成しています。このListItemCollectionには、選択したアイテムのListItemが格納されています。Each...Nextでは、ListItemCollectionからListItemを取り出してValueプロパティの値をStringBuilderのAppend()メソッドで追加しています。ContactName,...)が格納されています。行64では、Session変数に選択したカラムを保存しています。複数のカラムを選択したときは、コンマ区切りで格納されます。Withでは、StringBuilderのAppend()メソッドで以下のJavaScriptを生成しています。Columns)を設定しています。TextBoxが書き換えられると、クライアント側で動作するonPropertyChangeイベントが実行されてWebページがポストバックされます。親ウィンドウがポストバックされると、Page_LoadイベントでSession変数に保存されているカラムを取得して、DataGridにカラムを追加します。行73では、Page.RegisterClientScriptBlock()メソッドでJavaScriptを登録しています。ここで登録したJavaScriptは、Webページがロードされたときにクライアント側のブラウザから実行されます。BindAvailableListBox()の処理このサブプロシージャでは、ListBoxに選択可能なカラムを表示します。BindAvailableListBoxは、Page_Loadイベントから呼ばれます。Ifでは、得意先IDのカラムが選択されているか調べています。選択されていないときは、ListBoxのItemsコレクションのAdd()メソッドで得意先IDのカラムを追加します。カラムが選択されていないか調べてListBoxに追加します。BindSelectedListBox()の処理このプロシージャは、ListBoxに選択されているカラムを表示します。BindSelectedListBoxは、Page_Loadイベントから呼ばれます。行100では、すでに選択されているカラムを分割して配列変数に格納します。行104-118のFor...Nextでは、配列変数からカラムを取り出してListBoxに追加します。カラムをListBoxに追加するには、ItemsコレクションのAdd()メソッドを使用します。Add()メソッドの引数には、ListItemを指定します。</script>NoteDataGridにダイナミックに追加したカラムをPage_Loadイベントの前に復元するにはDataGridにダイナミックに追加したカラムはViewStateに保存されないため、Webページがポストバックされたときに復元されません。このため、Webページがポストバックされる度に、DataGridにカラムを追加する必要があります。このサンプルでは、Page_LoadイベントでWebページがポストバックされたときにダイナミックにカラムを追加してDataGridを復元しています。ダイナミックに追加したカラムをPage_Loadイベントが発生する前に復元させるには、LoadViewStateをオーバライドしてDataGridにカラムを追加します。LoadViewStateは、Page_Loadイベントが発生する前に実行されますので、Page_Loadイベントから見た場合DataGridにダイナミックに追加されたカラムが常に復元されています。以下のサンプルでは、Session("DisplayColumns")変数に保存されているカラムをLoadViewStateイベントでDataGridに追加しています。Page_Loadイベントが発生するときには、DataGridにカラムが追加された状態になっています。Session変数には、子ウィンドウから選択したカラムが保存されています。TemplateColumn()でTemplateColumnのインスタンスを生成します。TemplateColumnのHeaderTextなどのプロパティは、BoundColumnと同じように設定することができます。ItemTemplateを生成するには、ItemTemplate専用のクラスを作成する必要があります。このサンプルでは、DynamicItemTemplateのクラスを作成してLabelコントロールに得意先名(CompanyName)をバインドしています。TemplateColumnのItemTemplateに、DynamicItemTemplateのインスタンスを設定したら、DataGridのColumnsコレクションのAdd()メソッドでTemplateColumnを追加します。WithdgrdCustomers.Columns.Add(tc1)ItemTemplateのLabelにデータをバインドするには、AddHandlerでLabelにデータをバインドするイベントを登録する必要があります。BindLabelイベントでは、得意先名がNullか調べてNullのときは、LabelのTextプロパティに(Null)を設定します。Nullでないときは、DataItemから得意先名を取得してLabelのTextに設定します。これで、ItemTemplateに得意先名が表示されます。DataGrid2のホームへ戻る。