国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#實現帶搜索功能的ComboBox

2019-10-29 21:19:56
字體:
來源:轉載
供稿:網友

帶搜索的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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德化县| 民县| 秦安县| 潢川县| 甘肃省| 彭水| 阳曲县| 辰溪县| 保定市| 佛坪县| 奉化市| 承德县| 屯门区| 九寨沟县| 喀什市| 赤峰市| 玛沁县| 乌鲁木齐县| 兰溪市| 分宜县| 余江县| 宜良县| 宜川县| 墨玉县| 金乡县| 浦江县| 自贡市| 延津县| 潞城市| 福安市| 林西县| 侯马市| 泗水县| 宁德市| 句容市| 阿城市| 基隆市| 内乡县| 饶平县| 台东市| 全椒县|