65.9K
CodeProject 正在变化。 阅读更多。
Home

AlphaNavigator:类似 Hotmail 的字母条,代表以某个字母开头的条目

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.80/5 (5投票s)

2005年5月4日

1分钟阅读

viewsIcon

57878

downloadIcon

651

这是一个完全独立的控件,使用后,设计器将显示一个字母条,代表以某个字母开头的条目。找到的字符将成为超链接。该控件具有自定义事件处理程序,用于确定点击了哪个字母。

引言

我被要求创建一个 Hotmail 风格(联系人部分)的字母导航条。看到一个可重用的机会,我创建了一个控件而不是直接编写代码。该控件处于 Beta 阶段,我将继续增加其健壮性,但我想说的是,控件的当前状态完全稳定且可用。该控件需要几个变量,特别是数据库表和从中构建字母列表和链接的列。

使用代码

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

protected AlphaNavigator.AlphaNavigator AlphaNavigator1;
private void 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;
}
private void AlphaNavigator1_LetterClick(object sender,System.EventArgs e){
    Response.Write("Selected Letter:" + AlphaNavigator1.SelectedLetter);
}

AlphaNavigator 控件

这是控件的主要代码。Render 方法被重写。代码只是查询数据库并循环遍历行,同时将存在的项目添加到数组中。完成此操作后,将绘制 GUI

protected override void 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";
            }
        }else if (_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年5月。
  • 版本 1.1,2005年5月 - 重写,现在使用 DataSource 自建。
© . All rights reserved.