我有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
设置为任何值时,我收到以下消息:
当DropDownStyle为时,只能使用值AutoCompleteMode.None ComboBoxStyle.DropDownList和AutoCompleteSource不是 AutoCompleteSource.ListItems。
我找到了这个AutoSuggestCombo,但我再次遇到DropDownStyle
的问题。
我怎么能:
ComboBox
使用DropDownStyle
设置为DropDown
,但不允许最终用户输入新元素?{/ p>
能够搜索String
的{{1}}值的任何部分,而不仅仅是Items
样式中当前使用的StartsWith
吗? / p>
这是一个开始使用Rx的机会,还是这条路线是一个臃肿的解决方案和随之而来的学习曲线? (到目前为止使用的简单教程)
答案 0 :(得分:2)
您必须将所有自动填充属性设置为无,并自行处理这些内容。 可能有更简单的解决方案,但您可以像这样编写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;
}
您可以决定是否需要区分大小写;可能不是..