Click here to Skip to main content
15,891,529 members
Articles / Web Development / ASP.NET

A Hierarchical Repeater and Accessories to Match

Rate me:
Please Sign up or sign in to vote.
4.86/5 (10 votes)
1 Aug 2006CPOL4 min read 79.7K   635   35   25
A hierarchical Repeater control.

Introduction

I was working on a solution where there was a need to render sitemap data purely using DIVs. Upon initial coding, I tried to use the standard TreeView controls such as the ASP.NET TreeView and other third party controls. But none of them would allow for the custom rendering logic this project required. Most treeview or tree controls implement their own rendering logic that will break your design rules. Some times there is no "can't we just use what is available?", and when all else was exhausted, I just coded my way through it!!!! Nesting the Repeater would make sense, but coding this would get ugly since it was unknown how deep each tree was. Traversing the data in the Render method was the final solution taken. (Now try to get your HTML guy to fix the styling on that :-)).

After the solution was done, I decided to build a HierarchicalRepeater control using ASP.NET 2.0's HierarchicalDataBoundControl base class and allowing for total customization of the HTML styling and layout of hierarchical data, rather than the approach of overriding the Render method of the control used.

So I had my objective, but where to get started?

Here is a listing of problems that I wanted to solve in building this control:

  • Heck write my first CodeProject article.
  • Allow for complete control of the rendering logic in templates.
  • Ability to define multiple templates at each depth within a hierarchical structure.
  • Allow for DataBinding expressions:
  • ASP.NET
    <%#Eval("SomeProperty")%>
  • Create a hierarchical data structure using Generics that will allow a developer to define any object as a hierarchical using the IHierarchicalEnumerable and IHierarchyData interfaces.

The Structure of the HierarchicalRepeater Control

I started by defining a template infrastructure that will allow for hierarchical data to be iterated:

ASP.NET
<asp:SiteMapDataSource ID="SiteMapDataSource1" 
         runat="server" SiteMapProvider="MenuProvider" />
<cc1:HierarchicalRepeater runat="server" ID="repeater">
    <ItemHeaderTemplate><ul></ItemHeaderTemplate>
    <ItemTemplate><li><%#Eval("Title") %></li></ItemTemplate>
    <ItemFooterTemplate></ul></ItemFooterTemplate>
</cc1:HierarchicalRepeater>

Using this structure, I was able to create the following HTML:

Rendered output:
  • Home
    • Node1
      • Node1 1
      • Node1 2
      • Node1 3
    • Node2
      • Node2 1
      • Node2 2
      • Node2 3
    • Node3
      • Node3 1
      • Node3 2
      • Node3 3
      • Node3 4
        • Node3 4 1

The core function that allows this to happen is the CreateControlHierarchyRecursive method:

C#
protected virtual void CreateControlHierarchyRecursive(IHierarchicalEnumerable dataItems)

Hierarchical data sources rely on being able to iterate its nodes recursively. The HierarchicalRepeater achieves this by calling CreateControlHierarchyRecursive if there is a detection that the current data item has child items. This means that a full traversal of the data source is achievable.

But then I got to thinking, "Great, I have a HierarchicalRepeater control, but what about custom rendering styles per node depth?" With a little help from article's by Danny Chen, I followed his solution for creating a CustomTemplate and then wrapped that into a collection for use within the Repeater control. The ItemTemplate control allows you to specify at which depth and which ListItemType you would like to override. This helps when each depth has its own rendering logic, or the filtering renders specific depths when it is necessary to omit rendering of deep child nodes past a certain depth.

Hierarchical Repeater Control Using TemplateCollection

The following code renders a different color for each depth in a SiteMap. If you notice I have only one item footer template that will be used for all corresponding item templates.

Page code:
ASP.NET
<cc1:HierarchicalRepeater runat="server" 
                          ID="repeater" Width="231px">
    <TemplateCollection>
        <cc1:ItemTemplate Depth="0" ListItemType="ItemTemplate">
            <Template>
                <div style="padding-left:10px;border: 1px solid blue; background: blue;">
                <%#Eval("Item.Value") %>
            </Template>
        </cc1:ItemTemplate>
        <cc1:ItemTemplate Depth="1" ListItemType="ItemTemplate">
            <Template>
                <div style="padding-left:10px;border: 1px solid red; background: red;">
                <%#Eval("Item.Value") %>
            </Template>
        </cc1:ItemTemplate>
        <cc1:ItemTemplate Depth="2" ListItemType="ItemTemplate">
            <Template>
                <div style="padding-left:10px;border: 1px solid red; background: green;">
                <%#Eval("Item.Value") %>
            </Template>
        </cc1:ItemTemplate>
    </TemplateCollection>
    //Default ItemFooterTemplate used for all
    <ItemFooterTemplate>
        </div>
    </ItemFooterTemplate>
</cc1:HierarchicalRepeater>
Code-behind:
C#
HierarchyData<ListItem> root = 
         new HierarchyData<ListItem>(new ListItem("Root", "Root"), null);
HierarchyData<ListItem> child1 = 
         new HierarchyData<ListItem>(new ListItem("Child1", "child1"),root);
HierarchyData<ListItem> child2 = 
         new HierarchyData<ListItem>(new ListItem("Child2", "child2"),root);
HierarchyData<ListItem> child2_1 = 
         new HierarchyData<ListItem>(new ListItem("Child2_1", "child2_1"),child2);
HierarchyDataCollection<HierarchyData<ListItem>> coll = 
         new HierarchyDataCollection<HierarchyData<ListItem>>();
coll.Add(root);
repeater.DataSource = coll;
repeater.DataBind();

Rendered output of the control:

What is that Generic HierarchyData<T> in your code you ask?

There are only a few HierarchicalDatabound controls or classes that implement IHierarchicalEnumerable. Two notable controls are XMLDataSource and SiteMapDatasource, and a handful of classes that are used in conjunction with both datasource controls. Of course, since I am trying to sell you my HierarchicaRepeater control, it is only natural that I provide you with a mechanism for using your own objects to create hierarchical data, instead of you writing all the plumbing code for IHierarchyData and IHierarchicalEnumerable. Only after using Generics heavily for collections and lists did I realize how amazing Generics are. My attempt with the HierarchyData<T> is all the plumbing you need to start creating your own hierarchical datasources. So with HierarchicalRepeater and HierarchyData<T>, you are now ready to create and render complex hierarchical data sources with full control over the rendering of your data.

References

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralDatabinding HierarchyDataCollection to Treeview Pin
Larry R3-Jul-07 6:48
Larry R3-Jul-07 6:48 
Generalrepaired recursion and viewstate Pin
jwessel25-Jun-07 14:00
jwessel25-Jun-07 14:00 
GeneralRe: repaired recursion and viewstate Pin
Gary Vidal25-Jun-07 15:14
Gary Vidal25-Jun-07 15:14 
GeneralRe: repaired recursion and viewstate Pin
Andreas Kranister26-Jun-07 6:11
Andreas Kranister26-Jun-07 6:11 
GeneralRe: repaired recursion and viewstate Pin
jwessel26-Jun-07 6:53
jwessel26-Jun-07 6:53 
GeneralRe: repaired recursion and viewstate Pin
Andreas Kranister27-Jun-07 4:01
Andreas Kranister27-Jun-07 4:01 
GeneralRe: repaired recursion and viewstate Pin
Andreas Kranister27-Jun-07 4:12
Andreas Kranister27-Jun-07 4:12 
Here is my translation to C#. Feel free to search for failures and comment them:

<br />
using System;<br />
using System.Collections.Generic;<br />
using System.ComponentModel;<br />
using System.Text;<br />
using System.Web.UI;<br />
using System.Web.UI.WebControls;<br />
using System.Web;<br />
using System.Security.Permissions;<br />
<br />
namespace WebCustomControls<br />
{<br />
	public delegate void HierarchicalRepeaterItemEventHandler(object sender, HierarchicalRepeaterItemEventArgs e);<br />
	public delegate void HierarchicalRepeaterCommandEventHandler(object sender, HierarchicalRepeaterCommandEventArgs e);<br />
<br />
	public enum HierarchicalListItemType<br />
	{<br />
		Header,<br />
		Footer,<br />
		ItemHeader,<br />
		ItemFooter,<br />
		Item<br />
	}<br />
<br />
	[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]<br />
	[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]<br />
	public class HierarchicalRepeaterItemEventArgs : EventArgs<br />
	{<br />
		private HierarchicalRepeaterItem myItem;<br />
<br />
		public HierarchicalRepeaterItemEventArgs(HierarchicalRepeaterItem item)<br />
		{<br />
			myItem = item;<br />
		}<br />
<br />
		public HierarchicalRepeaterItem Item<br />
		{<br />
			get<br />
			{<br />
				return myItem;<br />
			}<br />
		}<br />
	}<br />
<br />
	[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]<br />
	[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]<br />
	public class HierarchicalRepeaterCommandEventArgs : CommandEventArgs<br />
	{<br />
		private object myCommandSource;<br />
		private HierarchicalRepeaterItem myItem;<br />
<br />
		public HierarchicalRepeaterCommandEventArgs(<br />
			HierarchicalRepeaterItem item,<br />
			object commandSource,<br />
			CommandEventArgs originalArgs)<br />
			: base(originalArgs)<br />
		{<br />
			myItem = item;<br />
			myCommandSource = commandSource;<br />
		}<br />
<br />
		public object CommandSource<br />
		{<br />
			get<br />
			{<br />
				return myCommandSource;<br />
			}<br />
		}<br />
<br />
		public HierarchicalRepeaterItem Item<br />
		{<br />
			get<br />
			{<br />
				return myItem;<br />
			}<br />
		}<br />
	}<br />
<br />
	public class ItemTemplateList : List<ItemTemplate><br />
	{<br />
		public ItemTemplate GetTemplate(int depth, HierarchicalListItemType listItemType)<br />
		{<br />
			// TODO: Umsetzung auf .Find()<br />
			foreach (ItemTemplate item in this)<br />
			{<br />
				if ((item.Depth == depth) && (item.ListItemType == listItemType))<br />
					return item;<br />
			}<br />
			return null;<br />
		}<br />
<br />
		protected void InsertTemplate(int index, ItemTemplate item)<br />
		{<br />
			if (GetTemplate(item.Depth, item.ListItemType) == null)<br />
				throw new ArgumentException("ITemplate Definition already Exists");<br />
			else<br />
				base.Insert(index, item);<br />
		}<br />
	}<br />
<br />
	public class ItemTemplate : ITemplate<br />
	{<br />
		private int myDepth;<br />
		private HierarchicalListItemType myListItemType;<br />
		private ITemplate myTemplate;<br />
<br />
<br />
		public int Depth<br />
		{<br />
			get<br />
			{<br />
				return myDepth;<br />
			}<br />
			set<br />
			{<br />
				myDepth = value;<br />
			}<br />
		}<br />
<br />
		[PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(IDataItemContainer))]<br />
		public ITemplate Template<br />
		{<br />
			get<br />
			{<br />
				return myTemplate;<br />
			}<br />
			set<br />
			{<br />
				myTemplate = value;<br />
			}<br />
		}<br />
<br />
		public HierarchicalListItemType ListItemType<br />
		{<br />
			get<br />
			{<br />
				return myListItemType;<br />
			}<br />
			set<br />
			{<br />
				myListItemType = value;<br />
			}<br />
		}<br />
<br />
<br />
		public void InstantiateIn(Control container)<br />
		{<br />
			myTemplate.InstantiateIn(container);<br />
		}<br />
	}<br />
<br />
	public class HierarchicalRepeaterItem : Control, INamingContainer, IDataItemContainer<br />
	{<br />
		private object myDataItem;<br />
		private int myDataItemIndex;<br />
		private int myDisplayIndex;<br />
		private int myDepth;<br />
		private HierarchicalListItemType myItemType;<br />
<br />
<br />
		public HierarchicalRepeaterItem(int dataItemIndex, int displayIndex, int depth, HierarchicalListItemType itemType)<br />
		{<br />
			myDataItemIndex = dataItemIndex;<br />
			myDisplayIndex = displayIndex;<br />
			myDepth = depth;<br />
			myItemType = itemType;<br />
		}<br />
<br />
<br />
		public object DataItem<br />
		{<br />
			get<br />
			{<br />
				return myDataItem;<br />
			}<br />
			set<br />
			{<br />
				myDataItem = value;<br />
			}<br />
		}<br />
<br />
		public int DataItemIndex<br />
		{<br />
			get<br />
			{<br />
				return myDataItemIndex;<br />
			}<br />
		}<br />
<br />
		public int DisplayIndex<br />
		{<br />
			get<br />
			{<br />
				return myDisplayIndex;<br />
			}<br />
		}<br />
<br />
		public int Depth<br />
		{<br />
			get<br />
			{<br />
				return myDepth;<br />
			}<br />
		}<br />
<br />
		public HierarchicalListItemType ItemType<br />
		{<br />
			get<br />
			{<br />
				return myItemType;<br />
			}<br />
		}<br />
<br />
<br />
		protected override bool OnBubbleEvent(object source, EventArgs e)<br />
		{<br />
			if (e is CommandEventArgs)<br />
			{<br />
				HierarchicalRepeaterCommandEventArgs e2 = new HierarchicalRepeaterCommandEventArgs(this, source, (CommandEventArgs)e);<br />
				base.RaiseBubbleEvent(this, e2);<br />
				return true;<br />
			}<br />
			return false;<br />
		}<br />
	}<br />
<br />
	[DefaultEvent("ItemCommand"), DefaultProperty("DataSource"), ParseChildren(true), PersistChildren(false)]<br />
	[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]<br />
	[AspNetHostingPermission(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]<br />
	[ToolboxData("<{0}:HierarchicalRepeater runat=server></{0}:HierarchicalRepeater>")]<br />
	public class HierarchicalRepeater : HierarchicalDataBoundControl, INamingContainer<br />
	{<br />
		private ItemTemplateList myTemplateList = new ItemTemplateList();<br />
		private ITemplate myHeaderTemplate;<br />
		private ITemplate myFooterTemplate;<br />
		private ITemplate myItemTemplate;<br />
		private ITemplate myItemHeaderTemplate;<br />
		private ITemplate myItemFooterTemplate;<br />
		private List<HierarchicalRepeaterItem> myItemArray;<br />
		private List<HierarchicalRepeaterItem> myItems;<br />
		private DataSourceSelectArguments myArguments;<br />
<br />
<br />
		public event HierarchicalRepeaterCommandEventHandler ItemCommand;<br />
		public event HierarchicalRepeaterItemEventHandler ItemDataBound;<br />
		public event HierarchicalRepeaterItemEventHandler ItemCreated;<br />
<br />
<br />
		[PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(IDataItemContainer))]<br />
		public ItemTemplateList TemplateCollection<br />
		{<br />
			get<br />
			{<br />
				return myTemplateList;<br />
			}<br />
			set<br />
			{<br />
				myTemplateList = value;<br />
			}<br />
		}<br />
<br />
		[PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(IDataItemContainer))]<br />
		public ITemplate HeaderTemplate<br />
		{<br />
			get<br />
			{<br />
				return myHeaderTemplate;<br />
			}<br />
			set<br />
			{<br />
				myHeaderTemplate = value;<br />
			}<br />
		}<br />
<br />
		[PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(IDataItemContainer))]<br />
		public ITemplate FooterTemplate<br />
		{<br />
			get<br />
			{<br />
				return myFooterTemplate;<br />
			}<br />
			set<br />
			{<br />
				myFooterTemplate = value;<br />
			}<br />
		}<br />
<br />
		[PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(IDataItemContainer))]<br />
		public ITemplate ItemTemplate<br />
		{<br />
			get<br />
			{<br />
				return myItemTemplate;<br />
			}<br />
			set<br />
			{<br />
				myItemTemplate = value;<br />
			}<br />
		}<br />
<br />
		[PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(IDataItemContainer))]<br />
		public ITemplate ItemHeaderTemplate<br />
		{<br />
			get<br />
			{<br />
				return myItemHeaderTemplate;<br />
			}<br />
			set<br />
			{<br />
				myItemHeaderTemplate = value;<br />
			}<br />
		}<br />
<br />
		[PersistenceMode(PersistenceMode.InnerProperty), TemplateContainer(typeof(IDataItemContainer))]<br />
		public ITemplate ItemFooterTemplate<br />
		{<br />
			get<br />
			{<br />
				return myItemFooterTemplate;<br />
			}<br />
			set<br />
			{<br />
				myItemFooterTemplate = value;<br />
			}<br />
		}<br />
<br />
		public List<HierarchicalRepeaterItem> Items<br />
		{<br />
			get<br />
			{<br />
				if (myItems == null)<br />
				{<br />
					if (myItemArray == null)<br />
						this.EnsureChildControls();<br />
<br />
					myItems = new List<HierarchicalRepeaterItem>(myItemArray);<br />
				}<br />
<br />
				return myItems;<br />
			}<br />
		}<br />
<br />
		protected DataSourceSelectArguments SelectArguments<br />
		{<br />
			get<br />
			{<br />
				if (myArguments == null)<br />
					myArguments = DataSourceSelectArguments.Empty;<br />
<br />
				return myArguments;<br />
			}<br />
		}<br />
<br />
		protected override HtmlTextWriterTag TagKey<br />
		{<br />
			get<br />
			{<br />
				return HtmlTextWriterTag.Div;<br />
			}<br />
		}<br />
<br />
<br />
		protected override void PerformDataBinding()<br />
		{<br />
			this.Controls.Clear();<br />
			this.ClearChildViewState();<br />
			this.CreateControlHierarchy(true);<br />
		}<br />
<br />
		protected override void CreateChildControls()<br />
		{<br />
			Controls.Clear();<br />
			if (ViewState["itemGraph"] != null)<br />
				CreateControlHierarchy(false);<br />
		}<br />
<br />
		protected override bool OnBubbleEvent(object source, EventArgs e)<br />
		{<br />
			HierarchicalRepeaterCommandEventArgs e2 = e as HierarchicalRepeaterCommandEventArgs;<br />
			if (e2 != null)<br />
			{<br />
				OnItemCommand(e2);<br />
				return true;<br />
			}<br />
			return false;<br />
		}<br />
<br />
		protected virtual void CreateControlHierarchy(bool useDataSource)<br />
		{<br />
			myItemArray = new List<HierarchicalRepeaterItem>();<br />
			if (useDataSource)<br />
			{<br />
				CreateControlHierarchyRecursive(GetData("").Select(), 0);<br />
<br />
				StringBuilder sb = new StringBuilder();<br />
				foreach (HierarchicalRepeaterItem item in myItemArray)<br />
				{<br />
					if (item.ItemType == HierarchicalListItemType.Header)<br />
						sb.Append("H");<br />
					else if (item.ItemType == HierarchicalListItemType.ItemHeader)<br />
						sb.Append("h");<br />
					else if (item.ItemType == HierarchicalListItemType.Item)<br />
						sb.Append("i");<br />
					else if (item.ItemType == HierarchicalListItemType.ItemFooter)<br />
						sb.Append("f");<br />
					else if (item.ItemType == HierarchicalListItemType.Footer)<br />
						sb.Append("F");<br />
				}<br />
<br />
				ViewState["itemGraph"] = sb.ToString();<br />
			}<br />
			else<br />
			{<br />
				int depth = -1;<br />
				int dataItemIndex = 0;<br />
				int displayIndex = 0;<br />
				string itemGraph = (string)ViewState["itemGraph"];<br />
<br />
				HierarchicalRepeaterItem repeaterItem = null;<br />
				foreach (char c in itemGraph)<br />
				{<br />
					if (c.Equals('H'))<br />
						repeaterItem = new HierarchicalRepeaterItem(0, displayIndex++, ++depth, HierarchicalListItemType.Header);<br />
					if (c.Equals('h'))<br />
						repeaterItem = new HierarchicalRepeaterItem(0, displayIndex++, depth, HierarchicalListItemType.ItemHeader);<br />
					if (c.Equals('i'))<br />
						repeaterItem = new HierarchicalRepeaterItem(dataItemIndex++, displayIndex++, depth, HierarchicalListItemType.Item);<br />
					if (c.Equals('f'))<br />
						repeaterItem = new HierarchicalRepeaterItem(0, displayIndex++, depth, HierarchicalListItemType.ItemFooter);<br />
					if (c.Equals('F'))<br />
						repeaterItem = new HierarchicalRepeaterItem(0, displayIndex++, depth--, HierarchicalListItemType.Footer);<br />
<br />
					InitializeItem(repeaterItem);<br />
					Controls.Add(repeaterItem);<br />
				}<br />
			}<br />
			ChildControlsCreated = true;<br />
		}<br />
<br />
		protected virtual void CreateControlHierarchyRecursive(IHierarchicalEnumerable enumerable, int depth)<br />
		{<br />
			int dataIndex = 0;<br />
			int displayIndex = 0;<br />
<br />
			HierarchicalRepeaterItem header = CreateItem(-1, displayIndex++, depth, HierarchicalListItemType.Header, null, false);<br />
			myItemArray.Add(header);<br />
<br />
			foreach (IHierarchyData data in enumerable)<br />
			{<br />
				HierarchicalRepeaterItem itemHeader = CreateItem(-1, displayIndex++, depth, HierarchicalListItemType.ItemHeader, null, false);<br />
				myItemArray.Add(itemHeader);<br />
<br />
				HierarchicalRepeaterItem item = CreateItem(dataIndex++, displayIndex++, depth, HierarchicalListItemType.Item, data, true);<br />
				myItemArray.Add(item);<br />
<br />
				if (data.HasChildren)<br />
					CreateControlHierarchyRecursive(data.GetChildren(), depth + 1);<br />
<br />
				HierarchicalRepeaterItem itemFooter = CreateItem(-1, displayIndex++, depth, HierarchicalListItemType.ItemFooter, null, false);<br />
				myItemArray.Add(itemFooter);<br />
			}<br />
<br />
			HierarchicalRepeaterItem footer = CreateItem(-1, displayIndex++, depth, HierarchicalListItemType.Footer, null, false);<br />
			myItemArray.Add(footer);<br />
		}<br />
<br />
		protected virtual HierarchicalRepeaterItem CreateItem(int dataItemIndex, int displayIndex, int depth, HierarchicalListItemType itemType, object dataItem, bool dataBind)<br />
		{<br />
			HierarchicalRepeaterItem repeaterItem = new HierarchicalRepeaterItem(dataItemIndex, displayIndex, depth, itemType);<br />
			InitializeItem(repeaterItem);<br />
			Controls.Add(repeaterItem);<br />
<br />
			HierarchicalRepeaterItemEventArgs e = new HierarchicalRepeaterItemEventArgs(repeaterItem);<br />
			OnItemCreated(e);<br />
<br />
			if (dataBind)<br />
			{<br />
				repeaterItem.DataItem = dataItem;<br />
				repeaterItem.DataBind();<br />
				OnItemDataBound(e);<br />
			}<br />
<br />
			return repeaterItem;<br />
		}<br />
<br />
		protected virtual void InitializeItem(HierarchicalRepeaterItem item)<br />
		{<br />
			System.Diagnostics.Debug.WriteLine(item.DisplayIndex);<br />
			ITemplate template = TemplateCollection.GetTemplate(item.Depth, item.ItemType);<br />
<br />
			if (template == null)<br />
			{<br />
				if (item.ItemType == HierarchicalListItemType.Header)<br />
					template = myHeaderTemplate;<br />
				else if (item.ItemType == HierarchicalListItemType.Footer)<br />
					template = myFooterTemplate;<br />
				else if (item.ItemType == HierarchicalListItemType.ItemHeader)<br />
					template = myItemHeaderTemplate;<br />
				else if (item.ItemType == HierarchicalListItemType.ItemFooter)<br />
					template = myItemFooterTemplate;<br />
				else if (item.ItemType == HierarchicalListItemType.Item)<br />
					template = myItemTemplate;<br />
				else<br />
					throw new ApplicationException("Invalid ItemType");<br />
			}<br />
			else<br />
			{<br />
				bool a = true;<br />
			}<br />
<br />
			if (template != null)<br />
				template.InstantiateIn(item);<br />
		}<br />
<br />
		protected virtual void OnItemCommand(HierarchicalRepeaterCommandEventArgs e)<br />
		{<br />
			if (ItemCommand != null)<br />
				ItemCommand(this, e);<br />
		}<br />
<br />
		protected virtual void OnItemDataBound(HierarchicalRepeaterItemEventArgs e)<br />
		{<br />
			if (ItemDataBound != null)<br />
				ItemDataBound(this, e);<br />
		}<br />
<br />
		protected virtual void OnItemCreated(HierarchicalRepeaterItemEventArgs e)<br />
		{<br />
			if (ItemCreated != null)<br />
				ItemCreated(this, e);<br />
		}<br />
	}<br />
}<br />

GeneralRe: repaired recursion and viewstate Pin
acl12323-Oct-08 14:12
acl12323-Oct-08 14:12 
QuestionViewState does not work? Pin
Andreas Kranister19-Jun-07 1:20
Andreas Kranister19-Jun-07 1:20 
AnswerRe: ViewState does not work? Pin
Gary Vidal21-Jun-07 16:14
Gary Vidal21-Jun-07 16:14 
GeneralRe: ViewState does not work? [modified] Pin
Andreas Kranister21-Jun-07 20:22
Andreas Kranister21-Jun-07 20:22 
AnswerRe: ViewState does not work? Pin
Gary Vidal21-Jun-07 16:27
Gary Vidal21-Jun-07 16:27 
NewsRe: ViewState does not work? Pin
Andreas Kranister21-Jun-07 20:12
Andreas Kranister21-Jun-07 20:12 
AnswerRe: ViewState does not work? Pin
jwessel25-Jun-07 9:57
jwessel25-Jun-07 9:57 
GeneralRe: ViewState does not work? Pin
Member 11601363-Jul-08 8:29
Member 11601363-Jul-08 8:29 
GeneralQuestion: Pin
EarlLocker6-May-07 6:32
EarlLocker6-May-07 6:32 
QuestionItemHeaderTemplate and ItemFooterTemplate Pin
rsenna17-Sep-06 12:30
rsenna17-Sep-06 12:30 
AnswerRe: ItemHeaderTemplate and ItemFooterTemplate [modified] Pin
Gary Vidal17-Sep-06 19:02
Gary Vidal17-Sep-06 19:02 
GeneralRe: ItemHeaderTemplate and ItemFooterTemplate Pin
rsenna18-Sep-06 4:59
rsenna18-Sep-06 4:59 
GeneralRe: ItemHeaderTemplate and ItemFooterTemplate Pin
jwessel25-Jun-07 11:22
jwessel25-Jun-07 11:22 
GeneralRe: ItemHeaderTemplate and ItemFooterTemplate Pin
jwessel25-Jun-07 11:30
jwessel25-Jun-07 11:30 
GeneralThanks Pin
wduros12-Aug-06 10:12
wduros12-Aug-06 10:12 
GeneralRe: Thanks Pin
Gary Vidal2-Aug-06 14:07
Gary Vidal2-Aug-06 14:07 
GeneralDLinq and your control [modified] Pin
Orizz26-Jul-06 5:17
Orizz26-Jul-06 5:17 
GeneralRe: DLinq and your control Pin
Gary Vidal26-Jul-06 12:24
Gary Vidal26-Jul-06 12:24 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.