【问题标题】: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 或更好的想法。