AToZed WebControl

A custom WebControl. It renders as a single '<span></span>' containing an anchor for each letter of the alphabet. On postback, the control's SelectedItem property will be set to the letter that was clicked.

Styling is achieved through CSS - the clicked item will, when rendered, have a class attribute whose value will be the value of the WebControl's SelectedItemCssClass property. To get a vertically-rendered control, set the contained anchors' display property to 'block', and to get lowercase letters set their text-transform property to....'lowercase'.



public class Alphabet : System.Collections.IEnumerable
{
    public System.Collections.IEnumerator GetEnumerator()
    {
        return "ABCDEFGHIJKLMNOPQRSTUVWXYZ".GetEnumerator();
    }
}


public class AToZed : WebControl, IPostBackEventHandler
{

    #region Properties

        public string SelectedItem
        {
            get
            {
                object obj = this.ViewState[ "selected" ];

                if ( obj != null )
                {
                    return (string) obj;
                }
                else
                {
                    return string.Empty;
                }
            }
            set
            {
                this.ViewState[ "selected" ] = value;
            }
        }

        public string SelectedItemCssClass
        {
            get
            {
                object obj = this.ViewState[ "selected-css" ];

                if ( obj != null )
                {
                    return (string) obj;
                }
                else
                {
                    return string.Empty;
                }
            }
            set
            {
                this.ViewState[ "selected-css" ] = value;
            }
        }

    #endregion

    #region Overridden WebControl Methods

    protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
    {
        string selected_item = this.SelectedItem;
        string selected_css = this.SelectedItemCssClass;

        foreach ( char letter in new Alphabet() )
        {
            string str = letter.ToString();

            writer.AddAttribute( HtmlTextWriterAttribute.Href, 
                                    Page.GetPostBackClientHyperlink( this, str ) );

            if ( str == selected_item && selected_css.length > 0 )
            {
                writer.AddAttribute( HtmlTextWriterAttribute.Class, selected_css );
            }

            writer.RenderBeginTag( HtmlTextWriterTag.A );

            writer.Write( str );

            writer.RenderEndTag();

            writer.WriteLine();
        }
    }

    #endregion

    #region PostBack Handling

        private static readonly object __selectionChanged = new object();
            
        public event EventHandler SelectionChanged
        {
            add
            {
                Events.AddHandler( __selectionChanged, value );
            }
            remove
            {
                Events.RemoveHandler( __selectionChanged, value );
            }
        }

        protected virtual void OnSelectionChanged( EventArgs e )
        {
            EventHandler handler = (EventHandler) Events[ __selectionChanged ];

            if ( handler != null )
            {
                handler( this, e );
            }
        }

        void IPostBackEventHandler.RaisePostBackEvent( string arg )
        {
            this.SelectedItem = arg;
            this.OnSelectionChanged( EventArgs.Empty );
        }

    #endregion

}