效果图:
缺陷:1>下拉框列表没有一直展开,需要人为点击一下
2>在GridView中显示时,没做严格校验:例用户输入一个或多个拼音之后,不选择下拉列表中的认一项,不会自动补全。
简单说明一下模糊音查询的实现:
思路: 利用微软的拼音DLL类,把汉字转换成拼音,之后用关键字(字符)遍历,把遍历的结果保存到集合中。
注意事项:
(1)在VS项目下添加引用,Microsoft Visual Studio International Feature Pack 1.0 下的三个DLL文件(微软开发拼音包,与下面的方法有关)
(2)DLL文件链接地址: http://download.csdn.net/detail/u013816709/9402672
代码如下:
<span style="font-size:14px;">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using Microsoft.International.Converters.PinYinConverter;
using System.Collections.ObjectModel;
namespace Test
{
public partial class Frm_MoHuYin : XtraForm
{
public Frm_MoHuYin()
{
InitializeComponent();
}
/// <summary>
/// gridcontrol 数据源
/// </summary>
BindingSource bs;
/// <summary>
/// 下拉框的数据来源
/// </summary>
List<string> listData = null;
/// <summary>
/// 下拉框列的格式
/// </summary>
DevExpress.XtraEditors.Repository.RepositoryItemComboBox ricb;
/// <summary>
/// 窗体加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Frm_MoHuYin_Load(object sender, EventArgs e)
{
//下拉框的绑定内容
listData = new List<string>();
string[] strs = new string[] { "北京","北平","天津","天水","天南","上海","上蔡","上班"};
listData = strs.ToList<string>();
BindGrid();
SetFormat();
}
/// <summary>
/// 绑定GridControl
/// </summary>
private void BindGrid() {
DataTable dt = new DataTable();
dt.Columns.Add("ID", Type.GetType("System.Int32"));
dt.Columns.Add("Age", Type.GetType("System.Int32"));
dt.Columns.Add("Number", Type.GetType("System.String"));
dt.Columns.Add("Name", Type.GetType("System.String"));
DataRow dr;
//随机数
Random rand = new Random();
for (int i = 0; i < 100; i++)
{
dr = dt.NewRow();
dr["ID"] = i + 1;
dr["Age"] = 20 + i;
dr["Number"] = "A00" + (i + 1).ToString();
dr["Name"] = listData[rand.Next(0, 7)];
dt.Rows.Add(dr);
}
bs = new BindingSource();
bs.DataSource = dt;
gc.DataSource = bs.DataSource;
}
/// <summary>
/// 设置下拉框列格式
/// </summary>
private void SetFormat() {
//设置列 ColumnEdit
ricb = new DevExpress.XtraEditors.Repository.RepositoryItemComboBox();
//重新绑定数据源
foreach (string aa in listData)
ricb.Items.Add(aa);
gv.Columns["Name"].ColumnEdit = ricb;
//定义一个事件
ricb.EditValueChanged += new EventHandler(ricb_EditValueChanged);
}
//事件实现
void ricb_EditValueChanged(object sender, EventArgs e)
{
BindSetComobox(listData);
}
/// <summary>
/// 下拉框数据筛选,绑定
/// </summary>
/// <param name="listData">下拉框未筛选前的数据</param>
private void BindSetComobox(List<string> listData) {
//获取当前输入的值
gv.FocusedRowHandle = -1;
bs.EndEdit();
string ss = gv.GetFocusedRowCellDisplayText("Name").ToString();
if (listData == null || listData.Count == 0)
return;
//筛选后的数据
List<string> check = new List<string>();
//如果输入的有值
if (ss.Length > 0)
{
// 拼音模糊查询(遍历List集合中的每一项)
for (int i = 0; i < listData.Count; i++)
{
string str = ChineseToPinYin(listData[i].ToString());
//判断该字符中是否包含输入的拼音
if (str.ToString().Contains(ss.Trim()))
{
//将查到的数据加到list中
check.Add(listData[i]);
}
}
}
//筛选结果,决定绑定什么
if (check.Count > 0)
{
BindComobox(check);
}
else
{
BindComobox(listData);
}
之后,要把gridcontrol设置可编辑状态
//bs.CancelEdit();
}
/// <summary>
/// 汉字字符串转换成拼音
/// </summary>
/// <param name="strFrom"></param>
/// <returns></returns>
private string ChineseToPinYin(string strFrom) {
string strReturn = "";
//定义一个可变长度的字符串
StringBuilder str = new StringBuilder();
try
{
//定义一个字符数组来接收每个汉字的拼音
char[] chs;
//遍历字符中的所有汉字
foreach (char c in strFrom.ToCharArray())
{
//验证该汉字是否合法
if (ChineseChar.IsValidChar(c))
{
ChineseChar CC = new ChineseChar(c);
//将该汉字转化为拼音集合
ReadOnlyCollection<string> roc = CC.Pinyins;
//获取集合中第一个数据即为该汉字的拼音
chs = roc[0].ToLower().ToCharArray();
//将该汉字的拼音首字母追加到可变字符串中
str.Append(chs[0]);
}
}
strReturn = str.ToString();
}
catch {
strReturn = strFrom;
}
return strReturn;
}
/// <summary>
/// 绑定下拉框数据源
/// </summary>
/// <param name="list"></param>
private void BindComobox(List<string> list) {
if (ricb.Items.Count > 0)
ricb.Items.Clear();
foreach (string aa in list)
ricb.Items.Add(aa);
}
}
}</span>