Introduction
Taking as base from IntelliSense TextBox in C#, created by Anand Gunasekaran, I decided to create a new user control inherithed from TextBox
that provides automatically an IntelliSense-Like function without calling any method.
Using the code
Building the control
The new control must have two important components: a list of strings for containing all the words we want for autocomplete and a ListBox that will show all the words in the list.
List<string> dictionary;
ListBox listbox;
Then, let's make a constructor for the class that allow us put the control in the UI designer and, of course, initialize the inner ListBox in the new IntelliSenseTextBox.
public IntelliSenseTextBox() : base()
{
listbox = new ListBox();
listbox.Parent = this;
listbox.KeyUp += OnKeyUp;
listbox.Visible = false;
this.dictionary = new List<string>();
}
After, we will override some methods of the TextBox, specifically OnKeyPress and OnTextChanged
protected override void OnKeyPress(KeyPressEventArgs e)
{
base.OnKeyPress(e);
if (e.KeyChar == (char)Keys.Enter || e.KeyChar == (char)Keys.Down)
{
if (listbox.Visible == true)
{
listbox.Focus();
}
e.Handled = true;
}
else if (e.KeyChar == (char)Keys.Escape)
{
listbox.Visible = false;
e.Handled = true;
}
}
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
Point cp;
GetCaretPos(out cp);
List<string> lstTemp = new List<string>();
listbox.SetBounds(cp.X + this.Left, cp.Y + this.Top + 20, 150, 50);
var TempFilteredList = dictionary.Where(
n => n.StartsWith(GetLastString(this.Text).ToUpper())).Select(r => r);
lstTemp = TempFilteredList.ToList<string>();
if (lstTemp.Count != 0 && GetLastString(this.Text) != "")
{
listbox.DataSource = lstTemp;
listbox.Show();
}
else
{
listbox.Hide();
}
}
Finally we must create the method to handle the KeyUp of the ListBox
private void OnKeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
string StrLS = GetLastString(this.Text);
int LIOLS = this.Text.LastIndexOf(StrLS);
string TempStr = this.Text.Remove(LIOLS);
this.Text = TempStr + ((ListBox)sender).SelectedItem.ToString();
this.Select(this.Text.Length, 0);
listbox.Hide();
}
}
Using the control
Now our IntelliSenseTextBox
is complete but, we need to specify which words will be in the dictionary
public partial class Form1 : Form
{
List<string> ISList = new List<string>(new string[]{
"SELECT",
"CREATE",
"TABLE",
"JOB",
"INFO",
"SOLUTIONS",
"GOOGLE",
"VISUAL STUDIO"
});
public Form1()
{
InitializeComponent();
this.intelliSenseTextBox1.Dictionary = ISList;
}
}
Points of Interest
When I saw the work of Anand Gunasekaran I was very interested in the topic so I decided to create this control for my school projects, specifically for a compiler in which a friend and I are working.