ホーム > .NET, ASP.NET 備忘録 > TreeViewで現在のノードだけを展開する

TreeViewで現在のノードだけを展開する

TreeViewで階層が深いSiteMapを表示しているとき、現在のページが含まれるノードだけを展開して表示したいということがあります。

TreeView

こういった場合にはTreeViewのPreRenderイベントで以下のようなプログラムを記述してみましょう。

    protected void TreeView1_PreRender(object sender, EventArgs e)
    {
        foreach (TreeNode tn in this.TreeView1.Nodes)
        {
            checkURL(tn);
        }
    }

    private bool checkURL(TreeNode tn)
    {
        bool rtn = false;
        tn.Expanded = false;
        foreach (TreeNode tnc in tn.ChildNodes)
        {
            if (checkURL(tnc))
            {
                rtn = true;
                tn.Expanded = true;
            }
        }
        if (tn.NavigateUrl.ToLower() == Context.Request.FilePath.ToLower())
        {
            rtn = true;
        }
        return rtn;
    }

checkURLでは再帰を利用していてロジックが少しわかりにくくなっていますが、以下の作業を行っています。

・すべてのノードを閉じる
・ノードの持つURLとブラウザからリクエストされたURLを比較する。
・URLが一致したノードから親としてたどれるすべてのノードを展開する。

このプログラムを利用する場合、注意する点はTreeViewのExpandDepthプロパティに値を設定してはいけないという点です。ExpandDepthプロパティに値が設定されている場合、初期のTreeView内部にはその値に応じたノードしか存在しないため、上記のプログラムが正常に作動しないことになってしまいます。

ちなみに、TreeViewではノードの展開や縮小はJavaScriptを利用して行われており、ある種Ajax的な実装が標準となっています。

カテゴリー:.NET, ASP.NET 備忘録
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。