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