.NET平台下,使用字母进行中文模糊查询

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kone0611/article/details/88890680

Microsoft Visual Studio International Feature Pack 2.0 自述文件 

这篇文档提供了Visual Studio International Feature Pack 2.0 版本的信息。这里提供的信息包括基本功能的简单介绍以及系统需求,安装,下载和支持信息。其1.0版发布时的名字是Microsoft Visual Studio International Pack 1.0 SR1,由7个开发国际化软件应用的功能组件组成,有关Microsoft Visual Studio International Pack 1.0 SR1 的详情可访问 http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=44cac7f0-633b-477d-aed2-99aee642fc10 。 2.0版本是对 1.0版的扩展,如果希望使用全部功能请同时安装2.0和1.0两个版本。 

Microsoft Visual Studio International Feature Pack 2.0 功能

Visual Studio International Feature Pack 2.0 包含一组控件和类库,设计用来帮助.NET开发人员创建国际化程序。

  • Yomigana Framework 包含了类库和控件
    • 类库:

      通用目的的一些类,用泛型实现对一个可枚举的类型注音。

  • 特殊目的的一些类,用以上泛型实现对一个字符串用某种类型中注音。特殊目的的一些StringAnnotation 类,用以上泛型实现对一个字符串用字符串注音,包括解析和格式化功能。
  • 一个比较器类,使用以上类实现比较字符串。
  • 一个实现了IEnumerable<string> 的数据结构,把一个字符串分成枚举的字符串段,并用IEnumerator<string> 输出。
  • 控件:
    • 加强的Ajax/WPF/WinForm textboxes 用来根据用户的输入捕获读音。
    • 一个加强的使用Ruby标签的ASP.NET Label。
  • Chinese Text Alignment Class Library and TextBox Controls 包含支持简体中文文本对齐的WinForm 和 WPF 的TextBox控件, 以及供帮助开发人员很容易地按中文文本对齐显示字符串的一个类库。
  • Chinese Auto Complete Class Library and TextBox Controls 包含了支持感知简体中文和繁体中文输入法并自动完成的WinForm 和 WPF 的TextBox控件, 以及供开发人员很容易地向标准控件添加感知输入法并自动完成功能的一个类库。
  • Korean Auto Complete Class Library and ComboBox Controls 包含了支持感知韩语输入法并自动完成的WinForm 和 WPF 的ComboBox控件, 以及供开发人员很容易地向标准控件添加感知输入法并自动完成功能的一个类库。
  • Numeric Formatting Class Library East Asia Numeric Formatting Library的扩展版(East Asia Numeric Formatting Library是在Microsoft Visual Studio International Pack 1.0 中发布的,它提供一些类用来帮助开发者格式化数字成繁体中文,简体中文,日文以及韩文风格的数值字符串)。格式化数字成阿拉伯文的数值字符串是新增加的支持。 

 

系统需求

  • 支持的操作系统Windows XP Service Pack 3(x86, x64); Windows Server 2003 R2 (x86, x64); Windows Vista Service Pack 1(x86, x64); Windows Server 2008 (x86, x64).
  • 所需软件Microsoft Visual Studio 2005 或者 Microsoft Visual Studio 2008; Microsoft Expression Blend; Microsoft .NET Framework 3.5  

安装

  •  运行文件vsintlpack2.msi ,并完成安装 (x86操作系统上的默认安装目录是%SYSTEMDRIVE%\Program Files\Microsoft Visual Studio International Feature Pack 2.0\;x64操作系统上的默认安装目录是%SYSTEMDRIVE%\Program Files (x86)\Microsoft Visual Studio International Feature Pack 2.0\)。

下载位置

  • 请到Microsoft下载中心网站检查。

产品支持

  •  Microsoft Visual Studio International Feature Pack 2.0提供了有限的邮件支持。如果您对Microsoft Visual Studio International Feature Pack 2.0有反馈或者需要技术支持, 请发邮件至 [email protected]

应用示例:

效果图:


缺陷:

1>下拉框列表没有一直展开,需要人为点击一下
2>在GridView中显示时,没做严格校验:例用户输入一个或多个拼音之后,不选择下拉列表中的认一项,不会自动补全。
简单说明一下模糊音查询的实现:
思路:利用微软的拼音DLL类,把汉字转换成拼音,之后用关键字(字符)遍历,把遍历的结果保存到集合中。

注意事项:

     在VS项目下添加引用,Microsoft Visual Studio International Feature Pack 2.0 下的三个DLL文件(微软开发拼音包,与下面的方法有关)

 

代码如下:
 

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);        
        }
    }
}

猜你喜欢

转载自blog.csdn.net/kone0611/article/details/88890680