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