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

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

こういった場合には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的な実装が標準となっています。

 ◆ この記事についてのご意見、ご質問は以下のフォーラムにお願いします ◆
http://dotnetfan.org/forums/1253/ShowThread.aspx

公開 11-09-2006 10:32 投稿者 ono
カテゴリ:

コメント

 

naoki said:

内容自体かなり気になるところだったのですが、一番最初に驚いたのは、今onoさんが使っているマシンがVistaだって言う点でした(笑)

参考にさせていただきます。
9月 11, 2006 11:06
この投稿に対する新規コメントはできません
SkinName:iroha_Blog2
Powered by Community Server, by Telligent Systems