ComboBox自定义实现(Realization of the DataGridView-plugin in ComboBox)
来源:互联网 发布:2017淘宝店铺怎么装修 编辑:程序博客网 时间:2024/06/05 20:14
ComboBox控件很好用,但有时希望其下拉的数据更丰富一些,不要那么单调,后来自己琢磨一下,看看能不能自定义一个,经过查找网上资料加自己整理,做出一个demo,很糙,请随便拍!
【版本信息】:Microsoft Visual Studio 2010 Ultimate(旗舰版) 版本 10.0.40219.1 SP1Rel
Microsoft .NET Framework 版本 4.0.30319 SP1Rel
废话不多话,先看效果。
【全部代码在最下方】
具体实现如下:
第一部分:控件的自定义
控件的外观实现部分:由低到高分为4层。最底下一层为ToolStripDropDown,即点击ComboBox右侧的小黑三角后呈现的这部分,最底下一层ToolStripDropDown命名为(dropDown)。第二层为两块ToolStripControlHost,其目的是盛放TextBox和DataGridView,因此两部分自定义名称textBoxHost、dataGridViewHost。第三层有两块:TextBox和Form。如下图中的③、④所示。 第四层为DataGridView,如5所示。
声明部分的代码如下:
ToolStripControlHost dataGridViewHost; //声明盛放DataGridView的ToolStripControlHost ToolStripControlHost textBoxHost; //声明盛放TextBox的ToolStripControlHost ToolStripDropDown dropDown; //声明dropDown DataGridView dataGridView = new DataGridView(); //声明DataGridView dataGridView.BorderStyle = BorderStyle.FixedSingle; dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView.AllowUserToAddRows = false; dataGridView.AllowUserToDeleteRows = false; dataGridView.DoubleClick+=new EventHandler(dataGridView_DoubleClick); Form frmDataSource = new Form(); //声明Form frmDataSource.Controls.Add(dataGridView); TextBox testBox = new TextBox(); testBox.KeyPress += new KeyPressEventHandler(testBox_KeyPress); testBox.TextChanged += new EventHandler(testBox_TextChanged); textBoxHost = new ToolStripControlHost(testBox); textBoxHost.AutoSize = true; dataGridViewHost = new ToolStripControlHost(dataGridView); dropDown = new ToolStripDropDown(); dropDown.LayoutStyle = ToolStripLayoutStyle.VerticalStackWithOverflow; dropDown.Items.Add(textBoxHost); dropDown.Items.Add(dataGridViewHost);
代码添加完成后,则需要添加各种事件:
添加的事件及完整代码如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;using System.Security.Permissions;using System.Drawing;using System.Data;namespace MyDataGridViewPlugin{ [SecurityPermissionAttribute(SecurityAction.LinkDemand,Flags=SecurityPermissionFlag.UnmanagedCode)] class DataViewPlugin : ComboBox { ToolStripControlHost dataGridViewHost; ToolStripControlHost textBoxHost; ToolStripDropDown dropDown; public DataViewPlugin() { // DataGridView dataGridView = new DataGridView(); dataGridView.BorderStyle = BorderStyle.FixedSingle; dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView.AllowUserToAddRows = false; dataGridView.AllowUserToDeleteRows = false; dataGridView.DoubleClick+=new EventHandler(dataGridView_DoubleClick); Form frmDataSource = new Form(); frmDataSource.Controls.Add(dataGridView); TextBox testBox = new TextBox(); testBox.KeyPress += new KeyPressEventHandler(testBox_KeyPress); testBox.TextChanged += new EventHandler(testBox_TextChanged); textBoxHost = new ToolStripControlHost(testBox); textBoxHost.AutoSize = true; dataGridViewHost = new ToolStripControlHost(dataGridView); dropDown = new ToolStripDropDown(); dropDown.LayoutStyle = ToolStripLayoutStyle.VerticalStackWithOverflow; dropDown.Items.Add(textBoxHost); dropDown.Items.Add(dataGridViewHost); } //文本框输入内容时,ComboBox置空 void testBox_TextChanged(object sender, EventArgs e) { base.Text = ""; } //文本框输入欲查询的值,监听回车事件 void testBox_KeyPress(object sender, KeyPressEventArgs e) { if((int)e.KeyChar==13) //监听 回车事件 { for (int i = 0; i < DataGridView.RowCount; i++) { if (TextBox.Text.ToString().Trim() == DataGridView[0, i].Value.ToString().Trim())//此处的 { DataGridView.CurrentCell=DataGridView[0,i]; return; } } MessageBox.Show("未找到以下指定文本:\n\n" + TextBox.Text.ToString().Trim(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } } //DataGridView双击返填回ComboBox void dataGridView_DoubleClick(object sender, EventArgs e) { PopupGridView(); } private void PopupGridView() { DataGridViewRow currentRow = DataGridView.CurrentRow; base.Text = currentRow.Cells[0].Value.ToString(); base.Refresh(); TextBox.Text = ""; } public DataGridView DataGridView { get { return dataGridViewHost.Control as DataGridView; } } public TextBox TextBox { get { return textBoxHost.Control as TextBox; } } //点击ComboBox右侧小黑三角后,出现的下拉框 public void ShowDropDown() { if(dropDown!=null) { dataGridViewHost.Height = DropDownHeight; dataGridViewHost.Width = DropDownWidth; dropDown.Show(this, 0, this.Height); } } //下面的部分主要是处理消息,有兴趣的可以参考MSDN上关于message及message queue。具体点击这儿 //若不感兴趣,可以直接复制粘贴。学过C++的会感到比较easy private const int WM_USER = 0x0400, WM_REFLECT = WM_USER + 0x1c00, //自定义事件 WM_COMMAND = 0x0111, CBN_DROPDOWN = 7; //取高位值 public static int HIWORD(int n) { return (n >> 16) & 0xffff; } int i = 0; //重写消息处理方法 protected override void WndProc(ref Message m) { if (m.Msg == (WM_REFLECT + WM_COMMAND)) { if (HIWORD((int)m.WParam) == CBN_DROPDOWN) { ShowDropDown(); return; } } base.WndProc(ref m); i++; } protected override void Dispose(bool disposing) { if (disposing) { if (dropDown != null) { dropDown.Dispose(); dropDown = null; } } base.Dispose(disposing); } }}
以上就是自定义的控件的实现。
具体使用如下:
public partial class Form1 : Form { public Form1() { InitializeComponent(); this.Load += new EventHandler(Form1_Load); } void Form1_Load(object sender, EventArgs e) { //准备数据 DataTable myDataTable = new DataTable(); myDataTable.Columns.Add("姓名",typeof(System.String)); myDataTable.Columns.Add("年龄",typeof(System.String)); for (int i = 1; i <= 10; i++) { myDataTable.Rows.Add(new object[] { "张三_"+i, 6+i }); } //自定义控件赋值 myPlug.DataGridView.DataSource = myDataTable; this.Controls.Add(myPlug); } }
很简单。
有了自定控件之后,就可以随心所欲的添加到其他的控件中了。最近打算把这个自定义控件添加到DataGridView中,看看效果如何。
全部代码如下: 在这儿
- ComboBox自定义实现(Realization of the DataGridView-plugin in ComboBox)
- datagridview combobox
- jqGrid中下拉框的实现(The realization of select in jqGrid via C#)
- 巧用comboBox实现datagridview中DataGridViewComboBoxColumn列
- datagridview定制ComboBox列
- DataGridView中加ComboBox
- DataGridView添加ComboBox
- DataGridView添加ComboBox
- Datagridview中的ComboBox
- DataGridview add Combobox
- Datagridview add Combobox 2
- the combobox bug in flex3.5
- How to change the ForeColor of individual items in a ComboBox? (C# Winforms)
- ComboBox
- combobox
- ComboBox
- ComboBox
- ComboBox
- POJ 1450 Gridland
- 「SISTERS ~夏の最后の日~ Ultra Edition」资源提取
- Marshal在C#中的应用(void *指针到IntPtr的转化)
- 3 Sum
- VS2010中导入Active X控件
- ComboBox自定义实现(Realization of the DataGridView-plugin in ComboBox)
- [MongoDB] 安装MongoDB配置Replica Set
- 【SCOI2005】繁忙的都市
- cocos2d-x 斗地主牌组排序
- Struts2中的路径问题总结
- 插值方法实现(拉格朗日插值和牛顿插值)
- Servlet的事件监听器
- linux cd 命令的几个小技巧
- 门面模式