3

XML データ ソースにバインドする ASP.Net TreeView コントロールがあります。XML 定義ファイルで、どのノードを展開し、どのノードを折りたたむかを制御できるようにしたいと考えています。Expanded='' は私にはうまくいきません。次の簡単な例では、ノード 2 を完全に展開します。

ASP ページ...

<asp:XmlDataSource ID="oXmlDataSource" runat="server" />
<asp:TreeView ID="TreeView1" runat="server" EnableViewState="false" DataSourceID="oXmlDataSource"></TreeView>

コードビハインド...

oXmlDataSource.Data = MyXMLString;
oXmlDataSource.XPath = "/Tree/Node";

ここにXMLがあります...

<?xml version='1.0' encoding='utf-8' ?>
<Tree Text='example.aspx' Href='example.aspx'>
      <Node Text='Example Node 1' Href='0800200c9a66.aspx' Expanded='false'></Node>
      <Node Text='Example Node 2' Href='0800200c9a66.aspx' Expanded='true'>
         <Node Text='Example Node 3' Href='0800200c9a66.aspx' Expanded='false'></Node>
         <Node Text='Example Node 4' Href='0800200c9a66.aspx' Expanded='false'></Node>
         <Node Text='Example Node 5' Href='0800200c9a66.aspx' Expanded='false'></Node>
         <Node Text='Example Node 6' Href='0800200c9a66.aspx' Expanded='false'></Node>
      </Node>
</Tree>
4

2 に答える 2

1

残念ながら、XML でこれを行うことはできません。コントロールの近道です。TreeView に XML を設定し、すべてのノードを再帰的に走査して、必要なブランチを展開する必要があります。次のことを試してください。

OnPreRender アトロバイトを TreeView コントロールに追加します...

<asp:XmlDataSource ID="oXmlDataSource" runat="server" />
<asp:TreeView ID="TreeView1" runat="server" EnableViewState="false" DataSourceID="oXmlDataSource" OnPreRender="TreeView1_PreRender"></TreeView>

次に、コード ビハインドに以下を追加します (いくつかのテストを追加し、try/catch を追加することをお勧めします)...

protected void TreeView1_PreRender(object sender, EventArgs e)
{
    SelectCurrentPageTreeNode(TreeView1);
}

private void SelectCurrentPageTreeNode(TreeView tvTreeView)
{
    tvTreeView.CollapseAll();

    if (Request.Url.PathAndQuery != null)
    {
        ExpandTreeViewNodes(tvTreeView, Request.Url.PathAndQuery);
    }
}

private TreeNode ExpandTreeViewNodes(TreeView tvTreeView, string sPathAndQuery)
{
    if (tvTreeView != null)
    {
        if (!string.IsNullOrEmpty(sPathAndQuery))
        {
            sPathAndQuery = sPathAndQuery.ToLower();
            {
                TreeNode tnWorkTreeNode = null;

                for (int iLoop = 0; iLoop < tvTreeView.Nodes.Count; iLoop++)
                {
                    tvTreeView.Nodes[iLoop].Expand();

                    tvTreeView.Nodes[iLoop].Selected = true;
                    if (tvTreeView.Nodes[iLoop].NavigateUrl.ToLower() == sPathAndQuery)
                    {
                        return (tvTreeView.Nodes[iLoop]);
                    }
                    else
                    {
                        tnWorkTreeNode = ExpandTreeViewNodesR(tvTreeView.Nodes[iLoop], sPathAndQuery);
                    }

                    if (tnWorkTreeNode != null)
                    {
                        return (tnWorkTreeNode);
                    }

                    tvTreeView.Nodes[iLoop].Collapse();
                }
            }
        }
    }

    return (null);
}

private static TreeNode ExpandTreeViewNodesR(TreeNode tvTreeNode, string sPathAndQuery)
{
    TreeNode tnReturnTreeNode = null;

    if (tvTreeNode != null)
    {
        tvTreeNode.Expand();
        if (tvTreeNode.NavigateUrl.ToLower() == sPathAndQuery)
        {
            return (tvTreeNode);
        }
        else
        {
            tnReturnTreeNode = null;

            for (int iLoop = 0; iLoop < tvTreeNode.ChildNodes.Count; iLoop++)
            {
                tvTreeNode.ChildNodes[iLoop].Selected = true;
                tnReturnTreeNode = ExpandTreeViewNodesR(tvTreeNode.ChildNodes[iLoop], sPathAndQuery);

                if (tnReturnTreeNode != null)
                {
                    return (tnReturnTreeNode);
                }
            }
            tvTreeNode.Collapse();
        }
    }
    return (null);
}
于 2008-12-23T20:32:47.023 に答える
0

うーん...まあ、DataBindingはそれを見ることさえないので、「Expanded」を使用してもデフォルトではどこにも到達しません...ある種のカスタムDataBindingを設定できると思いますが、私の提案はOnTreeNodeDataBoundイベントにフックし、必要に応じて展開/折りたたみますが、そのアプローチによってマイレージが異なる場合があります。

問題は、ツリービューのデータバインディングが発生する方法を中心に展開します。Reflectorが手元にある場合は、TreeViewコントロールのDataBindRecursiveメソッドを確認してください。リフレクターが手元にない場合は、インストールしてください。:)

于 2008-12-23T18:04:41.080 に答える