Combobox控件在開發(fā)中作為下拉選項的不二之選,用的非常頻繁,前幾日開發(fā)過程中剛好有個需求有用到這個控件,而且客戶要求增加下拉選擇功能,這個簡單,設(shè)置控件的自動完成屬性后就解決了
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名與空間、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、下花園網(wǎng)站維護、網(wǎng)站推廣。this.comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;//設(shè)置自動完成的源 this.comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;//設(shè)置自動完成的的形式
發(fā)現(xiàn)場讓客戶使用,客戶表示功能實現(xiàn)和他需求不一致,后來解釋是想通過下拉選項的拼音碼進行檢索,查遍的很多資料,也走了很多彎路,最后終于實現(xiàn),將正確的實現(xiàn)方法記錄在此
首先根據(jù)Combobox控件拼音碼檢索搜索到了這篇文章(http://www.cnblogs.com/eshizhan/archive/2012/08/13/2637207.html),集成到項目中進行測試時發(fā)現(xiàn),輸入檢索的內(nèi)容后,敲擊回車鍵,輸入的內(nèi)容沒有全部顯示到文本框中,輸入三個字母時,只顯示一個或者兩個,再次檢索時候恢復(fù)正常
如果檢索時,把鼠標指針從控件上移動到別的控件上,輸入檢索內(nèi)容敲擊回車鍵后,會出現(xiàn)丟失鼠標指針的情況,這時只有把鼠標往下移動到任務(wù)欄指針才會出現(xiàn)
以上問題測試均使用搜狗輸入法中文狀態(tài)
網(wǎng)上并沒有找到針對這兩個問題的解決方案,繼續(xù)搜索拼音碼檢索,查找不同的方案,經(jīng)過對多個方案的反復(fù)測試,終于發(fā)現(xiàn)了一個可用的方案,重寫了ComboBox控件,以下為示例代碼
public class ComboBoxEx : System.Windows.Forms.ComboBox { public ComboBoxEx() { this.FormattingEnabled = true; } List_ChineseCharacterList; private string[] _TextList; public string[] TextList { get { return _TextList; } set { _TextList = value; _ChineseCharacterList = GetChineseCharacterList(value); } } /// /// 把中文字符集合轉(zhuǎn)為中文字符對象集合 /// private ListGetChineseCharacterList(string[] chnTextList) { List lst = new List (); foreach (string s in chnTextList) { ChineseCharacter cc = new ChineseCharacter(s); lst.Add(cc); } return lst; } protected override void OnTextUpdate(EventArgs e) { if (_ChineseCharacterList != null && _ChineseCharacterList.Count > 0) { //var input = this.Text.Trim().ToUpper(); string input = this.Text.Trim().ToUpper(); this.Items.Clear(); if (string.IsNullOrEmpty(input)) { this.Items.AddRange(_ChineseCharacterList.ToArray()); } else { var newList = _ChineseCharacterList.FindAll(c => c.FirstPinYin.Contains(input) || c.ChineseText.Contains(input)); if (newList.Count == 0) { newList.Add(new ChineseCharacter("未找到")); } this.Items.AddRange(newList.ToArray()); } this.DisplayMember = "ChineseText"; this.ValueMember = "FirstPinYin"; this.Select(this.Text.Length, 0); this.DroppedDown = true; //保持鼠標指針形狀 Cursor = Cursors.Default; } base.OnTextUpdate(e); } protected override void OnEnter(EventArgs e) { this.Items.AddRange(_ChineseCharacterList.ToArray()); this.DisplayMember = "ChineseText"; this.ValueMember = "FirstPinYin"; base.OnEnter(e); } protected override void OnLeave(EventArgs e) { this.Items.Clear(); base.OnLeave(e); } } /// /// 中文字符 /// public class ChineseCharacter { public ChineseCharacter(string chnText) { ChineseText = chnText; FirstPinYin =JHNISCommonLib.JHNISCommonManage.GetInstance().JianPin(chnText); } public string ChineseText { get; set; } public string FirstPinYin { get; set; } }
第二種方案,使用搜索輸入法輸入漢字,敲擊回車鍵后,輸入的內(nèi)容沒有全部顯示到Combobox控件上,如下圖所示(輸入“瀏覽器”,只顯示了“覽器”):
經(jīng)測試當把下拉列表顯示出來再進行檢索時,內(nèi)容顯示正常,可通過以下代碼進行設(shè)置
protected override void OnGotFocus(EventArgs e) { this.DroppedDown = true; base.OnGotFocus(e); } protected override void OnLostFocus(EventArgs e) { this.DroppedDown = false; base.OnLostFocus(e); }
第二種方案原文地址:http://download.csdn.net/detail/xbl002/9408842#comment
附件:http://down.51cto.com/data/2368281創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。