支持拼音检索的TextBox扩展控件

简介:

最近因项目中要用,于是就扩展了TextBox实现输入汉字首字母简单查询。控件扩展代码很简单。但是刚开始,一直没有找到扩展入口,始终无法展现下拉框。先想通过AutoCompleteCustomSource属性改变来实现,但最终没法扩展。后又想到ComboBox但是,也不好控制。经过一天的思考后决定用TextBox + ListBox组合扩展(主要为继承至TextBox和持有ListBox

效果先上:

 

最要实现代码有:

类原型public class SpellSearchBoxEx : TextBox

{

private ListBox searchList;

.....

1

 

SpellSearchSource :查询数据源(汉字)

事件的绑定和选择全在属性里;

public string[] SpellSearchSource

        {

            get { return source; }

            set

            {

                if (value != null)

                {

                    source = value;

                    InitSourceSpell();//实现数据转化为相应拼音并存储;

                    TextChanged += new EventHandler(SpellSearchBoxEx_TextChanged);

                    LostFocus += new EventHandler(SpellSearchBoxEx_LostFocus);

// searchList是一个ListBox,它用来显示下拉框;

                    searchList.KeyDown += new KeyEventHandler(searchList_KeyDown);

                    searchList.Click += new EventHandler(searchList_Click);

                    searchList.MouseMove += new MouseEventHandler(searchList_MouseMove);

                }

 

            }

        }

 

2TextChanged事件代码

 

 protected virtual void SpellSearchBoxEx_TextChanged(object sender, EventArgs e)
        {
            searchList.Items.Clear();
            string str = this.Text;

            foreach (string var in spellList)
            {
                if (SearchMode == SearchMode.Contains)
                {
                    if (var.IndexOf(str.ToUpper()) != -1)
                    {
                        searchList.Items.Add(source[spellList.IndexOf(var)]);
                    }
                }
                else
                {
                    if (var.ToUpper().StartsWith(str.ToUpper()))
                    {
                        for (int i = 0; i < spellList.Count; i++)
                        {
                            if (spellList[i].Equals(var) && !searchList.Items.Contains(source[i]))
                            {
                                searchList.Items.Add(source[i]);
                            }
                        }
                    }
                }
            }
            if (Regex.IsMatch(str, "[\u4e00-\u9fa5]+"))
            {

                foreach (string var in source)
                {
                    if (SearchMode == SearchMode.Contains)
                    {
                        if (var.ToUpper().IndexOf(str.ToUpper()) != -1 && !searchList.Items.Contains(var))
                        {
                            searchList.Items.Add(var);
                        }
                    }
                    else
                    {
                        if (var.ToUpper().StartsWith(str.ToUpper()) && !searchList.Items.Contains(var))
                        {
                            searchList.Items.Add(var);
                        }
                    }
                }

            }
            SetSearchBoxState();

        }

 

3:控制ListBox的显示和隐藏

        private void SetSearchBoxState()

        {

            if (searchList.Items.Count > 0)

            {

                searchList.BorderStyle = BorderStyle.FixedSingle;

// maxItemCount为下拉框最大显示数;

                searchList.Height = ((searchList.Items.Count >= maxItemCount ? maxItemCount : searchList.Items.Count) + 1) * searchList.ItemHeight;

                searchList.Parent = this.Parent;

                searchList.Location = new System.Drawing.Point(this.Left, this.Bottom);

                searchList.Width = this.Width;

                searchList.BringToFront();

                searchList.Visible = true;

            }

            else

            {

                searchList.Visible = false;

            }

        }

4:剩下的为:控制鼠标滑动和键盘方向键操作,很简单,主要利用ListBox的选中项为高亮显示;及在textBox LostFocus 并非ListBox获得焦点时隐藏结果控件ListBox

5

ListBox上回车或者是点击时提交代码

protected virtual void CommitSearchList()

        {

            if (searchList.SelectedIndex > -1)

            {

                this.Text = searchList.Items[searchList.SelectedIndex].ToString();

                searchList.Visible = false;

                this.Focus();

            }

        }

 

6:主体汉字检索拼音转化代码,见下:很简单,可以直接复制拿来用。

 

代码

 

 

 测试用例及代码

 


本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2009/12/03/1615975.html,如需转载请自行联系原作者

目录
相关文章
|
XML Java 程序员
WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能
很多工程软件拥有自己定义的脚本语言,作为程序员用惯了具有高亮显示和智能提示功能的编辑器,所以针对特定的脚本自己开发一个编辑器。主要采用WPF、C#语言以及AvalonEdit控件。
WPF使用AvalonEdit实现代码高亮显示、搜索、替换功能
|
C#
正则表达式——WPF输入控件TextBox 限定输入特定字符
原文:正则表达式——WPF输入控件TextBox 限定输入特定字符 概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤逻辑。
2081 0