C#
ASP.NET
VSTO
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 }