C#實現(xiàn)帶搜索功能的ComboBox
帶搜索的ComboBox就是給ComboBox一個依賴屬性的ItemSource,然后通過數(shù)據(jù)源中是否包含要查詢的值,重新給ComboBox綁定數(shù)據(jù)源。
public class EditComboBox : ComboBox { private bool t = true;//首次獲取焦點標(biāo)志位 private ObservableCollection<object> bindingList = new ObservableCollection<object>();//數(shù)據(jù)源綁定List private string editText = "";//編輯文本內(nèi)容 /// <summary> /// 注冊依賴事件 /// </summary> public static readonly DependencyProperty ItemsSourcePropertyNew = DependencyProperty.Register("MyItemsSource", typeof(IEnumerable), typeof(EditComboBox), new FrameworkPropertyMetadata(new PropertyChangedCallback(ValueChanged))); /// <summary> /// 數(shù)據(jù)源改變,添加數(shù)據(jù)源到綁定數(shù)據(jù)源 /// </summary> /// <param name="d"></param> /// <param name="e"></param> private static void ValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { EditComboBox ecb = d as EditComboBox; ecb.bindingList.Clear(); //遍歷循環(huán)操作 foreach (var item in ecb.MyItemsSource) { ecb.bindingList.Add(item); } } /// <summary> /// 設(shè)置或獲取ComboBox的數(shù)據(jù)源 /// </summary> public IEnumerable MyItemsSource { get { return (IEnumerable)GetValue(ItemsSourcePropertyNew); } set { if (value == null) ClearValue(ItemsSourcePropertyNew); else SetValue(ItemsSourcePropertyNew, value); } } /// <summary> /// 重寫初始化 /// </summary> /// <param name="e"></param> protected override void OnInitialized(EventArgs e) { base.OnInitialized(e); this.IsEditable = true; this.IsTextSearchEnabled = false; this.ItemsSource = bindingList; } /// <summary> /// 下拉框獲取焦點,首次搜索文本編輯框 /// </summary> /// <param name="e"></param> protected override void OnGotFocus(RoutedEventArgs e) { if (t) FindTextBox(this); else t = false; } /// <summary> /// 搜索編輯文本框,添加文本改變事件 /// </summary> /// <param name="obj"></param> private void FindTextBox(DependencyObject obj) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child!=null && child is TextBox) { //注冊文本改變事件 (child as TextBox).TextChanged += EditComboBox_TextChanged; } else { FindTextBox(child); } } } /// <summary> /// 文本改變,動態(tài)控制下拉條數(shù)據(jù)源 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void EditComboBox_TextChanged(object sender, TextChangedEventArgs e) { TextBox tb = sender as TextBox; if(tb.IsFocused) { this.IsDropDownOpen = true; if (editText == this.Text) return; editText = this.Text; SetList(editText); } } /// <summary> /// 組合框關(guān)閉,數(shù)據(jù)源恢復(fù) /// </summary> /// <param name="e"></param> protected override void OnDropDownClosed(EventArgs e) { base.OnDropDownClosed(e); if (MyItemsSource == null) return; foreach (var item in MyItemsSource) { if (!bindingList.Contains(item)) bindingList.Add(item); } } /// <summary> /// 過濾符合條件的數(shù)據(jù)項,添加到數(shù)據(jù)源項中 /// </summary> /// <param name="txt"></param> private void SetList(string txt) { try { string temp1 = ""; string temp2 = ""; if (MyItemsSource == null) return; foreach (var item in MyItemsSource) { temp1 = item.GetType().GetProperty(this.DisplayMemberPath).GetValue(item, null).ToString(); if (string.IsNullOrEmpty(this.SelectedValuePath)) { temp2 = ""; } else { temp2 = item.GetType().GetProperty(this.SelectedValuePath).GetValue(item, null).ToString(); } if(temp1.Contains(txt)||temp2.StartsWith(txt)) { if (!bindingList.Contains(item)) bindingList.Add(item); } else if (bindingList.Contains(item)) { bindingList.Remove(item); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } }
調(diào)用方法就是將數(shù)據(jù)源綁定到MyItemsSource上,剩下的就和原有的ComboBox用法一樣了。
效果演示
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C# ComboBox控件“設(shè)置 DataSource 屬性后無法修改項集合”的完美解決方法
- C# 重寫ComboBox實現(xiàn)下拉任意組件的方法
- C# ComboBox的聯(lián)動操作(三層架構(gòu))
- C#實現(xiàn)ComboBox控件顯示出多個數(shù)據(jù)源屬性的方法
- C#實現(xiàn)綁定Combobox的方法
- C#用ComboBox控件實現(xiàn)省與市的聯(lián)動效果的方法
- C#(WinForm) ComboBox和ListBox添加項及設(shè)置默認(rèn)選擇項
- C# listview添加combobox到單元格的實現(xiàn)代碼
- c#構(gòu)造ColorComboBox(顏色下拉框)
- C#實現(xiàn)ComboBox自動匹配字符
- C#中comboBox實現(xiàn)三級聯(lián)動
相關(guān)文章
C# 命名空間(Namespace)相關(guān)知識總結(jié)
這篇文章主要介紹了C# 命名空間(Namespace)的相關(guān)知識,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下2020-06-06使用位運算實現(xiàn)網(wǎng)頁中的過濾、篩選功能實例
這篇文章主要介紹了使用位運算實現(xiàn)網(wǎng)頁中的過濾、篩選功能實例,一個比常規(guī)拼接SQL字符串更有新意的一個解決思路,需要的朋友可以參考下2014-07-07c#實現(xiàn)16進(jìn)制和字符串之間轉(zhuǎn)換的代碼
#中十六進(jìn)制字符串的轉(zhuǎn)換函數(shù)2007-05-05