曾经在网上遇到过有人问关于自动填充的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{
` ///
1<summary> `
2` /// Summary description for ACComboBox. `
3` /// </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; }}
` ///
1<summary> `
2` /// Required designer variable. `
3` /// </summary>
private Container components = null; `
` ///
1<summary> `
2` /// Default constructor. `
3` /// </summary>
public ACComboBox() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); `
// Add any initialization after the InitComponent callthis.autoComplete = true;this.KeyPress += new KeyPressEventHandler( this.OnKeyPress );}
` ///
1<summary> `
2` /// Clean up any resources being used. `
3` /// </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 );}elsee.Handled = false;}elsee.Handled = false;}
` ///
1<summary> `
2` /// Searches the combo box item list for a match and selects it. `
3` /// If no match is found, then selected index defaults to -1. `
4` /// </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
` ///
1<summary> `
2` /// Required method for Designer support - do not modify `
3` /// the contents of this method with the code editor. `
4` /// </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已经具有自动功能了。 `