组合框下拉列表搜索文本
本文关键字:文本 搜索 下拉列表 组合 | 更新日期: 2023-09-27 17:58:02
我有一个ComboBox
DataSource
属性设置为此Type
的列表:
public class ListInfo
{
public int Key { get; set; }
public string Name { get; set; }
}
DropDownStyle
设置为DropDownList
,我将AutoCompleteSource
设置为ListItems
,将AutoCompleteMode
设置为SuggestAppend
。
经过一些测试后,客户端回来并要求能够找到文本值的任何部分,而不仅仅是从文本的开头。我见过的大多数示例都是在DropDownStyle
设置为 DropDown
时执行此操作的,我无法这样做,因为用户无法编辑列表的内容,只需选择一个值。
我尝试创建一个CustomSource
,但是当我尝试将AutoCompleteMode
设置为任何值时,我收到以下消息:
只有值 AutoCompleteMode.None 可以在 DropDownStyle 为 ComboBoxStyle.DropDownList 和 AutoCompleteSource 不是 AutoCompleteSource.ListItems.
我找到了这个自动建议组合,但我再次遇到了DropDownStyle
的问题。
我怎样才能:
使用
DropDownStyle
设置为DropDown
的ComboBox
,不允许最终用户输入新元素?能够搜索
Items
String
值的任何部分,而不仅仅是当前在DropDownList
样式中使用的StartsWith
?
这是开始使用 Rx 的机会,还是该路线是一个臃肿的解决方案和随之而来的学习曲线?(到目前为止使用简单的教程(
您必须将所有自动完成属性设置为 none 并自行处理这些内容。可能有更简单的解决方案,但您可以像这样编写 KeyPress 事件。
private void comboBox1_KeyPress(object sender, KeyPressEventArgs e)
{
SortedDictionary<int, ListInfo> dict = new SortedDictionary<int, ListInfo>();
int found = -1;
int current = comboBox1.SelectedIndex;
// collect all items that match:
for (int i = 0; i < comboBox1.Items.Count; i++)
if (((ListInfo)comboBox1.Items[i]).Name.ToLower().IndexOf(e.KeyChar.ToString().ToLower()) >= 0)
// case sensitive version:
// if (((ListInfo)comboBox1.Items[i]).Name.IndexOf(e.KeyChar.ToString()) >= 0)
dict.Add(i, (ListInfo)comboBox1.Items[i]);
// find the one after the current position:
foreach (KeyValuePair<int, ListInfo> kv in dict)
if (kv.Key > current) { found = kv.Key; break; }
// or take the first one:
if (dict.Keys.Count > 0 && found < 0) found = dict.Keys.First();
if (found >= 0) comboBox1.SelectedIndex = found;
e.Handled = true;
}
您可以决定是否要区分大小写;可能不需要。