mathieu_cupryk
asked on
//NOTE: The following placeholder declaration is required by the Web Form Designer.
Why do I need this in my code?
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Data;
using System.Globalization;
using System.Diagnostics;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.SessionState;
using System.ComponentModel;
namespace OmegaLove.Web.UI
{
public partial class ctrlBreadCrumb : OmegaLoveBasePageUserControl
{
public struct PageCrumb
{
private short _level;
private string _url;
private string _linkName;
public PageCrumb(short level, string url, string linkName)
{
_level = level;
_url = url;
_linkName = linkName;
}
public short Level
{
get { return _level; }
}
public string Url
{
get { return _url; }
}
public string LinkName
{
get { return _linkName; }
}
}
protected System.Web.UI.WebControls.Label lblTrail;
//NOTE: The following placeholder declaration is required by the Web Form Designer.
//Do not delete or move it.
private System.Object designerPlaceholderDeclaration;
//Variable holding the Link name of the page
private string _tailName;
//Variable holding the level of the page
private short _level;
//The pagecrumb object of the current page
private PageCrumb _pageCrumb = new PageCrumb();
//We will use a sorted list as we can use the level as key
private SortedList _crumbList;
//Each page has a level. The page should declare its level
public short Level {
// TO DO : We can check for some constraints here
get { return _level; }
set { _level = value; }
}
//Each page needs a meaningful name of it. Let them declare it
public string TailName {
// TO DO : We can check for some constraints here
get { return _tailName; }
set { _tailName = value; }
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
}
#endregion
protected void Page_Load(object sender, EventArgs e)
{
if (!(Page.IsPostBack))
{
//Minimum level is 1
if ((_level <= 0))
{
_level = 1;
}
//If no friendly name gives Untitled as default
if ((string.IsNullOrEmpty(_tailName)))
{
_tailName = "Untitled";
}
//Create a Crumb object based on the properties of this page
_pageCrumb = new PageCrumb(_level, Request.RawUrl, _tailName);
//Check our Crumb is there in the session...if not create and add it...else get it
if (Session["HASH_OF_CRUMPS"] == null)
{
_crumbList = new SortedList();
Session.Add("HASH_OF_CRUMPS", _crumbList);
}
else
{
_crumbList = (SortedList) Session["HASH_OF_CRUMPS"];
}
//Now modify the List of the breadcrumb
ModifyList();
// Put the breadcrumb from the session of sortlist
PutBreadCrumbs();
}
}
private void ModifyList()
{
//Remove all Entries from the list which is higher or equal in level
//Because at a level there can be max 1 entry in the list
RemoveLowerLevelCrumbs();
//If level is 1 set the Crumb as home
if (_pageCrumb.Level == 1)
{
_crumbList.Clear();
_crumbList.Add((short)1, new PageCrumb(1, "/Home.aspx", "Home"));
}
else
{
//If nothing in the list adds the home link first
if (_crumbList.Count == 0)
{
_crumbList.Add((short)1, new PageCrumb(1, "/Home.aspx", "Home"));
}
//Now add the present list also no other check is required here as we have cleaned up the
//List at the start of the function
_crumbList.Add(_level, _pageCrumb);
}
}
//Function will remove all the entries from the list which is higher or equal to the
//present level
private void RemoveLowerLevelCrumbs()
{
ArrayList removalList = new ArrayList(_crumbList.Count);
foreach (short level in _crumbList.Keys)
{
if ((level >= _level))
{
removalList.Add(level);
}
}
//Now remove all keys in the list
foreach (short level in removalList)
{
_crumbList.Remove(level);
}
}
private void PutBreadCrumbs()
{
StringBuilder linkString = new StringBuilder();
PageCrumb pageCrumb = new PageCrumb();
int index = 0;
for (index = 0; index <= _crumbList.Count - 2; index++)
{
pageCrumb = (PageCrumb)_crumbList.GetByIndex(index);
linkString.Append(string.Format("<a href = {0} >{1} </a>", pageCrumb.Url, pageCrumb.LinkName));
linkString.Append(" > ");
}
//Add the tail also
pageCrumb = (PageCrumb)_crumbList.GetByIndex(index);
linkString.Append(pageCrumb.LinkName);
lblTrail.Text = linkString.ToString();
}
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.