GridControl 中ComoboxEdit 列 模糊音查询

效果图:


缺陷: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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值