擴展:
AutoCompleteMode允許四個值:
None:默認值,表示ComboBox不使用自動功能。
建議:在組合框中輸入字符後,組合框會自動展開並顯示匹配的子項。輸入線路不會受到影響。您需要自己輸入後續字符,或者單擊下拉框中的完整子項。
Append:輸入壹個字符後,匹配的內容會自動添加到該字符後(以反色顯示),但ComboBox不會展開。按向上和向下鍵在多個匹配項之間切換。
SuggestAppend:以上兩種模式的結合。
AutoCompleteSource屬性有9種,* * *,表示要搜索的數據源會自動補全。常用的有以下幾種:
ListItems:數據源為ComboBox的項目集合。
文件系統:文件系統。例如,輸入c:\將展開c:\下的目錄列表(或在追加模式下自動添加)。同樣,這個數據源也支持文件名的補全。
CustomSource:自定義數據源。選擇此方法時,必須將ComboBox的AutoCompleteCustomSource屬性指定為您構建的AutoCompleteStringCollection對象,否則不會生效。AutoCompleteStringCollection類似於list
【優質編程】團隊成員將為您答疑解惑,請給我們您寶貴的意見和建議。謝謝妳
QQ:176229432
補充回答:
首先我需要強調壹下,搜索的時候用拼音首字母可能更合適。
下面是我項目中壹個控件庫中的擴展組件的完整代碼,編譯成壹個組件,扔到其他ui中。所有的ComboBox和ListBox都會添加擴展屬性SearchOnKeyEnable,設置為true後可以自己看看效果。增加了關鍵音程判斷。如果兩個鍵之間的時間間隔短,則認為是壹個單詞的幾個單詞的首字母,如果時間間隔長,則認為是其他單詞的首字母。
另外需要註意的是,使用時請關閉AutoComplete相關屬性,設置DropDownStyle=DropDownList,效果最佳。
此代碼段僅供學習參考。希望妳能自己寫出更完美的代碼,而不是直接抄襲。
使用系統;
使用系統。組件模型;
使用系統。集合。泛型;
使用系統。診斷;
使用系統。文本;
使用系統。Windows . Forms
使用系統。數據;
命名空間!#您的命名空間#!
{
///& lt;總結& gt
/// ListControl擴展組件,使ListControl控件在按鍵後自動搜索並定位與所按按鍵匹配的項目。
///如果按“S”後能自動定位“深圳”
///& lt;/summary & gt;
[provide property(" SearchOnKeyPressedEnabled ",typeof(ListControl))]
公共分部類ListControlExtender : Component,IExtenderProvider
{
#區域私有字段
私人字典& ltListControl,屬性& gtproperties =新詞典& ltListControl,屬性& gt(7);
private StringBuilder sb keys = new StringBuilder(10);
private StringBuilder sb item = new StringBuilder(50);
private int twicePressKeyInterval = 500;//兩次擊鍵之間的時間間隔(單位:毫秒)
私有類屬性
{
public StringBuilder pressed keys;//鍵
公共日期時間PrevPressKeyTime//上次擊鍵時間
public bool SearchOnKeyPressedEnabled;//是否激活了鍵搜索?
公共屬性()
{
這個。pressed keys = new StringBuilder(10);
這個。PrevPressKeyTime = DateTime。現在;
這個。SearchOnKeyPressedEnabled = false;
}
}
#結束區域
#區域構造函數
公共ListControlExtender()
{
initialize component();
}
公共ListControlExtender(IContainer容器)
{
集裝箱。補充(這個);
initialize component();
}
#結束區域
#區域接口方法IExtenderProvider。CanExtend
bool IExtenderProvider。CanExtend(對象o)
{
if (o是ListControl)
{
返回true
}
返回false
}
#結束區域
#區域屬性定義
[類別(“設置”)]
[描述("兩次擊鍵之間的時間間隔(毫秒)")]
public int TwicePressKeyInterval
{
得到
{
返回this.twicePressKeyInterval
}
設置
{
this . twicepresskeyinterval = value & gt;0 ?值:0;
}
}
#結束區域
#區域私有函數
///& lt;總結& gt
///確保擴展屬性的菜單項在字典中。
///& lt;/summary & gt;
///& lt;param name = " key " & gt目標菜單項
///& lt;returns & gt擴展屬性
私有屬性確保屬性存在(ListControl鍵)
{
屬性p;
如果(屬性。ContainsKey(key))
{
p = properties[key];
}
其他
{
p =新屬性();
屬性。Add(鍵,p);
}
返回p;
}
///& lt;總結& gt
///獲取漢字的拼音首字母。
///& lt;/summary & gt;
///& lt;param name = " c " & gt漢字
///& lt;returns & gt拼音首字母
私有字符串GetFristPYLetterOfChar(字符串c)
{
嘗試
{
byte[] array =新字節[2];
數組=系統。text . encoding . default . getbytes(c);
int I =(short)(array[0]-' \ 0 ')* 256+((short)(array[1]-' \ 0 ');
//if(I & lt;0xB0A1)返回“*”;
如果(我& lt0xB0C5)返回“a”;
如果(我& lt0xB2C1)返回“b”;
如果(我& lt0xB4EE)返回“c”;
如果(我& lt0xB6EA)返回“d”;
如果(我& lt0xB7A2)返回“e”;
如果(我& lt0xB8C1)返回“f”;
如果(我& lt0xB9FE)返回“g”;
如果(我& lt0xBBF7)返回“h”;
如果(我& lt0xBFA6)返回“j”;
如果(我& lt0xC0AC)返回“k”;
如果(我& lt0xC2E8)返回“l”;
如果(我& lt0xC4C3)返回“m”;
如果(我& lt0xC5B6)返回“n”;
如果(我& lt0xC5BE)返回“o”;
如果(我& lt0xC6DA)返回“p”;
如果(我& lt0xC8BB)返回“q”;
如果(我& lt0cx8f 6)返回“r”;
如果(我& lt0xCBFA)返回“s”;
如果(我& lt0xCDDA)返回“t”;
如果(我& lt0xCEF4)返回“w”;
如果(我& lt0xD1B9)返回“x”;
如果(我& lt0xD4D1)返回“y”;
//if(I & lt;0xD7FA)返回“z”;
返回“z”;
}
捕捉
{
返回“*”;
}
}
///& lt;總結& gt
///獲取中文字符串的拼音首字母
///& lt;/summary & gt;
///& lt;param name = " str " & gt中文字符串
///& lt;returns & gt拼音首字母
私有字符串GetFirstPYLetterOfString(string str)
{
StringBuilder sb = new StringBuilder(100);
foreach(字符串中的字符c)
{
//字母和符號保持原樣。
if((int)c & gt;= 33 & amp& amp(int)c & lt;= 126)
某人(somebody的簡寫)append(c . ToString());
其他
某人(somebody的簡寫)append(GetFristPYLetterOfChar(c . ToString()));
}
歸還某人。ToString();
}
///& lt;總結& gt
///將列表控件集合項轉換為字符串。
///& lt;/summary & gt;
///& lt;param name = " listControl " & gt列表控件
///& lt;param name = " index " & gt收藏索引
///& lt;returns & gt轉換後的字符串
私有字符串ConvertListControlItemToString(list control list control,int index)
{
if (listControl是ComboBox)
{
//如果沒有綁定,就直接轉換成字符串。
if (listControl。數據源== null)
return(string)(((ComboBox)list control)。items[index]);
其他
{
//如果綁定了,就轉換成DataRowView,然後取對應的字段值。
datarow view view =(datarow view)(((ComboBox)list control)。items[index]);
if (((ComboBox)listControl)。顯示成員!=空)
返回轉換。ToString(view[((ComboBox)list control))。display member]);
else if (((ComboBox)listControl)。ValueMember!=空)
返回轉換。ToString(view[((ComboBox)list control))。value member]);
其他
返回“”;
}
}
else if (listControl是ListBox)
{
//如果沒有綁定,就直接轉換成字符串。
if (listControl。數據源== null)
return(string)(((ListBox)list control)。items[index]);
其他
{
//如果綁定了,就轉換成DataRowView,然後取對應的字段值。
datarow view view =(datarow view)(((ListBox)list control)。items[index]);
if((ListBox)list control)。顯示成員!=空)
返回轉換。ToString(視圖[((ListBox)listControl))。display member]);
else if((ListBox)list control)。ValueMember!=空)
返回轉換。ToString(視圖[((ListBox)listControl))。value member]);
其他
返回“”;
}
}
其他
{
返回“”;
}
}
///& lt;總結& gt
///列表控件的按鍵事件處理程序
///& lt;/summary & gt;
///& lt;param name = " sender " & gt列表控件
///& lt;param name = " e " & gt參數
private void list control _ KeyPress(對象發送方,KeyPressEventArgs e)
{
list control list control =(list control)sender;
//清除密鑰字符串
sbKeys。移除(0,sbKeys。長度);
//獲取當前時間
現在日期時間=日期時間。現在;
//獲取上次按鍵的時間差。
TimeSpan span = now-properties[list control]。PrevPressKeyTime
//如果兩次擊鍵的時間差小於TwicePressKeyInterval,則認為按了多個鍵。
如果(span。total毫秒& lttwicePressKeyInterval)
{
properties[list control]. pressed keys . append(e . key char . tostring());
sbKeys。append(properties[list control]. pressed keys . tostring());
}
否則//否則,按壹個鍵。
{
sbKeys。append(e . key char . tostring());
properties[list control]. pressed keys . remove(0,properties[list control]. pressed keys . length);
properties[list control]. pressed keys . append(sb keys。ToString());
}
//更新按鍵時間
屬性[listControl]。PrevPressKeyTime = now
//記錄初始索引值
int oldIndex = listControl。SelectedIndex
int newIndex = oldIndex
//獲取列表項的數量
int item count = 0;
if (listControl是ComboBox)
item count =((ComboBox)list control). items . count;
其他
item count =((ListBox)list control). items . count;
//首先從當前位置向後搜索。
bool match = false
for(int I = ol index+1;我& ltitemCounti++)
{
//空的
sbItem。移除(0,sbItem。長度);
//獲取列表項字符串
//改為調用將列表控件集合項轉換為字符串的方法。2007-08-13
sbItem。append(ConvertListControlItemToString(list control,I));
//比較鍵是否與列表項的第壹個字母匹配。
如果(sbKeys。長度& ltsbItem。長度)
match = GetFirstPYLetterOfString(sb item。ToString())。IndexOf(sbKeys。ToString())= = 0;
其他
match = sbKeys。ToString()。index of(GetFirstPYLetterOfString(sbItem。ToString()))= = 0;
如果(匹配)
{
new index = I;
打破;
}
}
if((new index = = old index)& amp;& amp(oldIndex & gt0)) //如果沒有找到,則從0開始搜索。
{
for(int I = 0;我& lt= oldIndexi++)
{
//空的
sbItem。移除(0,sbItem。長度);
//獲取列表項字符串
//改為調用將列表控件集合項轉換為字符串的方法。2007-08-13
sbItem。append(ConvertListControlItemToString(list control,I));
//比較鍵是否與列表項的第壹個字母匹配。
如果(sbKeys。長度& ltsbItem。長度)
match = GetFirstPYLetterOfString(sb item。ToString())。IndexOf(sbKeys。ToString())= = 0;
其他
match = sbKeys。ToString()。index of(GetFirstPYLetterOfString(sbItem。ToString()))= = 0;
如果(匹配)
{
new index = I;
打破;
}
}
}
listControl。SelectedIndex = newIndex
}
#結束區域
#region在按鍵時激活搜索功能。
[描述(“按鍵時是否要激活搜索功能”)]
[類別(“擴展”)]
public bool GetSearchOnKeyPressedEnabled(list control list control)
{
properties p = EnsurePropertiesExists(list control);
返回p . SearchOnKeyPressedEnabled
}
public void SetSearchOnKeyPressedEnabled(list control list control,bool值)
{
properties p = EnsurePropertiesExists(list control);
頁(page的縮寫)SearchOnKeyPressedEnabled = value;
如果(值)
listControl。KeyPress+= new KeyPress eventhandler(list control _ KeyPress);
其他
listControl。KeyPress-= new KeyPress eventhandler(list control _ KeyPress);
}
#結束區域
}
}
最後,我還想指出,自動完成和初始查詢定位不能混用。
假設combobox的子項為,當按下S鍵時,只能展開combobox,然後定位到“陜西”,不可能也不應該同時改變combobox的顯示字符串。輸入的s可以刪除,但是我不能決定是應該加上‘山’還是‘山’這個字。不能確定首字,所以不能用自動加/補。
所以這裏我只能建議妳用經典的方式,也就是上面代碼實現的功能:dropdownlist,點擊展開列表,按鍵定位合適的行;或者在有焦點的時候直接輸入拼音首字母,直接填充,不需要展開列表。
有問題請留言!