实现Textbox+listBoxControl拼音检索 C#(原)

在很多程序中,我们都需要用到Textbox拼音检索,在此我用TextBox和ListBox组合示例实现其拼音检索。

试验中我们实现了以下样式效果:

实现代码:

1、//添加textbox的TextChange事件

 private void textEdit1_TextChanged(object sender, EventArgs e)

{

}

2、我们可以将所要检索的信息存储在ArrayList中,例如上图中的道路信息(可以直接在数据库中读取dataTable后构建ArrayList,也可以通过遍历ListBox中的Items构建ArrayList中),此Arraylist将在下面的检索中用到。

3、利用下面两个函数,获得String字符的拼音组合。

  /// <summary>       

/// 拼音检索       

/// </summary>       

/// <param name="strText"></param>       

/// <returns></returns>       

static public string GetChineseSpell(string strText)       

{           

int len = strText.Length;           

string myStr = "";           

for (int i = 0; i < len; i++)           

{               

myStr += getSpell(strText.Substring(i, 1));

}           

return myStr;       

}       

/// <summary>       

/// 得到首字母       

/// </summary>       

/// <param name="cnChar"></param>       

/// <returns></returns>       

static public string getSpell(string cnChar)       

{           

byte[] arrCN = Encoding.Default.GetBytes(cnChar);           

if (arrCN.Length > 1)           

{               

int area = (short)arrCN[0];               

int pos = (short)arrCN[1];               

int code = (area << 8) + pos;               

int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };               

for (int i = 0; i < 26; i++)               

{                   

int max = 55290;                   

if (i != 25) max = areacode[i + 1];                   

if (areacode[i] <= code && code < max)                   

{                       

return Encoding.Default.GetString(new byte[] { (byte)(65 + i) });               

}               

}               

return "";           

}           

else               

return cnChar;

}

}

3、在TextBox的TextChanged事件中添加以下类似检索代码:

   private void textEdit1_TextChanged(object sender, EventArgs e)       

{           

this.listBoxControlStaValue.Items.Clear();               

System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("[^a-zA-Z\r\n]+");           

if (!reg.Match(textEdit1.Text.ToString()).Success)           

{           

    //遍历ArrayList中的所有道路信息

foreach (object o in m_list)               

{

//获得道路名称各汉字拼音首字母缩写

string strRoadName = GetChineseSpell(o.ToString()).ToLower();                   

string strtxtRoadName = textEdit1.Text.ToLower();       

//根据拼音进行匹配(利用Contain和Substring函数进行判定)            

if (strRoadName.Contains(strtxtRoadName)&&strRoadName.Substring(0, strtxtRoadName.Length ) == strtxtRoadName)               

{                         

listBoxControlStaValue.Items.Add(o);                       

}               

}           

}           

else           

{       

//当TextBox为空时显示所有数据        

ShowRouteName();           

}       

}

posted @ 2011-03-14 19:28  @龙飞凤舞@  阅读(3975)  评论(0编辑  收藏  举报