C#WinformComboBox在输入内容时会在下拉菜单中显示根据输入内容查询的结果Word文档下载推荐.docx
《C#WinformComboBox在输入内容时会在下拉菜单中显示根据输入内容查询的结果Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C#WinformComboBox在输入内容时会在下拉菜单中显示根据输入内容查询的结果Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
![C#WinformComboBox在输入内容时会在下拉菜单中显示根据输入内容查询的结果Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/9/6ed0bf9f-6998-4550-9ac2-9c7c4e1abce9/6ed0bf9f-6998-4550-9ac2-9c7c4e1abce91.gif)
例如输入后会展开下的目录列表(或append模式下的自动添加)。
同样的,此数据源也支持文件名的补全。
CustomSource:
自定义数据源。
选用此方式时必须在代码中指定ComboBox的AutoCompleteCustomSource属性为你构建的AutoCompleteStringCollection对象,否则不会生效。
AutoCompleteStringCollection类似于List,将你的数据add进去即可。
[高质量编程]团队成员为您解答,请提出宝贵意见和建议。
谢谢!
QQ:
176229432
补充回答:
首先我需要强调一点,使用拼音首字母检索时可能比较适合DropDownStyle=DropDownList时。
以下是我项目中一个控件库中的扩展组件完整代码,编译成组件丢到其他UI中,所有ComboBox和ListBox均会添加扩展属性SearchOnKeyEnable,置为true后自己看效果。
加入了按键间隔判断,两次按键时间间隔短则认为是一个词的数个字的首字母,间隔时间长认为是其他词的首字。
另外要注意,使用时请关闭AutoComplete相关属性,同时置
DropDownStyle=DropDownList效果最好。
此代码段仅供学习参考,望各位能自己写出更完善的代码而非直接拷贝使用。
usingSystem;
usingSystem.ComponentModel;
usingSystem.Collections.Generic;
usingSystem.Diagnostics;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Data;
namespace!
#你的命名空间#!
{
///
///ListControl扩展组件,使ListControl控件在按下键后能够自动搜索并定位到与按下键相匹配的项
Ill如在按下“S”后能自动定位到“深圳”
[ProvideProperty("
SearchOnKeyPressedEnabled"
typeof(ListControl))]
publicpartialclassListControlExtender:
Component,IExtenderProvider
#region私有字段
privateDictionaryproperties=newDictionary(7);
privateStringBuildersbKeys=newStringBuilder(10);
privateStringBuildersbItem=newStringBuilder(50);
privateinttwicePressKeyInterval=500;
ll两次按键时间间隔
(单位:
毫秒)
privateclassProperties
publicStringBuilderPressedKeys;
//按键
publicDateTimePrevPressKeyTime;
//上次按键时间
publicboolSearchOnKeyPressedEnabled;
//按键搜索是否激活publicProperties()
{this.PressedKeys=newStringBuilder(10);
this.PrevPressKeyTime=DateTime.Now;
this.SearchOnKeyPressedEnabled=false;
}
#endregion
#region构造函数publicListControlExtender()
InitializeComponent();
publicListControlExtender(IContainercontainer)
{container.Add(this);
#region接口方法IExtenderProvider.CanExtendboolIExtenderProvider.CanExtend(objecto)
if(oisListControl)
returntrue;
returnfalse;
#region属性定义
[Category("
设置"
)]
[Description("
两次按键时间间隔(单位:
毫秒)"
)]publicintTwicePressKeyInterval
get
returnthis.twicePressKeyInterval;
set
{this.twicePressKeyInterval=value>
0?
value:
0;
#region私有函数
///确保扩展属性的菜单项在字典中
///目标菜单项
///扩展属性
privatePropertiesEnsurePropertiesExists(ListControlkey){
Propertiesp;
if(properties.ContainsKey(key)){
p=properties[key];
}else
{p=newProperties();
properties.Add(key,p);
returnp;
///取得汉字字符的拼音首字母
///汉字字符
///拼音首字母
privatestringGetFristPYLetterOfChar(stringc)
try
byte[]array=newbyte[2];
array=System.Text.Encoding.Default.GetBytes(c);
inti=(short)(array[0]-'
\0'
)*256+((short)(array[1]-'
));
//if(i<
0xB0A1)return"
*"
;
if(i<
0xB0C5)return"
a"
0xB2C1)return"
b"
0xB4EE)return"
c"
0xB6EA)return"
d"
0xB7A2)return"
e"
0xB8C1)return"
f"
if(i<
0xB9FE)return"
g"
0xBBF7)return"
h"
0xBFA6)return"
j"
0xC0AC)return"
k"
0xC2E8)return"
l"
0xC4C3)return"
m"
0xC5B6)return"
n"
0xC5BE)return"
o"
0xC6DA)return"
p"
0xC8BB)return"
q"
0xC8F6)return"
r"
0xCBFA)return"
s"
0xCDDA)return"
t"
0xCEF4)return"
w"
0xD1B9)return"
x"
0xD4D1)return"
y"
//if(i<
0xD7FA)return"
z"
return"
catch
return"
///取得汉字字符串的拼音首字母
///汉字字符串
privatestringGetFirstPYLetterOfString(stringstr){
StringBuildersb=newStringBuilder(100);
foreach(charcinstr)
//字母和符号原样保留
if((int)c>
=33&
&
(int)c<
=126)sb.Append(c.ToString());
else
sb.Append(GetFristPYLetterOfChar(c.ToString()));
}
returnsb.ToString();
///将列表控件集合项转换为字符串
///列表控件
///集合索引
///转换后的字符串
privatestringConvertListControlItemToString(ListControllistControl,intindex)
if(listControlisComboBox)
//如果未绑定则直接转换为字符串
if(listControl.DataSource==null)
return(string)(((ComboBox)listControl).Items[index]);
//如果绑定则转换为DataRowView后再取相应字段值
DataRowViewview=
(DataRowView)(((ComboBox)listControl).Items[index]);
if(((ComboBox)listControl).DisplayMember!
=null)return
Convert.ToString(view[((ComboBox)listControl).DisplayMember]);
elseif(((ComboBox)listControl).ValueMember!
Convert.ToString(view[((ComboBox