C#实现带搜索功能的ComboBox_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"/>

效果演示

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
, 搜索
combobox
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2025-01-31 05:47:04

C#实现带搜索功能的ComboBox_C#教程的相关文章

yii2带搜索功能的下拉框实例详解_php实例

简单的小功能,但是用起来还是蛮爽的.分享出来让更多的人有更快的开发效率,开开心心快乐编程. 如果你还没有使用过composer,你可就out了,看我的教程分享,composer简直就是必备神奇有木有.都说到这个点上了,我们赶紧使用composer进行安装吧. 先给大家展示下效果图: 下面给大家说下具体实现思路: composer require kartik-v/yii2-widget-select2 "@dev" #特别说明,因为这里安装的dev版本,也就是开发版本,不稳定版本,如果

Win8系统自带搜索功能如何关闭以便使用第三方服务

  有些系统功能虽然方便用户使用,但体验并不如第三方服务.就如Win8的搜索功能,就让不少用户嫌弃.如果大家不想用它,可以将它关闭. 操作方法 第一步.按下Win+R组合键,在运行命令输入框中输入"services.msc" 后回车. 第二步.在出现的服务界面,在右侧窗口找到并双击"Windows Search". 第三步.在Windows Search的属性(本地计算机)对话框,常规选项下点击"停止"按钮. 温馨提示 :需要开启时,同样界面点击

yii2组件之下拉框带搜索功能的示例代码(yii-select2)

简单的小功能,但是用起来还是蛮爽的.分享出来让更多的人有更快的开发效率,开开心心快乐编程. 如果你还没有使用过composer,你可就out了,看我的教程分享,composer简直就是必备神奇有木有.都说到这个点上了,我们赶紧使用composer进行安装吧. 不急,先来看看效果图是啥样的,不然都没心情没欲望看下去. 啥玩意,不感兴趣?继续看嘛,看完再操作一边才能觉得好在哪里. 有木有感觉很帅气,当然啦,远远不止,还很上档次用起来效果也是杠杠的有木有. 好了好了,抓紧时间安装,不然聊起来真是没完没

如何利用outlook自带搜索功能精确搜索

outlook中自带搜索缺省似乎是全文搜索,所以会找出一堆不相关的东西,而且有数量的设置,感觉非常不好用,其实主个搜索还是能自定义作设置的,能提高可用性. 首先要把搜索工具在菜单中作显示,选择<文件>-<选项>,在选项菜单中选择<自定义功能区> 找到右上角的<自定义功能区B>选项,该选项为下拉菜单,下拉选择<工具卡选项>.确保搜索工具的勾选框被选中 现在就有搜索工具这一项菜单栏了,精细的搜索要用这里,而不要用邮件上方那个搜索功能 搜索工具的第一项

Win8的搜索功能的使用教程

搜索是我们在使用操作系统时怎么都绕不开的一环,而在Win8中搜索也变得格外强大,原因就是Win8中的搜索已经升级到了"全局搜索".今天我们就将介绍如何使用Win8的搜索功能. Win8中的搜索按键随着开始菜单的取消而消失了,现在我们需要将鼠标滑动到屏幕右下角然后上提,然后在Charm Bar上找到搜索按键.当然使用"Windows键+X"的组合键也能找到搜索,在打开的功能菜单上就可以找到. 搜索键位于Charm Bar中 功能菜单中也可以进行搜索 下面就来说说本期的

js实现带搜索功能的下拉框实时搜索实时匹配_javascript技巧

1. 当select输入框中每输入一点内容的时候,在option中找出与内容匹配的选项显示在option的前面选项中. 2. 如何获取每次输入的内容,当keyup的时候触发函数. 问题:select标签中可以输入内容吗?(解决:另一篇文章可选择和输入的下拉列表框 ) 3. 如何获得输入框中的内容?(解决,在输入框上添加onkeyup时间触发的函数用js获得) 4. 如何匹配?(解决) 4.1 如何获得所有option中的内容?(解决) 复制代码 代码如下: function getSelectT

三星S6 edge+如何在我的文件中使用搜索功能?(G9280)

1.在标准模式下,向左滑动主屏幕页面.    2.点击[实用工具].    3.选择[我的文件].    4.点击[搜索].    5.在搜索框中输入您需要查找的关键字,如“scr”.    6.所有含“scr”的文件名已出现在下方的列表中,选择您需要的文件即可.    以上就是关于三星S6 edge+如何在我的文件中使用搜索功能?(G9280)的教程了,希望对各位有帮助.

源代码- java web 项目中,如何实现显示的页面带关键字搜索功能

问题描述 java web 项目中,如何实现显示的页面带关键字搜索功能 我有一个关键字表 表结构如下 Id ID 关键字 Keywords 链接 Link 优先级 priority 0 默认 1初级 2中级 3高级 匹配次数 mateCount 0全文匹配 1只为第一个出现的关键字匹配 里面的数据格式为 ID Keywords Link priority mateCount 1 龙投网 http://www.lootou.cn 3 0 2 股票入门 http://www.lootou.cn/gu

全能快速高效率 玩转Win7自带超强搜索功能

电脑的硬盘越来越大,文件越来越多,想要在浩如烟海的硬盘数据中快速找出需要的程序或文件,自然会用到搜索.如果我们用的是http://www.aliyun.com/zixun/aggregation/15480.html">Win7系统,那可就轻松啦!Win7系统自带的搜索功能无论在操作便捷还是速度方面表现都相当迅猛,可以方便快速地找到指定程序和文件. Win7系统的搜索功能主要集中在两个地方--开始菜单和资源管理器,这两个地方的搜索功能有一些细微的区别. Win7开始菜单中的搜索框是多功能搜