栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#实现带搜索功能的ComboBox

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#实现带搜索功能的ComboBox

带搜索的ComboBox就是给ComboBox一个依赖属性的ItemSource,然后通过数据源中是否包含要查询的值,重新给ComboBox绑定数据源。

public class EditComboBox : ComboBox
  {
    private bool t = true;//首次获取焦点标志位
    private ObservableCollection bindingList = new ObservableCollection();//数据源绑定List
    private string editText = "";//编辑文本内容

    /// 
    /// 注册依赖事件
    /// 
    public static readonly DependencyProperty ItemsSourcePropertyNew = DependencyProperty.Register("MyItemsSource", typeof(IEnumerable), typeof(EditComboBox), new frameworkPropertymetadata(new PropertyChangedCallback(ValueChanged)));
    /// 
    /// 数据源改变,添加数据源到绑定数据源
    /// 
    /// 
    /// 
    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);
      }
    }
    /// 
    /// 设置或获取ComboBox的数据源
    /// 
    public IEnumerable MyItemsSource
    {
      get
      {
 return (IEnumerable)GetValue(ItemsSourcePropertyNew);
      }

      set
      {
 if (value == null)
   ClearValue(ItemsSourcePropertyNew);
 else
   SetValue(ItemsSourcePropertyNew, value);
      }
    }
    /// 
    /// 重写初始化
    /// 
    /// 
    protected override void onInitialized(EventArgs e)
    {
      base.onInitialized(e);
      this.IsEditable = true;
      this.IsTextSearchEnabled = false;
      this.ItemsSource = bindingList;
    }
    /// 
    /// 下拉框获取焦点,首次搜索文本编辑框
    /// 
    /// 
    protected override void onGotFocus(RoutedEventArgs e)
    {
      if (t)
 FindTextBox(this);
      else
 t = false;
    }
    /// 
    /// 搜索编辑文本框,添加文本改变事件
    /// 
    /// 
    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);
 }
      }
    }
    /// 
    /// 文本改变,动态控制下拉条数据源
    /// 
    /// 
    /// 
    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);
      }
    }
    /// 
    /// 组合框关闭,数据源恢复
    /// 
    /// 
    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);
      }
    }
    /// 
    /// 过滤符合条件的数据项,添加到数据源项中
    /// 
    /// 
    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用法一样了。

复制代码 代码如下:

效果演示

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

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号