65.9K
CodeProject is changing. Read more.
Home

IntelliSense TextBox in C#

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (5 votes)

Mar 9, 2014

CPOL
viewsIcon

39113

downloadIcon

1627

This is an alternative for "IntelliSense TextBox in C#"

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.