【问题标题】:ASP.NET TreeView, select NodeTemplate upon databinding similar to the TemplateSelector in WPF?ASP.NET TreeView,在数据绑定时选择 NodeTemplate,类似于 WPF 中的 TemplateSelector?
【发布时间】:2011-01-15 08:51:51
【问题描述】:

使用场景,

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

提前致谢。

【问题讨论】:

    标签: asp.net templates treeview


    【解决方案1】:

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

    这里是部分代码,

    <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,以便评估绑定表达式。

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

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      相关资源
      最近更新 更多