AlphaNavigator: Hotmail样式条带,代表以特定字母开头的条目

分享于 

5分钟阅读

Web开发

  繁體

介绍

我被要求创建一个hotmail样式( 联系人部分) alpha导航条。 看到重用的机会,我创建了一个控件而不是一个直接代码。 这个控制处于测试模式,因为我将增加更多的鲁棒性,但是我想说,控制的当前状态是完全稳定和可用的。 这个控件采用了几个变量,特别是数据库表和它将用链接组成的字母列表。

使用代码

下面是使用控件所需的代码示例。 首先引用 AlphaNavigator.dll,,然后将它的添加到你的工具箱中。 接下来将一个新实例拖到页面上,并在属性/事件面板中设置 LetterClick 事件的名称。

protected AlphaNavigator.AlphaNavigator AlphaNavigator1;privatevoid Page_Load(object sender, System.EventArgs e){
 this.AlphaNavigator1.LetterClick += 
 new System.EventHandler(this.AlphaNavigator1_LetterClick);
 string sSql = "SELECT DISTINCT SUBSTRING(Column,1,1)" +
 "FROM Table ORDER BY SUBSTRING(Column,1,1)";
 OdbcConnection sqlConn = null;
 sqlConn = new OdbcConnection("Driver={MySQL ODBC 3.51 Driver};" + 
 "dsn=DNSNAME;database=DBNAME;uid=USER;password=PASS;");
 sqlConn.Open();
 OdbcCommand sqlCmd;
 OdbcDataReader myReader;
 sqlCmd = new OdbcCommand(sSql,sqlConn);
 sqlCmd.CommandTimeout = 10;
 myReader = sqlCmd.ExecuteReader();
 AlphaNavigator1.DataSource = myReader;
}privatevoid AlphaNavigator1_LetterClick(object sender,System.EventArgs e){
 Response.Write("Selected Letter:" + AlphaNavigator1.SelectedLetter);
}

AlphaNavigator控件

这是控件的主要代码。 重写 Render 方法。 代码只查询数据库并遍历行,同时向 array 添加存在的项。 完成这里操作后,将绘制 GUI:

protectedoverridevoid Render(System.Web.UI.HtmlTextWriter writer) {
 StringDictionary abc = AlphaLinks();
 string alphabet = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 if (this.SelectedLetter!= ""){
 System.Web.UI.HtmlControls.HtmlAnchor hypLink = 
 new System.Web.UI.HtmlControls.HtmlAnchor();
 hypLink.HRef = 
 "javascript:" + this.Page.GetPostBackEventReference(this, 
 "LetterClick");
 hypLink.Name = this.UniqueID;
 hypLink.InnerHtml = "All";
 Controls.Add(hypLink);
 } else {
 Label lblAll = new Label();
 lblAll.Text = "All";
 Controls.Add(lblAll);
 }
 foreach (char C in alphabet){
 Label lblSpace = new Label();
 lblSpace.Text = "";
 Controls.Add(lblSpace);
 string sCurrentChar = C.ToString();
 if ((abc[sCurrentChar] == "on") && (this.SelectedLetter!= sCurrentChar)){
 System.Web.UI.HtmlControls.HtmlAnchor hypLink = 
 new System.Web.UI.HtmlControls.HtmlAnchor();
 hypLink.HRef ="javascript:" + this.Page.GetPostBackEventReference(this, 
 "LetterClick" + sCurrentChar);
 hypLink.Name = this.UniqueID + "_" + sCurrentChar;
 hypLink.InnerHtml = "" + sCurrentChar + "";
 Controls.Add(hypLink);
 } else {
 Label lblLetter = new Label();
 lblLetter.Text = sCurrentChar;
 Controls.Add(lblLetter);
 }
 }
 base.Render(writer);
}private StringDictionary AlphaLinks(){
 StringDictionary abc = new StringDictionary();
 if (_dataSource!= null){
 if (_dataSource is DataView) {
 DataView dv = (DataView)_dataSource;
 foreach(DataRow dr in dv.Table.Rows){
 string letter = dr[0].ToString().ToUpper();
 if (Char.IsDigit(letter[0]))
 abc["#"] = "on";
 else abc[letter] = "on";
 }
 }elseif (_dataSource is IDataReader) {
 IDataReader reader = (IDataReader)_dataSource;
 while (reader.Read()) {
 string letter = reader[0].ToString().ToUpper();
 if (Char.IsDigit(letter[0]))
 abc["#"] = "on";
 else abc[letter] = "on";
 }
 }
 }
 abc["All"] = "on";
 return abc;
}

未来计划

更强大的健壮性。

历史记录

  • 版本 1.0,2005年05月。
  • 版本 1.1,2005年05月 - 重写,现在使用 DataSource 构建自己。

STA  rep  str  style  LET  REPR  
相关文章