autoComplete combobox

曾经在网上遇到过有人问关于自动填充的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 call
this.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 );
}
else
e.Handled = false;
}
else
e.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已经具有自动功能了。 `

Published At
Categories with Web编程
Tagged with
comments powered by Disqus