C#實現(xiàn)帶搜索功能的ComboBox
更新時間:2016年10月26日 14:02:35 作者:眾尋
這篇文章主要為大家詳細介紹了C#如何實現(xiàn)帶搜索功能的ComboBox,具有一定的參考價值,感興趣的小伙伴們可以參考一下
帶搜索的ComboBox就是給ComboBox一個依賴屬性的ItemSource,然后通過數據源中是否包含要查詢的值,重新給ComboBox綁定數據源。
public class EditComboBox : ComboBox
{
private bool t = true;//首次獲取焦點標志位
private ObservableCollection<object> bindingList = new ObservableCollection<object>();//數據源綁定List
private string editText = "";//編輯文本內容
/// <summary>
/// 注冊依賴事件
/// </summary>
public static readonly DependencyProperty ItemsSourcePropertyNew = DependencyProperty.Register("MyItemsSource", typeof(IEnumerable), typeof(EditComboBox), new FrameworkPropertyMetadata(new PropertyChangedCallback(ValueChanged)));
/// <summary>
/// 數據源改變,添加數據源到綁定數據源
/// </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>
/// 設置或獲取ComboBox的數據源
/// </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)控制下拉條數據源
/// </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>
/// 組合框關閉,數據源恢復
/// </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>
/// 過濾符合條件的數據項,添加到數據源項中
/// </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());
}
}
}
調用方法就是將數據源綁定到MyItemsSource上,剩下的就和原有的ComboBox用法一樣了。
復制代碼 代碼如下:
<local:EditComboBox MyItemsSource="{Binding ProList,Mode=TwoWay}" SelectedItem="{Binding Selpro,Mode=TwoWay}" SelectedValuePath="Id" DisplayMemberPath="Name"/>
效果演示

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- C# ComboBox控件“設置 DataSource 屬性后無法修改項集合”的完美解決方法
- C# 重寫ComboBox實現(xiàn)下拉任意組件的方法
- C# ComboBox的聯(lián)動操作(三層架構)
- C#實現(xiàn)ComboBox控件顯示出多個數據源屬性的方法
- C#實現(xiàn)綁定Combobox的方法
- C#用ComboBox控件實現(xiàn)省與市的聯(lián)動效果的方法
- C#(WinForm) ComboBox和ListBox添加項及設置默認選擇項
- C# listview添加combobox到單元格的實現(xiàn)代碼
- c#構造ColorComboBox(顏色下拉框)
- C#實現(xiàn)ComboBox自動匹配字符
- C#中comboBox實現(xiàn)三級聯(lián)動
相關文章
如何使用LinQ To Object把數組或DataTable中的數據進行向上匯總
這篇文章主要介紹了如何使用LinQ To Object把數組或DataTable中的數據進行向上匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12

