ASP.NET TreeView,在数据绑定时选择NodeTemplate类似于WPF中的TemplateSelector?

时间:2011-01-15 08:51:51

标签: asp.net templates treeview

使用场景,

我有分层分类的项目,我想在TreeView中呈现它们。 TreeView将按需填充,它包含类别和项目,我希望为类别和项目提供不同的模板。如果项目是静态的,那不是问题我可以很容易地在aspx标记中列出它们并为每个节点指定模板,但是根据需要填充我不知道怎么做。我不介意任何建议使用Telerik TreeView或DevExpress Treeview的解决方案。

先谢谢。

1 个答案:

答案 0 :(得分:1)

确定, 有一天没有评论:),我使用RadTreeView完成它,RadTreeNode支持自定义属性,我添加了一个自定义属性来区分类别和项目,在NodeTemplate我使用MultiView控件选择View来显示检查节点自定义属性。

以下是代码的一些部分,

<telerik:RadTreeView ID="rtvQueries" runat="server" OnNodeExpand="rtvQueries_NodeExpand"
        Skin="Black" OnClientNodeClicking="CheckNodeType" OnNodeClick="rtvQueries_NodeClick">
        <NodeTemplate>
            <asp:HiddenField ID="hfId" runat="server" Value='<%# Container.Value %>' />
            <asp:MultiView ID="mvAll" runat="server" ActiveViewIndex='<%# Container.Attributes["ItemType"] == "C"? 0 : 1 %>'>
                <asp:View ID="vwCategory" runat="server">
                    <asp:Label ID="lblCategory" runat="server" Text='<%# Container.Text %>' />
                </asp:View>
                <asp:View ID="vwQuery" runat="server">
                    <div style="float: left">
                        <asp:Label ID="lblQuery" runat="server" Text='<%# Container.Text %>' />
                    </div>
                    <div style="float: left; margin-left: 20px; overflow: hidden; width: 200px;">
                        <asp:Label ID="lblCommandText" runat="server" Text='<%# Container.Attributes["CommandText"] %>' />
                    </div>
                </asp:View>
            </asp:MultiView>
        </NodeTemplate>
    </telerik:RadTreeView>

NodeExpand的代码隐藏,

protected void rtvQueries_NodeExpand(object sender, RadTreeNodeEventArgs e)
        {
            Guid categoryId = new Guid(e.Node.Value);
            List<Category> cats = DBHelper.GetQueryCategories(categoryId);
            cats.ForEach(c =>
            {
                RadTreeNode n = new RadTreeNode(c.Name, c.Id.ToString());
                n.ExpandMode = TreeNodeExpandMode.ServerSideCallBack;
                n.Attributes["ItemType"] = "C";
                e.Node.Nodes.Add(n);
                n.DataBind();
            });

            List<RightBI.Query> queries = DBHelper.GetQueriesByCategoryId(categoryId);
            queries.ForEach(q =>
            {
                RadTreeNode n = new RadTreeNode(q.Name, q.Id.ToString());
                n.Attributes["ItemType"] = "Q";
                n.Attributes["CommandText"] = q.CommandText;
                e.Node.Nodes.Add(n);
                n.DataBind();
            });
        }

此解决方案中唯一的问题是我必须在将每个节点添加到TreeView后调用DataBind,以便评估绑定表达式。

我仍然希望看到有关此解决方案或更好的想法的其他解决方案和评论。