.NET TIPS [ASP.NET]TreeViewコントロールで深階層のツリー情報を効率よく読み込むには?[2.0のみ、C#、VB]山田 祥寛2006/06/23 |
![]() |
|
「TIPS:[ASP.NET]データベースからツリー・メニューを作成するには?」でも紹介したように、TreeViewコントロールを利用することで、データベース上で管理されたメニュー情報から動的にツリー形式のメニューを生成することが可能になる。
しかし、前掲のTIPSで紹介した内容には、1つ問題がある。というのも、サイトの規模によっては、メニュー情報も(当然)膨大な分量になり、また階層も深くなる可能性がある。このようなサイトにおいて、初回起動時にすべてのツリー・ノードを展開しようとすると、処理にも時間がかかり、ひいてはアプリケーション全体のパフォーマンスを悪化させる原因になるだろう。
そこで本稿では、TreeViewコントロール(System.Web.UI.WebControls名前空間)を展開するタイミングで、必要なノードのみを展開する方法を紹介する。本稿のテクニックを利用することで、深階層のツリー情報を表示する場合にも、より高いパフォーマンスを期待できる。
それではさっそく、具体的な構築の手順をVisual Studio 2005(以降、VS 2005)環境を前提に見ていくことにしよう。なお、本稿のサンプル・プログラムを利用するには、前掲のTIPSに従って、データベース上にサイトマップ情報を格納するためのsitemapテーブルを作成しておく必要がある。
1. TreeViewコントロールを配置する
まずは、フォーム・デザイナからTreeViewコントロールを配置してみよう。
TreeViewコントロールを利用するのに必要な主な操作は、TreeViewコントロール右肩の[TreeView タスク]メニューを選択することで行えるが、ここでは[オートフォーマット]を選択し、ツリー・ビューの外観だけを整えてみよう。いくつかデフォルトのフォーマットが用意されているが、ここでは「Windowsヘルプ」を選択している。
![]() |
[オートフォーマット]ダイアログ |
本ダイアログは、[TreeView タスク]メニューから[オートフォーマット]を選択することで表示できる。ここでは「Windowsヘルプ」を選択している。 |
また、以下の表の要領でTreeViewコントロールのプロパティ情報を設定しておこう。
プロパティ | 設定値 |
(ID) | tree |
EnableClientScript | False |
ExpandDepth | 0 |
![]() |
|
TreeViewコントロールのプロパティ情報 |
ExpandDepthプロパティは、TreeViewコントロールが最初に表示されたときに展開されるレベル数を表す。本稿のサンプル・プログラムでは、下位ノードの読み込みをノード展開の都度に行うので、ここではトップ・ノードのみを表示するように0と指定しておく。
EnableClientScriptプロパティは、TreeNodeコントロール上のノードを展開/折りたたみする際に、クライアント・サイド・スクリプトで処理するかどうかを表す。本稿では、ノード展開の都度、サーバ・サイドでデータベースに対して下位ノードの情報を検索処理する必要があるので、False(無効)としておく。
以上で、ツリー・メニューの外観にかかわる設定は完了だ。ここで参考までにVS 2005によって自動生成されたコードを引用しておく(ただし、<%--〜--%>は筆者コメント)。
|
|
VS 2005により自動生成されたTreeViewコントロールの外観に関するソース・コード |
2. ツリーにデータをバインドする
もっとも、これだけでは単なる抽象的なツリーの定義にすぎないので、ページがロードされたタイミング、ノードを展開するタイミングで、それぞれデータベースから必要なメニュー情報を読み込み、TreeViewコントロールに展開する必要がある。
以下に、その具体的なコードを見てみよう。なお、環境によって変動する可能性があるデータベース接続文字列を個々の.aspxファイルにハード・コーディングすることは好ましくない。ここではデータベース接続文字列は、構成ファイル(Web.config)上であらかじめ定義されているものとする(接続文字列の定義に関する詳細は、拙稿「無償データベース SQL Server 2005 Express Editionを使ってみよう」をご参照いただきたい)。
|
|
データベースから動的にツリー・メニューを生成するWebフォーム(C#:TreeView_DbPopulate_cs.aspx.cs) |
|
|
データベースから動的にツリー・メニューを生成するWebフォーム(VB:TreeView_DbPopulate_vb.aspx.vb) |
上記のコードでポイントとなるのは、下位ノードの読み込みをTreeNodePopulateイベントの発生したタイミングで行っているという点だ。TreeNodePopulateイベントは、ツリーの各ノードを展開したタイミングで発生する。本稿のサンプル・プログラムでは、TreeNodePopulateイベントに対応するイベント・ハンドラはtree_TreeNodePopulateメソッドだ。
tree_TreeNodePopulateメソッドでは、第2パラメータに引き渡されるTreeNodeEventArgsオブジェクト(System.Web.UI.WebControls名前空間)のNodeプロパティにより、展開対象のノードがTreeNodeオブジェクト(System.Web.UI.WebControls名前空間)として返される。
CreateNodeメソッドは、取得したTreeNodeオブジェクトに属する子ノード群をデータベースから取得し、現在のツリーに追加する。基本的なロジックは、前掲の「TIPS:[ASP.NET]データベースからツリー・メニューを作成するには?」とほぼ同等であるので、詳細はそちらを参照していただきたい。
本稿で注目していただきたいのは、追加ノード(TreeNodeオブジェクト)のPopulateOnDemandプロパティにTrueを指定しているという点だ。このプロパティをTrueに設定することで動的ノード・ポピュレーション機能を有効にし、実行時にノード・データを設定することが可能になる。ノード・データの設定には、前述のTreeNodePopulateイベント・ハンドラを使用すればよい。また、ポストバック処理時のキー値としてValueプロパティに、カレント・ノードのURLをセットしている点にも注目してほしい。
以上が理解できたら、さっそく、サンプル・コードを実行してみよう。
![]() |
サンプル・プログラムの実行結果 |
データベースに格納した内容に従って、このようなツリーが表示されれば成功だ。ノード展開のたびにポストバックが発生し、下位ノードの情報が読み込まれていることが確認できるはずだ。
利用可能バージョン:.NET Framework 2.0のみ カテゴリ:Webフォーム 処理対象:ナビゲーション 使用ライブラリ:TreeViewコントロール(System.Web.UI.WebControls名前空間) 使用ライブラリ:TreeNodeEventArgsクラス(System.Web.UI.WebControls名前空間) 使用ライブラリ:TreeNodeクラス(System.Web.UI.WebControls名前空間) 関連TIPS:[ASP.NET]データベースからツリー・メニューを作成するには? |
![]() |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
![]() |
|
|
|
![]() |