protected void Page_PreRender( object sender, EventArgs e ) { using (var dc = new DCFactory<CmsDataContext>()) { var groups = dc.DataContext.CatalogItems.GroupBy( c => c.ParentItemID ).ToDictionary( g => g.Key ?? 0 ); if( groups.Count != 0 ) { var list = new List<object>(); var stack = new Stack<KeyValuePair<CatalogItemLink,int>>(); var tmp = new CatalogItemLink(); foreach( var item in groups[ 0 ].OrderByDescending( c=>c.CatalogItemPriority ) ) { if (item.BannerCount > 1) { for (byte i = 0; i < item.BannerCount; i++) { tmp = tmp.FullDeepCopy(dc.DataContext, BannerID, item, i); stack.Push(new KeyValuePair<CatalogItemLink, int>(tmp, 0)); } } else { tmp = tmp.FullDeepCopy(dc.DataContext, BannerID, item, 0); stack.Push(new KeyValuePair<CatalogItemLink, int>(tmp, 0)); } } while( stack.Count != 0 ) { var node = stack.Pop(); list.Add( new { CatalogItemLink = node.Key, Level = node.Value } ); if (node.Key.Position > 0) continue; if( groups.ContainsKey( node.Key.CatalogItemID ) ) { foreach( var item in groups[ node.Key.CatalogItemID ].OrderByDescending( c => c.CatalogItemPriority ) ) if (item.BannerCount > 1) { for (byte i = 0; i < item.BannerCount; i++) { tmp = tmp.FullDeepCopy(dc.DataContext, BannerID, item, i); stack.Push(new KeyValuePair<CatalogItemLink, int>(tmp, node.Value + 1)); } } else { tmp = tmp.FullDeepCopy(dc.DataContext, BannerID, item, 0); stack.Push(new KeyValuePair<CatalogItemLink, int>(tmp, node.Value + 1)); } } } _repeater.DataSource = list; _repeater.DataBind(); } } }
public CatalogItemLink FullDeepCopy(CmsDataContext dc, int bannerID, CatalogItem item, byte position) { var tmp = new CatalogItemLink(); tmp.DeepPropertiesCopy(item); tmp.Position = position; tmp.Visible = IsVisibleByBannerID(dc, bannerID, tmp.CatalogItemID, position); tmp.Banded = IsBanded(dc, bannerID, tmp.CatalogItemID, position); return tmp; }