I have a large amount of items in a listBox called listBox1. I also have a textBox (textBox1) at the top. I want to be able to type into the textBox and the listBox searches through it's item's and finds ones that contain what I am typing.
For example, say the listBox contains
"Cat"
"Dog"
"Carrot"
and "Brocolli"
If I start typing the letter C, then I want it to show both Cat and Carrot, when I type a it should keep showing them both, but when I add an r it should remove Cat from the list. Is there anyway to do this?
Filter the listbox. Try this:
List<string> items = new List<string>();
private void Form1_Load(object sender, EventArgs e)
{
items.AddRange(new string[] {"Cat", "Dog", "Carrots", "Brocolli"});
foreach (string str in items)
{
listBox1.Items.Add(str);
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
listBox1.Items.Clear();
foreach (string str in items)
{
if (str.StartsWith(textBox1.Text, StringComparison.CurrentCultureIgnoreCase))
{
listBox1.Items.Add(str);
}
}
}
Here's an pretty good example:
http://www.java2s.com/Code/CSharp/Components/UseanAutocompleteComboBox.htm
Rudimentary example; however this should get you started...
public partial class Form1 : Form
{
List<String> _animals = new List<String> { "cat", "carrot", "dog", "goat", "pig" };
public Form1()
{
InitializeComponent();
listBox1.Items.AddRange(_animals.ToArray());
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
String search = textBox1.Text;
if (String.IsNullOrEmpty(search))
{
listBox1.Items.Clear();
listBox1.Items.AddRange(_animals.ToArray());
}
var items = (from a in _animals
where a.StartsWith(search)
select a).ToArray<String>();
listBox1.Items.Clear();
listBox1.Items.AddRange(items);
}
}
For getting result which the asked expects, you have to use Contains method instead StartWith method.
Like this:-
private void textBox1_TextChanged(object sender, EventArgs e)
{
listBox1.Items.Clear();
foreach (string str in items)
{
if (str.ToUpper().Contains(textBox1.Text.ToUpper()))
{
listBox1.Items.Add(str);
}
}
}
I was in search for this.
I think you need to use a linq query and then databind the result. An example of this in WPF is here, but I believe you can do the same in winforms.