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.
No comments:
Post a Comment