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






3.80/5 (5投票s)
2005年5月4日
1分钟阅读

57878

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
自建。