C#实现带搜索功能的ComboBox
来源:本站原创|时间:2020-01-10|栏目:C#教程|点击: 次
带搜索的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(); //遍历循环操作 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> /// 文本改变,动态控制下拉条数据源 /// </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"/>
效果演示
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
您可能感兴趣的文章
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新闻效果的方法
- 01-10C#实现清空回收站的方法
- 01-10C#实现读取注册表监控当前操作系统已安装软件变化的方法
- 01-10C#实现多线程下载文件的方法
- 01-10C#实现Winform中打开网页页面的方法
- 01-10C#实现远程关闭计算机或重启计算机的方法
- 01-10C#自定义签名章实现方法
- 01-10C#文件断点续传实现方法
- 01-10winform实现创建最前端窗体的方法
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 01-10C#中split用法实例总结
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10SublimeText编译C开发环境设置
- 04-02jquery与jsp,用jquery
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05织梦dedecms什么时候用栏目交叉功能?