在组合框中搜索值(使用退格键)
Search for value in combobox (use of backspace)
我正在尝试这样做,以便当用户在组合框中键入内容时,组合框将尝试找到与搜索值完全匹配的第一个项目。如果那不可能,它将尝试找到第一个包含搜索值的。如果它既不是前面提到的,它就会变成红色。现在我已经弄清楚了那部分并开始工作,但我遇到的问题是,当用户尝试退格时,搜索将再次触发,因此它在大多数情况下会再次选择一行。我怎样才能让它不会在退格后搜索,或者如果用户试图退格则阻止它选择索引。这是我使用的代码:
private void BestelIndexSearch(object sender, EventArgs e)
{
ComboBox Cmbbx = sender as ComboBox;
int index = -1;
string searchvalue = Cmbbx.Text;
if (Cmbbx.Text != "")
{
for (int i = 0; i < Cmbbx.Items.Count; i++)//foreach replacement (not possible with combobox)
{
//search for identical art
if (Cmbbx.Items[i].ToString().Equals(searchvalue))
{
index = Cmbbx.Items.IndexOf(searchvalue);
break;//stop searching if it's found
}
//search for first art that contains search value
else if (Cmbbx.Items[i].ToString().Contains(searchvalue) && index == -1)
{
index = Cmbbx.FindString(searchvalue);
break;//stop searching if it's found
}
}
}
//if nothing found set color red
if (index == -1)
{
Cmbbx.BackColor = Color.Red;
}
//if found set color white, select the item
else
{
Cmbbx.BackColor = Color.White;
Cmbbx.SelectedIndex = index;
}
//select text behind cursor
Cmbbx.SelectionStart = searchvalue.Length;
Cmbbx.SelectionLength = Cmbbx.Text.Length - searchvalue.Length;
}
代码设置为在 TextChanged
事件上触发,并且绑定到多个组合框。如果有人能帮助我,我将不胜感激。
您应该向您的组合框添加一个 Keydown 事件以检查按下了哪个键并使用以下代码修改您的代码:
private bool _isCheckedActivated = true;
private void BestelIndexSearch(object sender, EventArgs e)
{
if (! _isCheckedActivated)
{
_isCheckedActivated = true;
return;
}
[...]
}
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Back)
_isCheckedActivated = false;
}
或者,您可以使用自动完成功能中的构建。使用内置功能,您不太容易出现错误,并且用户可以在选择项目之前预览备选方案。如果您有多个组合框,您可以创建一个扩展方法。
public static class MyExtensions
{
public static void SetDataAndAutoCompleteSource<T>(this ComboBox cmb, IEnumerable<T> src)
{
cmb.DataSource = src;
cmb.AutoCompleteSource = AutoCompleteSource.ListItems;
cmb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
AutoCompleteStringCollection aSrc = new AutoCompleteStringCollection();
aSrc.AddRange(src.Select(c => c.ToString()).ToArray());
cmb.AutoCompleteCustomSource = aSrc;
}
}
用法:
comboBox1.SetDataAndAutoCompleteSource(myDataSource);
我正在尝试这样做,以便当用户在组合框中键入内容时,组合框将尝试找到与搜索值完全匹配的第一个项目。如果那不可能,它将尝试找到第一个包含搜索值的。如果它既不是前面提到的,它就会变成红色。现在我已经弄清楚了那部分并开始工作,但我遇到的问题是,当用户尝试退格时,搜索将再次触发,因此它在大多数情况下会再次选择一行。我怎样才能让它不会在退格后搜索,或者如果用户试图退格则阻止它选择索引。这是我使用的代码:
private void BestelIndexSearch(object sender, EventArgs e)
{
ComboBox Cmbbx = sender as ComboBox;
int index = -1;
string searchvalue = Cmbbx.Text;
if (Cmbbx.Text != "")
{
for (int i = 0; i < Cmbbx.Items.Count; i++)//foreach replacement (not possible with combobox)
{
//search for identical art
if (Cmbbx.Items[i].ToString().Equals(searchvalue))
{
index = Cmbbx.Items.IndexOf(searchvalue);
break;//stop searching if it's found
}
//search for first art that contains search value
else if (Cmbbx.Items[i].ToString().Contains(searchvalue) && index == -1)
{
index = Cmbbx.FindString(searchvalue);
break;//stop searching if it's found
}
}
}
//if nothing found set color red
if (index == -1)
{
Cmbbx.BackColor = Color.Red;
}
//if found set color white, select the item
else
{
Cmbbx.BackColor = Color.White;
Cmbbx.SelectedIndex = index;
}
//select text behind cursor
Cmbbx.SelectionStart = searchvalue.Length;
Cmbbx.SelectionLength = Cmbbx.Text.Length - searchvalue.Length;
}
代码设置为在 TextChanged
事件上触发,并且绑定到多个组合框。如果有人能帮助我,我将不胜感激。
您应该向您的组合框添加一个 Keydown 事件以检查按下了哪个键并使用以下代码修改您的代码:
private bool _isCheckedActivated = true;
private void BestelIndexSearch(object sender, EventArgs e)
{
if (! _isCheckedActivated)
{
_isCheckedActivated = true;
return;
}
[...]
}
private void comboBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Back)
_isCheckedActivated = false;
}
或者,您可以使用自动完成功能中的构建。使用内置功能,您不太容易出现错误,并且用户可以在选择项目之前预览备选方案。如果您有多个组合框,您可以创建一个扩展方法。
public static class MyExtensions
{
public static void SetDataAndAutoCompleteSource<T>(this ComboBox cmb, IEnumerable<T> src)
{
cmb.DataSource = src;
cmb.AutoCompleteSource = AutoCompleteSource.ListItems;
cmb.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
AutoCompleteStringCollection aSrc = new AutoCompleteStringCollection();
aSrc.AddRange(src.Select(c => c.ToString()).ToArray());
cmb.AutoCompleteCustomSource = aSrc;
}
}
用法:
comboBox1.SetDataAndAutoCompleteSource(myDataSource);