祥寛2005/09/09「TIPS:[ASP.NET]データベースからツリー・メニューを生成するには?」でも紹介したように、TreeViewコントロールを利用することで、データベース上のコンテンツ情報から動的にツリー形式のメニューを生成することが可能になる。前掲のTIPSで紹介した内容には、1つ問題がある。いうのも、サイトの規模によっては、コンテンツ情報も(当然)膨大な分量になり、また階層も深くなる可能性がある。このようなサイトにおいて、初回起動時にすべてのツリー・ノードを展開しようとすると、処理にも時間がかかり、ひいてはアプリケーション全体のパフォーマンスを悪化させる原因になるだろう。そこで本稿では、TreeViewコントロールをドリルダウンするタイミングで、必要なノードのみを展開する方法を紹介する。本稿のテクニックを利用することで、深階層のツリー情報を表示する場合にも、より高いパフォーマンスを期待できる。WebBrowserコントロールをインストールし、また、前掲の「TIPS:[ASP.NET]データベースからツリー・メニューを生成するには?」に従って、データベース上にsitemapテーブルを作成しておく必要がある。それではさっそく、具体的なコードを見ていくことにしよう。“Folder”に、かつ、ノードを展開可能な状態にセット。“Folder”に、かつ、ノードを展開可能な状態にセット。/></ie:TreeView></form></body></html>深階層のツリー情報を読み込むために最適化されたWebフォーム(VB.NET版:treeview_perform_vb.aspx)上記のコードでポイントとなるのは、下位ノードの読み込みをExpandイベントの発生したタイミングで行っているという点だ。Expandイベントは、ツリーの各ノードをドリルダウンしたタイミングで発生する。本稿のサンプル・プログラムでは、Expandイベントに対応するイベント・ハンドラはtree_Expandメソッドだ。Expandイベントをリアルタイムに捕捉するには、必ずTreeViewコントロールのAutoPostBackプロパティがtrueに設定されている必要がある。tree_Expandメソッドでは、第2パラメータに引き渡されるTreeViewClickEventArgsオブジェクトのNodeプロパティで、ドリルダウンしたノードがString型の値として返される。Nodeプロパティの値が「0.2」であれば、1番目のノード配下の3番目の子ノードであることを意味する(以降、階層が深くなった場合にも「.」連結で同様の記述)。ここではNodeプロパティの戻り値を「.」で分割し、各階層のノードを走査することで、最終的にイベントの発生元となったTreeNodeオブジェクトを取得しているというわけだ。SetNewNodeメソッドは、取得したTreeNodeオブジェクトに属する子ノード群を取得し、現在のツリーに追加する。基本的なロジックは、前掲の「TIPS:[ASP.NET]データベースからツリー・メニューを生成するには?」とほぼ同等であるので、詳細はそちらを参照していただきたい。本稿で注目していただきたいのは、子ノード追加時にhasChildNodesメソッドでさらに配下のノード群が存在するかどうかを判定しているという点だ。配下にノードが存在するかどうかに応じて、ノードのタイプと展開の可否を子ノードに設定している。展開の可否を設定するExpandableプロパティがデフォルトのExpandableValue.Autoであり、かつ、配下の子ノードがまだ設定されていないケースでは、ノードは展開不可の状態となってしまうので注意すること。Expandableプロパティに指定可能なExpandableValue構造体のメンバを以下に示しておく。初回呼び出し時は展開可能。ユーザーが最初にクリックしたときに子ノードが見つからなければ展開不可に変更されるExpandableプロパティで設定可能な値(ExpandableValue構造体のメンバ)以上が理解できたら、さっそく、サンプル・コードを実行してみよう。データベースに格納した内容に従って、以下のようなツリーが表示されれば成功だ。サンプル・プログラムの実行結果ノード「関連資料」をクリックして展開したところ。ノードをドリルダウンしたタイミングで、動的に下位ノードを取得していることが確認できる。nodes...]という読み込み時のメッセージが表示され、読み込みが完了すると下位のノード群が表示されるはずだ。より自動抽出したものです。7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。TranslatorはPowerPoint用のアドイン。