当前位置: 首页 > 编程笔记 >

C#实现带搜索功能的ComboBox

诸经略
2023-03-14
本文向大家介绍C#实现带搜索功能的ComboBox,包括了C#实现带搜索功能的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();
      //遍历循环操作
      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"/>

效果演示

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

 类似资料:
  • 我正在尝试在ReactJS中实现搜索功能。我不知道该怎么做。下面我给出了我尝试过的代码。 我需要在serach之后在表中显示结果。 //下面是我的功能 //下面是我的api响应

  • 我正在尝试实现一个二叉查找树,但是“搜索”函数对于除了根之外的每个条目都返回了错误的值。 该函数应返回其值与键参数匹配的节点的地址,如果节点不存在,则返回 NULL。 当我运行代码时,我得到以下内容: 我知道每个节点的“左”和“右”指针链接正确,因为“delAll”函数成功删除了所有节点。 将“cout”语句添加到“search”函数表明该函数似乎返回了正确的地址。为什么从主主调用时会打印错误的地

  • 本文向大家介绍javascript实现简单搜索功能,包括了javascript实现简单搜索功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了javascript实现简单搜索功能的具体代码,供大家参考,具体内容如下 注意事项: A.search(B)可以在A中搜索B的位置,返回B出现的位置 A.split(B)将A以B划分为几部分,并返回数组,相当于分词操作 运行结果如下: 更多搜索

  • 本文向大家介绍Android实现搜索历史功能,包括了Android实现搜索历史功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现搜索历史的具体代码,供大家参考,具体内容如下 SharedPreferences实现本地搜索历史功能,覆盖搜索重复的文本,可清空  1. 判断搜索内容是否含表情,不需要可以不判断 2.软键盘工具类弹出、关闭,不需要可以不判断 3.存储工具

  • 本文向大家介绍JS 实现百度搜索功能,包括了JS 实现百度搜索功能的使用技巧和注意事项,需要的朋友参考一下 今天我们来用JS实现百度搜索功能,下面上代码:     HTML部分: CSS层叠样式部分: JS部分:   搜索功能的实现源于百度的 https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd="+otext.value+"&cb=hou

  • 本文向大家介绍yii2实现分页,带搜索的分页功能示例,包括了yii2实现分页,带搜索的分页功能示例的使用技巧和注意事项,需要的朋友参考一下 一、模型配置 事例会用到三个models。文章类别表和文章表用gii生成下即可,最后一个是搜索验证模型。其中,只讲下一个联表和搜索验证。其他不用操作。 1.文章表关联 2.搜索模型 common/models/search/创建ArticleSearch.ph

  • 本文向大家介绍自定义搜索功能Android实现,包括了自定义搜索功能Android实现的使用技巧和注意事项,需要的朋友参考一下 先看看效果图: 源码下载:自定义搜索功能 代码: SearchActivity.java SearchBean.java SearchAdapter.java CommonAdapter.java ViewHolder.java SearchView.java 布局文件:

  • 本文向大家介绍angularjs实现分页和搜索功能,包括了angularjs实现分页和搜索功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了angularjs实现分页和搜索展示的具体代码,供大家参考,具体内容如下 话不多说,上代码 javascript 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。