The Type and Search feature in not available out of the box for System.Windows.Forms.CheckedListBox or System.Windows.Forms.ListBox controls in .net. So, I thought to just share a simple trick with which this could be easily managed.
We can take two approaches to achieve this -
- Either we can go for creating a Custom control for this.
- And if this feature is not required at a general level, we can implement the functionality at the form/user control level.
Now, without talking much on this, I will take you straight away to the implementation -
The below is the code generated by the designer followed by the code to be written to make the type and search work -
partial class FrmTypeAndSearchListBox
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form 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()
{
this.lstBxTypeNSearch = new System.Windows.Forms.ListBox();
this.SuspendLayout();
//
// lstBxTypeNSearch
//
this.lstBxTypeNSearch.FormattingEnabled = true;
this.lstBxTypeNSearch.Items.AddRange(new object[] {
"Aashay",
"Aashish",
"Abdul-Azeez",
"Abdul-Baari",
"Abdullah",
"Abeer",
"Achal",
"Achalendra",
"Achintya",
"Achyut",
"Acyutaraya",
"Adalarasu",
"Adarsh",
"Agrim",
"Agriya",
"Ahmad",
"Ahsan",
"Aja",
"Ajaat",
"Ajaatshatru",
"Ajamil",
"Akhil",
"Akhilesh",
"Akmal",
"Akram",
"Akroor",
"Akshan",
"Aloke",
"Amal",
"Amalendu",
"Angad",
"Angamuthu",
"Anil",
"Arivunambi",
"Avinash",
"Azhagar",
"Azhar",
"Azzam"});
this.lstBxTypeNSearch.Location = new System.Drawing.Point(52, 47);
this.lstBxTypeNSearch.Name = "lstBxTypeNSearch";
this.lstBxTypeNSearch.Size = new System.Drawing.Size(146, 108);
this.lstBxTypeNSearch.TabIndex = 14;
this.lstBxTypeNSearch.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lstBxTypeNSearch_KeyDown);
//
// FrmTypeAndSearchListBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.lstBxTypeNSearch);
this.Name = "FrmTypeAndSearchListBox";
this.Text = "FrmTypeAndSearchListBox";
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.ListBox lstBxTypeNSearch;
}
public partial class FrmTypeAndSearchListBox : Form
{
DateTime lastKeyDownOnListBox; //DateTime of the last KeyDown on the ListBox.
StringBuilder listBoxFindString; //String to find in the ListBox.
int resetListBoxFindStringAfter; //Milliseconds after which the FindString should be reset.
int findStartIndex; //Starting index from where to find from.
public FrmTypeAndSearchListBox()
{
InitializeComponent();
//Initializing with current DateTime.
lastKeyDownOnListBox = DateTime.Now;
//Initialising the FindString with Empty.
listBoxFindString = new StringBuilder(string.Empty);
//Setting 250ms as the reset interval.
resetListBoxFindStringAfter = 250;
//Setting to -1 to start from the begining.
findStartIndex = -1;
}
private void lstBxTypeNSearch_KeyDown(object sender, KeyEventArgs e)
{
//Just incase the same handler is bound to multiple controls
//inheriting from ListBox class.
ListBox senderListBox = sender as ListBox;
if (senderListBox != null)
{
switch (e.KeyData.ToString())
{
case "Down":
case "Up":
case "Right":
case "Left":
//Add on the cases for the keys which we do not want to handle.
break;
default:
//Reset the FindString if the gap between two key strokes exceeds the specified limit.
if (DateTime.Now.Subtract(lastKeyDownOnListBox).Milliseconds > resetListBoxFindStringAfter)
{ listBoxFindString.Clear(); }
//Set the DateTime of the current key stroke.
lastKeyDownOnListBox = DateTime.Now;
//Prepare the Find String.
listBoxFindString.Append(e.KeyData.ToString());
//Find the matching index if any.
int matchedIndex = senderListBox.FindString(listBoxFindString.ToString(),
findStartIndex);
//Select the Item if a match is found.
if (matchedIndex > 0)
{ senderListBox.SelectedIndex = matchedIndex; }
break;
}
}
}
}
The above code is well commented. Still, if I have missed anything please feel free to revert with your comment. Hope, this small trick will prove to be helpful.