自定义ComboBox控件,完美解决C#自带的ComboBox效率慢的问题

自定义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功能¨1能¨1的ì?mycombobox,效?ì率¨o比ਨ原-combobox高?很¨1多¨¤倍à?!ê?

///可¨|扩¤?充?

///</summary>

public
partial class
MyComboBox : UserControl

{

#region 内¨2部?类¤¨¤

///<summary>

/// Items存??储??é类¤¨¤

///</summary>

public
class MyItems

{

#region 重?要°a变à?量¢?

///<summary>

///存??储??é传??递ìY进?来¤??的ì?string类¤¨¤型¨a的ì?数oy据Y

///</summary>

private
List<string> listItemMSG =
new List<string>();

///<summary>

///存??储??é传??递ìY进?来¤??的ì?string类¤¨¤型¨a的ì?数oy据Y

///</summary>

public
List<string> ListItemMSG

{

get {
return this.listItemMSG; }

set {
this.listItemMSG = value; }

}

#endregion

#region 构1造¨?函?¥数oy

///<summary>

///无T参?构1造¨?函?¥数oy

///</summary>

public MyItems()

{

}

#endregion

欢迎关注http://blog.csdn.net/aaa123524457

转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47058675

#region 业°|ì务?处?|理¤¨a函?¥数oy

///<summary>

///返¤|ì回?与??输o?入¨?字á?符¤?串??相¨¤似?的ì?所¨′有?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>

///添?¨a加¨?string类¤¨¤型¨a的ì?数oy据Y

///</summary>

///<param name="msg">数oy据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>

///项?目?处?|理¤¨a

///</summary>

public
MyItems myItems = new
MyItems();

#endregion

#region 构1造¨?函?¥数oy

///<summary>

///无T参?构1造¨?函?¥数oy

///</summary>

public MyComboBox()

{

InitializeComponent();

//this.listBox_ComboBox.ItemsSource = this.myItems.getMyItems();

}

#endregion

#region 业°|ì务?处?|理¤¨a函?¥数oy

///<summary>

///监¨¤控?键¨1盘¨?操¨′作á??

///</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;

}

//  键¨1盘¨?“??↑¨1”?à、?é“??←?”?à键¨1

if ((e.Key ==
Key.Up) || (e.Key == Key.Left))

{

if (this.listBox_ComboBox.SelectedIndex > 0)

{

this.listBox_ComboBox.SelectedIndex--;

}

}

//  键¨1盘¨?“??↓y”?à、?é“??→¨2”?à键¨1

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++;

}

}

// 回?车|ì键¨1

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标à¨o位?置?

tb.Select(tb.Text.Length, 1);

}

///<summary>

///选?择?内¨2容¨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标à¨o位?置?

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函?¥数oy

///<summary>

///重?置?控?件t宽¨a度¨¨

///</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里面引用就无所谓了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-25 01:35:09

自定义ComboBox控件,完美解决C#自带的ComboBox效率慢的问题的相关文章

win10 当前操作环境不支持支付宝控件 完美解决办法

第一步,修改系统配置 在运行中输入“gpedit.msc”打开本地组策略编辑器: 打运行窗口的方法是:按win键+R (按下win键再按R键之后 同时松开)  win键 即windows 的微标键 如果实在不知道怎么打开,可以参照下图,在红色的地址栏中输入gpedit.msc 后点右边的键头打开 gpedit.msc 接下来 在计算机配置->管理模板->Windows组件->Internet Explorer选项下,双击右侧设置中“自定义用户代理字符串” 双击右侧设置中“自定义用户代理字

2014-07-30 DataGridView单元格ComboBox控件Index

项目是在DataGridView单元格中搞得ComboBox控件. 而且要根据ComboBox对应的不同选项,来确定界面上的另一个ComboBox控件是否可用. 这样问题就出来了: DataGridView中的ComboBox是没有事件的! 当更改了Combox中的值以后,必须用鼠标点一下别的地方(鼠标离开此单元格),才会走CellValueChanged事件...... 研究+百度了好久,都不行,终于在中午灵光一闪,搞定了! 思路就是把这个没有事件的单元格,变成有事件的控件: 1 //定义全局

自定义下拉列表控件

问题及需求 输入汉字或全拼或简拼均可得到结果(此需求用原生的ComboBox不容易实现) 点击文本框时弹出下拉列表 进入文本框时弹出下拉列表 输入文字时,如果有结果,则弹出下拉列表 除文本框和下拉列表外,点击任何地方均隐藏下拉列表 单击下拉列表中的文字,文本出现在文本框,关闭下拉列表 下拉列表出现后,默认选中第一项,第一项高亮 回车后下拉列表中选中的文本出现在文本框中 2.解决思路 用Panel作为容器,装载ListView,作为下拉列表的数据容器 定义下拉列表显示方法,并使用+=将其添加到文本

自定义可视控件

由于本软件为音乐软件,需要大量绘图,现有的基于DC的API及BCB的画布均不能完成要求(速度慢,绘制特定图案困难),为了节省时间,派生了现有的TWinControl可视窗口控件,组合特定的绘图类,形成一个新的类,图案绘制在可视区域,重载控件的鼠标及键盘事件处理,形成标准的控制,这一切都实现了,但结果失败了,原因是自绘图完成后,系统刷新了一下控件,结果悲催了,改变窗体尺寸也要刷下一,可视窗口控件这一动作是正常的,问题是系统不认我的自绘图.解决问题的办法是系统刷后再绘,那么就截获WM_SIZE消息,

自定义View控件(1—xib实例代码)

/** * 1. 设置显示到控制器上的模型数据(根据plist文件设置其属性,然后定义与实现工厂方法来快速实现字典转模型) */   // 1. 模型Shop.h文件 @interface Shop : NSObject @property (nonatomic, strong) NSString *name; @property (nonatomic, strong) NSString *icon; - (Shop *)initWithDict:(NSDictionary *)dict; +

Combobox控件实现汉字按拼音首字母检索

Combobox控件在开发中作为下拉选项的不二之选,用的非常频繁,前几日开发过程中刚好有个需求有用到这个控件,而且客户要求增加下拉选择功能,这个简单,设置控件的自动完成属性后就解决了 this.comboBox1.AutoCompleteSource = AutoCompleteSource.ListItems;//设置自动完成的源  this.comboBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;//设置自动完成的的形式 发现场

C# 自定义FileUpload控件

摘要:ASP.NET自带的FileUpload控件会随着浏览器的不同,显示的样式也会发生改变,很不美观,为了提高用户体验度,所以我们会去自定义FileUpload控件 实现思路:用两个Button和TextBox控件来替代FileUpload控件,当点击Button时触发FileUpload控件的点击事件,然后通过JS把FileUpload控件的Value赋给TextBox 代码: aspx文件: 1 <html xmlns="http://www.w3.org/1999/xhtml&qu

DuiLib 自定义识别控件

遇到一个断点无法识别自定义的控件,运气比较好,一搜就搜出来了: 参考地址:http://www.bkjia.com/ASPjc/992050.html 主要是这个函数: CControlUI* CDialogBuilder::Create(STRINGorID xml, LPCTSTR type, IDialogBuilderCallback* pCallback, CPaintManagerUI* pManager, CControlUI* pParent) 这个函数 的第一个参数指定为xml

使用EasyUI的combobox控件实现级联搜索条件

昨天接到一个需求,是做一个简单的查询页面,相对于目前公司系统有一个新的东西,需要实现多级机构的级联查询.公司系统的前端框架采用的是jquery-easyui-1.4.3, 在以前接触到的系统中,前端做的不是太多,有采用velocity+html的,实现这种级联倒是做过,只是没怎么记录.现在使用easyui,需要学习一下. 看了些关于easyui的东东,打算采用combobox的input来实现这个级联查询功能. 首先,combobox 实现 动态加载 选项的方法有: reload(url)  .