public partial 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; }
}
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);
}
public ACComboBox(IContainer container)
{
container.Add(this);
InitializeComponent();
this.autoComplete = true;
this.KeyPress += new KeyPressEventHandler(this.OnKeyPress);
}
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>
///<param name=""acComboBox"" />
///<param name=""e"" />
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;
}
}
}