ComboBox自带有属性可以实现自动匹配,但是它有一个弊端,只能从头开始匹配,例如"李四LS",只能输入“李四”或"李"才能匹配出来,而输入"LS"是找不出来的。
绑定到ComboBox的下拉选项中的后台数据:
string[] data = new string[] { "张三|ZS", "李四|LS", "王五|WW", "赵六|ZL", "田七|TQ" };
先展示如何通过AutoComplete实现自动匹配
comAutoSelect.Items.AddRange(data);comAutoSelect.AutoCompleteMode = AutoCompleteMode.SuggestAppend;comAutoSelect.AutoCompleteSource = AutoCompleteSource.ListItems;
这样,在前台输入"张三"会自动匹配出下拉选项"张三|ZS",输入"ZS",没有其他下拉选项。
手动绑定是通过TextUpdate来实现,这里也考虑过TextChanged事件来实现,但是TextChanged事件和DroppedDown = true,以及键盘的上下键选择有冲突,因此选用TextUpdate事件。
comAutoSelect.Items.AddRange(data);comAutoSelect.TextUpdate += (a, b) =>{ var input = comAutoSelect.Text.ToUpper(); comAutoSelect.Items.Clear(); if (string.IsNullOrWhiteSpace(input)) comAutoSelect.Items.AddRange(data); else { var newList = data.Where(x => x.IndexOf(input, StringComparison.CurrentCultureIgnoreCase) != -1).ToArray(); comAutoSelect.Items.AddRange(newList); } comAutoSelect.Select(comAutoSelect.Text.Length, 0); comAutoSelect.DroppedDown = true; //保持鼠标指针形状 Cursor = Cursors.Default;};
主要的思路是当前台的文字改变时,刷新Items属性。有几个要注意。
1.不能用DataSource,因为绑定数据之后就不行对Items执行clear和add事件;另外,绑定数据后会默认选择第一行,如果需要输入多个字符,这样会产生全选,覆盖的输入效果。
2.在完成外Items的赋值后,执行comAutoSelect.Select(comAutoSelect.Text.Length, 0);将光标移到输入的最后,否则输入的文字会跟理想的字符串倒序。将光标移到最后可以用以下两种方法:
comAutoSelect.Select(comAutoSelect.Text.Length, 0);
comAutoSelect.SelectionStart = comAutoSelect.Text.Length;
3.可能对DroppedDown赋值的影响,光标被覆盖在界面下面了。需要增加一句Cursor = Cursors.Default;保持鼠标指针的形状。
TextUpdate的方法,实现了ComboBox模糊查找,自动匹配的效果。
文中的错漏,请回复纠正。
转载请注明出处: