自定义ComboBox控件,完美解决C#自带的ComboBox效率慢的问题
欢迎关注http://blog.csdn.net/aaa123524457
转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675
在做项目的时候,用到了ComboBox来做下拉列表的功能;但是在用的时候发现C#自带的ComboBox效率非常的慢!
当然我添加的是股票、期货的合约数据,大概有几千条信息,算是比较大的。如果用到的数据很少,就可以直接用C#自带的。
C#自带的combobox之所以慢,是因为内部做了大量的转型、匹配工作。具体这里就不分析了。有兴趣的朋友可以去找找资料研究一下。
我这里用了WPF做了一个自定义combobox控件。自己写了一个和C#自带的combobox一样功能的空间,但是效率却非常快!废话不多说,直接看代码:
欢迎关注http://blog.csdn.net/aaa123524457
转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675
前台代码:
<UserControl x:Class=" MyComboBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Loaded="UserControl_Loaded" > 欢迎关注http://blog.csdn.net/aaa123524457 转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675 <Grid> <DockPanel> <Border DockPanel.Dock="Top" BorderBrush="Black" BorderThickness="1"> <StackPanel Orientation="Horizontal"> <TextBox Margin="0,0,1,0" Name="textBox_ComboBox" KeyUp="textBox_ComboBox_KeyUp" /> <Button Width="13" Name="button_drop" HorizontalAlignment="Right" FontSize="7" Click="button_drop_Click">▼</Button> </StackPanel> </Border> <ListBox DockPanel.Dock="Top" Margin="0,1,0,0" Name="listBox_ComboBox" Visibility="Collapsed" MouseDoubleClick="listBox_ComboBox_MouseDoubleClick" /> </DockPanel> </Grid> </UserControl> |
欢迎关注http://blog.csdn.net/aaa123524457
转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675
后台代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes;
namespace MyComboBox_real { ///<summary> /// Interaction logic for MyComboBox.xaml ///重写的一具有部分combobox功能¨¹能¨¹的Ì?mycombobox,效¡ì率¨º比À¨¨原-combobox高?很¨¹多¨¤倍À?!ê? ///可¨¦扩¤?充? ///</summary> public partial class MyComboBox : UserControl { #region 内¨²部?类¤¨¤ ///<summary> /// Items存ä?储ä¡é类¤¨¤ ///</summary> public class MyItems { #region 重?要°a变À?量¢? ///<summary> ///存ä?储ä¡é传ä?递ÌY进?来¤¡ä的Ì?string类¤¨¤型¨ª的Ì?数ºy据Y ///</summary> private List<string> listItemMSG = new List<string>(); ///<summary> ///存ä?储ä¡é传ä?递ÌY进?来¤¡ä的Ì?string类¤¨¤型¨ª的Ì?数ºy据Y ///</summary> public List<string> ListItemMSG { get { return this.listItemMSG; } set { this.listItemMSG = value; } } #endregion
#region 构1造¨¬函¡¥数ºy ///<summary> ///无T参?构1造¨¬函¡¥数ºy ///</summary> public MyItems() {
} #endregion 欢迎关注http://blog.csdn.net/aaa123524457 转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675 #region 业°¦Ì务?处ä|理¤¨ª函¡¥数ºy
///<summary> ///返¤¦Ì回?与®?输º?入¨?字Á?符¤?串ä?相¨¤似?的Ì?所¨´有®D字Á?符¤?串ä? ///</summary> ///<param name="msg"></param> ///<returns></returns> public List<string> getMatchDatas(string msg) { return this.ListItemMSG.Where ( f => ((f.Length >= msg.Length) && (((f.Substring(0, msg.Length)).ToLower()) == (msg.ToLower()))) ).ToList<string>(); }
///<summary> ///添¬¨ª加¨®string类¤¨¤型¨ª的Ì?数ºy据Y ///</summary> ///<param name="msg">数ºy据Y</param> ///<returns>成¨¦功|返¤¦Ì回?1</returns> public int add(string msg) { this.ListItemMSG.Add(msg); return 1; }
///<summary> ///清?除yitems ///</summary> ///<returns></returns> public int clear() { this.ListItemMSG.Clear(); return 1; } #endregion }
#endregion
#region 重?要°a变À?量¢? ///<summary> ///项?目?处ä|理¤¨ª ///</summary> public MyItems myItems = new MyItems();
#endregion
#region 构1造¨¬函¡¥数ºy ///<summary> ///无T参?构1造¨¬函¡¥数ºy ///</summary> public MyComboBox() { InitializeComponent(); //this.listBox_ComboBox.ItemsSource = this.myItems.getMyItems(); }
#endregion
#region 业°¦Ì务?处ä|理¤¨ª函¡¥数ºy ///<summary> ///监¨¤控?键¨¹盘¨¬操¨´作Á¡Â ///</summary> ///<param name="sender"></param> ///<param name="e"></param> private void textBox_ComboBox_KeyUp(object sender,KeyEventArgs e) { TextBox tb = senderas TextBox;
if (tb == null) { return; }
// 键¨¹盘¨¬“¡ã↑¨¹”¡À、¡é“¡ã←?”¡À键¨¹ if ((e.Key == Key.Up) || (e.Key == Key.Left)) { if (this.listBox_ComboBox.SelectedIndex > 0) { this.listBox_ComboBox.SelectedIndex--; } } // 键¨¹盘¨¬“¡ã↓y”¡À、¡é“¡ã→¨²”¡À键¨¹ else if ((e.Key == Key.Down) || (e.Key == Key.Right)) { if (this.listBox_ComboBox.SelectedIndex < (this.listBox_ComboBox.Items.Count - 1)) { this.listBox_ComboBox.SelectedIndex++; } } // 回?车¦Ì键¨¹ else if (e.Key == Key.Enter) { tb.Text = this.listBox_ComboBox.SelectedItem ==null ? tb.Text : this.listBox_ComboBox.SelectedItem.ToString(); this.listBox_ComboBox.Visibility =Visibility.Collapsed; } else { if ((tb.Text != null) && (tb.Text != "")) { if (this.myItems.getMatchDatas(tb.Text).Count > 0) { this.listBox_ComboBox.ItemsSource =this.myItems.getMatchDatas(tb.Text); this.listBox_ComboBox.Visibility =Visibility.Visible; } else { this.listBox_ComboBox.Visibility =Visibility.Collapsed; } } else { this.listBox_ComboBox.Visibility =Visibility.Collapsed; } }
// 重?置?光a标À¨º位?置? tb.Select(tb.Text.Length, 1); }
///<summary> ///选?择?内¨²容¨Y ///</summary> ///<param name="sender"></param> ///<param name="e"></param> private void listBox_ComboBox_MouseDoubleClick(object sender,MouseButtonEventArgs e) { ListBox lb = senderas ListBox; if (lb == null) { return; }
if (lb.SelectedItem ==null) { lb.Visibility = Visibility.Collapsed; return; }
this.textBox_ComboBox.Text = lb.SelectedItem.ToString(); lb.Visibility = Visibility.Collapsed; // 重?置?光a标À¨º位?置? this.textBox_ComboBox.Select(this.textBox_ComboBox.Text.Length, 1); } #endregion 欢迎关注http://blog.csdn.net/aaa123524457 转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675 #region 私?有®D函¡¥数ºy ///<summary> ///重?置?控?件t宽¨ª度¨¨ ///</summary> ///<param name="sender"></param> ///<param name="e"></param> private void UserControl_Loaded(object sender, RoutedEventArgs e) { this.textBox_ComboBox.Width =this.ActualWidth - 1 - this.button_drop.ActualWidth; }
///<summary> ///模¡ê拟a点Ì?击¡Â下?拉¤- ///</summary> ///<param name="sender"></param> ///<param name="e"></param> private void button_drop_Click(object sender, RoutedEventArgs e) { if (this.listBox_ComboBox.Visibility ==Visibility.Visible) { this.listBox_ComboBox.Visibility =Visibility.Collapsed; } else { this.listBox_ComboBox.ItemsSource =this.myItems.ListItemMSG; this.listBox_ComboBox.Visibility =Visibility.Visible; } }
#endregion
} }
|
欢迎关注http://blog.csdn.net/aaa123524457
转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675
效果图:
欢迎关注http://blog.csdn.net/aaa123524457
转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675
需要注意的一点是:如果是在winform里面添加这个自定义控件,需要稍微把自定义控件的高度拉长一点,不然会被遮住的哦;如果在wpf里面引用就无所谓了。