曾经在网上遇到过有人问关于自动填充的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已经具有自动功能了。