您的位置:首页 > 编程语言 > C#

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

2011-03-14 19:28 501 查看
在很多程序中,我们都需要用到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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: