protected override void WriteHtml(HtmlTextWriter writer) { var builder = new TreeViewHtmlBuilder(this); IHtmlNode treeViewTag = builder.TreeViewTag(); if (Items.Any() && !this.UsesTemplates()) { if (SelectedIndex != -1 && Items.Count < SelectedIndex) { throw new ArgumentOutOfRangeException(Exceptions.IndexOutOfRange); } //this loop is required because of SelectedIndex feature. if (HighlightPath) { Items.Each(HighlightSelectedItem); } Items.Each((item, index) => { if (!this.isPathHighlighted) { if (index == this.SelectedIndex) { item.Selected = true; if (item.Items.Any() || item.Template.HasValue()) { item.Expanded = true; } } } if (item.HasChildren) { item.Expanded = false; } if (ExpandAll) { ExpandAllChildrens(item); } if (string.IsNullOrEmpty(item.Id)) { item.Id = item.Text; } WriteItem(item, treeViewTag.Children[0], builder); }); } treeViewTag.WriteTo(writer); base.WriteHtml(writer); }
private void WriteItem(TreeViewItem item, IHtmlNode parentTag, TreeViewHtmlBuilder builder) { if (ItemAction != null) { ItemAction(item); } if (item.Visible) { var accessible = true; if (this.SecurityTrimming.Enabled) { accessible = item.IsAccessible(Authorization, ViewContext); } if (accessible) { var hasAccessibleChildren = item.Items.Any(x => x.Visible); if (hasAccessibleChildren && this.SecurityTrimming.Enabled) { hasAccessibleChildren = item.Items.IsAccessible(Authorization, ViewContext); if (this.SecurityTrimming.HideParent && !hasAccessibleChildren) { return; } } IHtmlNode itemTag = builder.ItemTag(item, hasAccessibleChildren).AppendTo(parentTag); builder.ItemInnerContent(item).AppendTo(itemTag.Children[0]); if (item.Template.HasValue()) { builder.ItemContentTag(item).AppendTo(itemTag); } else if (hasAccessibleChildren) { IHtmlNode ul = builder.ChildrenTag(item).AppendTo(itemTag); item.Items.Each(child => WriteItem(child, ul, builder)); } } } }