可以搜索的ComboBox----

在.Net的技术论坛里,有一次看到了某网友发了个帖子,大概的意思就是:假如数据库中有很多的记录读取到ComboBox中,恰好是大于1000条记录,如果要选择其中第500条记录,那不得烦死了啊?所以,最好是输入代码或者其他的助记符号就马上可以找到那条记录.

为此,我作了一个控件SearchComboBox.由于本人表达能力有限,不怎么好,就直接开始程序了

首先,建立一个项目Hexudong_ComboBox

然后添加一个类ItemName,具体代码如下

ItemName.cs

using System;

namespace Hexudong_ComboBox
{
/// <summary>
/// ItemName 的摘要说明。
/// </summary>
public class ItemName:object
{
private long _ID;
private string _Code;
private string _Name;
private string _PinYinCode;
private string _WuBiCode;
private string _DefineCode;
private string _Text;

public ItemName()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public ItemName(long id,string code,string name)
{
_ID=id;
_Code=code;
_Name=name;
_Text=_Code + " " + _Name;
}

public ItemName(long id,string code,string name,string pinyincode,string wubicode)
{
_ID=id;
_Code=code;
_Name=name;
_PinYinCode=pinyincode;
_WuBiCode=wubicode;
_Text=_Code + " " + _Name;
}

public ItemName(long id,string code,string name,string pinyincode,string wubicode,string definecode)
{
_ID=id;
_Code=code;
_Name=name;
_PinYinCode=pinyincode;
_WuBiCode=wubicode;
_DefineCode=definecode;
_Text=_Code + " " + _Name;
}

/// <summary>
/// ID号
/// </summary>
public long ID
{
get
{
return _ID;
}
set
{
_ID=value;
}
}

/// <summary>
/// 代码
/// </summary>
public string Code
{
get
{
return _Code;
}
set
{
_Code=value;
}
}

/// <summary>
/// 名称
/// </summary>
public string Name
{
get
{
return _Name;
}
set
{
_Name=value;
}
}

/// <summary>
/// 拼音码
/// </summary>
public string PinYinCode
{
get
{
return _PinYinCode;
}
set
{
_PinYinCode=value;
}
}

/// <summary>
/// 五笔码
/// </summary>
public string WuBiCode
{
get
{
return _WuBiCode;
}
set
{
_WuBiCode=value;
}
}

/// <summary>
/// 自定义码
/// </summary>
public string DefineCode
{
get
{
return _DefineCode;
}
set
{
_DefineCode=value;
}
}

/// <summary>
/// 控件文本
/// </summary>
public string Text
{
get
{
return _Text;
}
set
{
_Text = value;
}
}

/// <summary>
/// 重写ToString方法
/// </summary>
/// <returns></returns>
public override string ToString()
{
return _Text;
}
}
}

再添加一个类SearchComboBox,具体的代码如下:

SearchComboBox.cs

using System;
using System.Windows.Forms;
using System.Drawing;

namespace Hexudong_ComboBox
{
/// <summary>
/// SearchCombBox 的摘要说明。
/// </summary>
public class SearchComboBox:System.Windows.Forms.ComboBox
{
public SearchComboBox()
{
//
// TODO: 在此处添加构造函数逻辑
//
DrawMode = DrawMode.OwnerDrawFixed;
}

//根据输入文本框内容的Code查找相应的名称值并显示为代码+名称的字符串
protected override void OnKeyPress(KeyPressEventArgs e)
{
if(e.KeyChar==(char)13)
{
foreach(object obj in Items)
{
ItemName item=(ItemName)obj;
if(item.Code.Trim()==Text.Trim())
{
SelectedItem=item;
Text=item.Code + " " + item.Name;
break;
}
}
}
base.OnKeyPress (e);
}

//失去焦点
protected override void OnLostFocus(EventArgs e)
{
GetText(false);
base.OnLostFocus (e);
}

//得到焦点
protected override void OnGotFocus(EventArgs e)
{
GetText(true);
base.OnGotFocus (e);
}

//选择项改变
protected override void OnSelectedIndexChanged(EventArgs e)
{
GetText(true);
base.OnSelectedIndexChanged (e);
}

/// <summary>
/// 失去焦点,得到焦点,选择变化时的文本内容
/// </summary>
/// <param name="Focused">是否聚焦,主要区别于OnLostFocus事件</param>
/// <returns></returns>
private string GetText(bool Focused)
{
if(SelectedItem!=null)
{
ItemName item=(ItemName)SelectedItem;
if(Focused)
{
Text=item.Code + " " + item.Name;
SelectAll();
}
else
{
Text=item.Name;
}
}
else
{
Text="";
}
return Text;
}

//重画下拉子项的内容,主要是赋文本内容
protected override void OnDrawItem(DrawItemEventArgs e)
{
e.DrawBackground();
e.DrawFocusRectangle();

if (e.Index < 0)
e.Graphics.DrawString("", e.Font,
new SolidBrush(e.ForeColor), e.Bounds.X, e.Bounds.Y);
else
{
if (Items[e.Index].GetType() == typeof(ItemName))
{
ItemName item = (ItemName)Items[e.Index];
e.Graphics.DrawString(item.Text ,
e.Font,new SolidBrush(e.ForeColor),e.Bounds.X,e.Bounds.Y);
}
else
{
e.Graphics.DrawString("",
e.Font, new SolidBrush(e.ForeColor), e.Bounds.X, e.Bounds.Y);

}
}
base.OnDrawItem (e);
}

/// <summary>
/// 设置或获取选择项的ID号
/// </summary>
public long SelectedID
{
get
{
if(SelectedItem!=null)
{
ItemName item=(ItemName)SelectedItem;
return item.ID;
}
else
{
return -1;
}
}
set
{
int i=0;
foreach(object obj in Items)
{
ItemName item=(ItemName)obj;
if(item.ID==value)
{
SelectedItem=item;
Text=item.Code + " " + item.Name;
break;
}
if(i==Items.Count-1)
{
SelectedItem=null;
Text="";
}
i++;
}
}
}

/// <summary>
/// 设置或获取选择项的代码
/// </summary>
public string SelectedCode
{
get
{
if(SelectedItem!=null)
{
ItemName item=(ItemName)SelectedItem;
return item.Code;
}
else
{
return "";
}
}
set
{
int i=0;
foreach(object obj in Items)
{
ItemName item=(ItemName)obj;
if(item.Code.Trim()==value.Trim())
{
SelectedItem=item;
Text=item.Code + " " + item.Name;
break;
}
if(i==Items.Count-1)
{
SelectedItem=null;
}
i++;
}
}
}

/// <summary>
/// 设置或获取选择项的名称
/// </summary>
public string SelectedName
{
get
{
if(SelectedItem!=null)
{
ItemName item=(ItemName)SelectedItem;
return item.Name;
}
else
{
return "";
}
}
set
{
int i=0;
foreach(object obj in Items)
{
ItemName item=(ItemName)obj;
if(item.Name.Trim()==value.Trim())
{
SelectedItem=item;
Text=item.Code + " " + item.Name;
break;
}
if(i==Items.Count-1)
{
SelectedItem=null;
}
i++;
}
}
}
}
}

最后,编译成类库Hexudong_ComboBox.dll

下面来测试一下刚作的Hexudong_ComboBox.dll

另外建立一个测试的项目,然后把这个Hexudong_ComboBox.dll添加到工具箱中

拖一个到测试界面Form1上,然后,就可以在代码中添加数据到SearchComboBox中

Form1.cs中的部分代码

.........

using Hexudong_ComboBox;

.........

private void Form1_Load(object sender, System.EventArgs e)
{
this.searchComboBox1.Items.Clear();
Users objUsers=new UsersS().GetUsers();
foreach(User objUser in objUsers)
{
this.searchComboBox1.Items.Add(new ItemName(objUser.ID,objUser.Code,objUser.Name));
}

........

聚焦的时候是这样的:

失焦的时候是这样的:

如果你输入003,然后敲回车,那么会出现

好了,实现了功能,结束了

当然,本人还是在学习阶段,或许上面的代码写的不怎么好,希望指正.有些功能还不够强,请扩展,谢谢!

时间: 2016-02-06

可以搜索的ComboBox----的相关文章

C#实现带搜索功能的ComboBox_C#教程

带搜索的ComboBox就是给ComboBox一个依赖属性的ItemSource,然后通过数据源中是否包含要查询的值,重新给ComboBox绑定数据源. public class EditComboBox : ComboBox { private bool t = true;//首次获取焦点标志位 private ObservableCollection<object> bindingList = new ObservableCollection<object>();//数据源绑定

easyui combobox开启搜索自动完成功能的实例代码_javascript技巧

combo.json [{ "id":-1, "text":" ", "spell":"" },{ "id":1, "text":"类型1", "spell":"lx1" },{ "id":2, "text":"类型2", "spell&q

重写combobox可以实时搜索datatable数据源,并多列显示,加入到datagridview中第一列,如何选中一项更改datagridview当前行数据

问题描述 急求大神们%>_<%publicpartialclassNewCombox:ComboBox{publicintcolumnPadding=5;privateDataGridViewDGV;publicfloat[]columnWidths={50,150,100};//项宽度publicString[]columnNames={"title_id","au_id","au_ord"};//项名称publicintvalue

Ext的combobox的fieldlabel不显示,在网上搜索不到一个相关问题

问题描述 最早写的一个页面的combobox一点儿问题都没有,后来又写的一个页面也用到了combobox,结果是整个页面的combobox都不显示fieldlabel(前面的标题文本)firefox 的 debug 和 ie 的调试都没有报错,上网也找不到相关问题,赶项目.....显示效果见图片combobox的代码如下:xtype : 'combo',fieldLabel : '地区',hiddenName : 'region',name : 'customerRegion',forceSel

ExtJs2.0学习系列(6)--Ext.FormPanel之第三式(ComboBox篇)

前言:说句实话,此extjs系列的文章在博客园中的热度不高,可能是学这玩意的人不多吧,但是我觉得有这么个系列的文章对于中国朋友非常有帮助!请大家支持! 上篇ExtJs2.0学习系列(5)--Ext.FormPanel之第二式中我们讨论了下fieldset和表单验证的知识,今天我们接着深入解析表单元素中ComboBox组件的使用.会涉及 到.net简单服务器数据交互,但暂不做深入讨论,以后会详细分析服务器交互相关,不过可能要等较长一段时间,呵呵! 5.服务器数据作为ComboBox的数据源实例 首

TextInput、RadioButton、CheckBox、Combobox组件的使用和实例

一.TextInput组件就是文本输入框,参数有1.editable,默认是true,为文本可编辑,false,为输入文本不可编辑.2.password,是否为密码字段,默认为false,不是,如果为true时,是密码字段.3.text就是要填的文本字段. 二.RadioButton组件就是单选框,就是在某个问题的一组答案中,只有一个被选中,参数有组名称等,具体:1.data:就是输入RadioButton组件实例的label值.2.groupName:组名3.label:在RadioButto

vb.net的Combobox控件

Combobox(组合框)控件相当于将文本框和列表框的功能结合在一起.这个控件可以实现输入文本来选定项目,也可以实现从列表中选定项目这两种选择项目的方法.如果项目数超过了组合框能够显示的项目数,控件上将自动出现滚动条.用户可以上下或左右滚动列表.ComboBox控件在工具箱中的图标如图所示: 1.使用组合框和列表框 通常,组合框适用于建议性的选项列表,而当希望将输入限制在列表之内时,应使用列表框.组合框包含编辑区域,因此可将不在列表中的选项输入列区域中.此外,组合框节省了窗体的空间.只有单击组合

ComponentArt控件分析之ComboBox(2)

一.来看下数据数据解析 首先后台先生成一种数据格式,这种格式跟JSON差不多(不知道为什么不用JSON),查看HTML源代码 ComboBox2.Data = [[['Text','a'],['Value','b']],[['Text','b'],['Value','c']],[['Text','c'],['Enabled',0],['Value','b']],[['CssClass','comboItemHover'],['Text','d'],['Value','c'],['Id','Com

ComponentArt控件分析之ComboBox(1)

ComponentArt相信很多人都用过.功能比较强大,而且使用方便.最近可能要用到这套控件.所以顺便要学习一下这套控件是如何实现的. 我并不会贴一下代码就了事,也不可能一篇就把一个控件就讲完.这样的话,一个商业控件也太简单了. 还是让我们来一起来慢慢的分析.我会尽量凭自己能力把细节都写出来 我们先从ComboBox入手 一.效果图 先看下效果 图一 ComboBox特性: 与DropDownList相比,可以自己输入文本,但HTML未提供这样的标签,所以只能利用现有的标签来模拟. 上面为截图,

Asp.net第三方控件ComboBox组合框介绍

ComboBox组合框可以填写,可以选择,可以根据填写内容自动搜索可选项中部分匹配的项   可以填写,可以选择,可以根据填写内容自动搜索可选项中部分匹配的项 详情 复制代码 代码如下: http://webfx.eae.net/dhtml/combobox/combobox.htm http://webfx.eae.net/dhtml/combobox/combo_demo.htm 另外AjaxControlToolkit中提供了ComboBox,可以提供文本输入功能,并且有SuggestApp