根据你输入的内容自动过滤出匹配的列表项,并实时显示出来,和IE地址栏类似。
程序很简单,只是很长事时间没更新blog了,用这篇小文章来更新一下。
程序原理是这样的:组件继承之combobox,并且拥有一个listbox成员,当组件的text改变时,就从combobox中过滤出匹配的列表项,并且把这些列表项加入到listbox中显示出来。
演示效果:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
namespace XPangLib
{
/// <summary>
/// AutoComboBox 的摘要说明。
/// </summary>
public class AutoComboBox : System.Windows.Forms.ComboBox
{
private System.Windows.Forms.ListBox lbMain;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public AutoComboBox()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();
lbMain = new ListBox() ;
lbMain.Click+=new EventHandler(lbMain_Click);
lbMain.KeyDown+=new KeyEventHandler(lbMain_KeyDown);
lbMain.Visible = false ;
}
/// <summary>
/// 得到匹配给定字符串的列表
/// </summary>
private ArrayList GetFillList(string strValue)
{
ArrayList alReturn = new ArrayList() ;
int iCount = this.Items.Count ;
int iLen = strValue.Length ;
for(int i = 0 ;i < iCount ;i++)
{
string strSelItem = this.Items[i].ToString() ;
if (strSelItem.Length < iLen)
continue ;
if (strSelItem.Substring(0,iLen) == strValue)
alReturn.Add(strSelItem) ;
}
return alReturn ;
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components.Dispose();
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{//
// AutoComboBox
//
this.Sorted = true;
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.AutoComboBox_KeyDown);
this.DropDown += new System.EventHandler(this.AutoComboBox_DropDown);
this.TextChanged += new System.EventHandler(this.AutoComboBox_TextChanged);
this.SelectedIndexChanged += new System.EventHandler(this.AutoComboBox_SelectedIndexChanged);
this.Leave += new System.EventHandler(this.AutoComboBox_Leave);
}
#endregion