在.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,然后敲回車,那么會出現
好了,實現了功能,結束了
當然,本人還是在學習階段,或許上面的代碼寫的不怎么好,希望指正.有些功能還不夠強,請擴
|