autoComplete combobox

类别:.NET开发 点击:0 评论:0 推荐:
曾经在网上遇到过有人问关于自动填充的ComboBox的问题,当然没有在意,谁知道后来也因为软件开发需要碰到了同样的问题。于是只好到处找资料,谁知道网上的仅仅只能实现自动填充的功能,并不能象IE栏一样,碰到有相同的信息,可以展开ComboBox并高亮选中的内容。( 比容,ComboBox下有3天记录,分别是:eqweq,fasdfs,tyr”当我在输入字符e的时候,应当文本框中显示eqweq并展开下拉框,选中eqweq)。百般无赖,只好对代码进行研究,经过稍稍的改动,已经可以实现我所预想的功能,源代码如下:

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace DigitalCult
{
    /// <summary>
    /// Summary description for ACComboBox.
    /// </summary>
    public class ACComboBox : System.Windows.Forms.ComboBox
    {         private bool autoComplete;

        [DefaultValue(true),
        Description("Auto-completes text if a match is found in the items collection."),
        Category("Behavior")]
        public bool AutoComplete
        {
            get { return autoComplete; }
            set { autoComplete = value; }
        }

        /// <summary>
        /// Required designer variable.
        /// </summary>
        private Container components = null;

        /// <summary>
        /// Default constructor.
        /// </summary>
        public ACComboBox()
        {
            // This call is required by the Windows.Forms Form Designer.
            InitializeComponent();

            // Add any initialization after the InitComponent call
            this.autoComplete = true;
            this.KeyPress += new KeyPressEventHandler( this.OnKeyPress );
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if( components != null )
                    components.Dispose();
            }
            base.Dispose( disposing );
        }

        private void OnKeyPress( object sender, KeyPressEventArgs e )
        {
            if ( autoComplete )
            {
                ACComboBox acComboBox = (ACComboBox)sender;
                if ( !e.KeyChar.Equals( (char)8 ) )
                {
                    SearchItems( acComboBox, ref e );
                }
                else
                    e.Handled = false;
            }
            else
                e.Handled = false;
        }

        /// <summary>
        /// Searches the combo box item list for a match and selects it.
        /// If no match is found, then selected index defaults to -1.
        /// </summary>
        ///
        ///
        private void SearchItems( ACComboBox acComboBox, ref KeyPressEventArgs e )
        {
            int selectionStart = acComboBox.SelectionStart;
            int selectionLength = acComboBox.SelectionLength;
            int selectionEnd = selectionStart + selectionLength;
            int index;
            StringBuilder sb = new StringBuilder();

            sb.Append( acComboBox.Text.Substring( 0, selectionStart ) )
                .Append( e.KeyChar.ToString() )
                .Append( acComboBox.Text.Substring( selectionEnd ) );
            index = acComboBox.FindString( sb.ToString() );
            
            if ( index == -1 )
                e.Handled = false;
            else
            {
                acComboBox.SelectedIndex = index;
                acComboBox.Select( selectionStart+1, acComboBox.Text.Length-(selectionStart+1) );
                e.Handled = true;
            }
        }

        #region Component Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
        }
        #endregion
    }
}


具体使用方法如下:
1、在你程序中添加新的组件类。
2、把上面的代码的命名空间(namespace )改成你程序的命名空间
3、找到你需要它具备自动功能的ComboBox。比如comboBox1
private System.Windows.Forms.ComboBox comboBox1;
改成private ACComboBox comboBox1;( ACComboBox为你写的控件的类名)
然后在窗体自动生成的代码中找到初始化的语句
this.comboBox1 = new System.Windows.Forms.ComboBox();
改成this.comboBox1 = new ACComboBox ();
OK,现在你的ComboBox已经具有自动功能了。

本文地址:http://com.8s8s.com/it/it43840.htm