调用控件: public partial class Form1 : Form { public Form1() { InitializeComponent(); //--------------------------------------- //设置dataWindow1属性 this.dataWindow1.PopupGridAutoSize = false; this.dataWindow1.DropDownHeight = 300; this.dataWindow1.DropDownWidth = 340; this.dataWindow1.DataSource = GetDataTable();//DataTable 类型 this.dataWindow1.RowFilterVisible = false; this.dataWindow1.AfterSelector += new EventHandler(dataWindow1_AfterSelector); } //选择完下拉表格后执行的事件 private void dataWindow1_AfterSelector(object sender, EventArgs e) { textBox1.Text = dataWindow1.GetDataProperty("username"); textBox2.Text = dataWindow1.GetDataProperty("department"); textBox3.Text = dataWindow1.GetDataProperty("postion"); } 重写ComboBox控件代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Drawing.Design; namespace WindowsApplication21 { public class DataWindow : ComboBox { #region 成员变量 private const int WM_LBUTTONDOWN = 0x201, WM_LBUTTONDBLCLK = 0x203; ToolStripControlHost dataGridViewHost; ToolStripControlHost textBoxHost; ToolStripDropDown dropDown; private string m_sKeyWords = ""; private string m_sDisplayMember = ""; private string m_sValueMember = ""; private string m_sDisplayField = ""; private string m_Separator = "|"; private string m_NullValue = ""; private bool m_blDropShow = false; private bool m_blPopupAutoSize = false; private int m_SelectedIndex=-1; public event EventHandler AfterSelector; #endregion #region 构造函数 public DataWindow() { DrawDataGridView(); } #endregion #region 属性 [Description("空值时的默认值"), Browsable(true), Category("N8")] public string NullValue { set { m_NullValue = value; } get { return m_NullValue; } } [Description("查询关键字"), Browsable(true), Category("N8")] public string sKeyWords { get { return m_sKeyWords; } set { m_sKeyWords = value; } } [Description("文本框显示字段用逗号分割!"), Browsable(true), Category("N8")] public string sDisplayMember { set { m_sDisplayMember = value; } get { return m_sDisplayMember; } } [Description("是否显示条件输入窗口!"), Browsable(true), Category("N8")] public bool RowFilterVisible { set { dropDown.Items[0].Visible = value; } get { return dropDown.Items[0].Visible; } } [Description("取值字段"), Browsable(true), Category("N8")] public string sValueMember { set { m_sValueMember = value; } get { return m_sValueMember; } } public DataView DataView { get { DataTable dataTable = GetDataTableFromDataSource(); if (dataTable == null) { return null; } return dataTable.DefaultView; } } [Description("设置DataGridView属性"), Browsable(true), Category("N8")] public DataGridView DataGridView { get { return dataGridViewHost.Control as DataGridView; } } public TextBox TextBox { get { return textBoxHost.Control as TextBox; } } [Description("下拉表格显示列,空为显示所有列!"), Browsable(true), Category("N8")] public string sDisplayField { set { m_sDisplayField = value; } get { return m_sDisplayField; } } [Description("数据源"), Browsable(true), Category("N8")] public new Object DataSource { set { if (m_sDisplayField != String.Empty) { DataGridView.Columns.Clear(); DataGridView.AutoGenerateColumns=false; string[] sDisplayFields = m_sDisplayField.Split(','); foreach (string sDisplay in sDisplayFields) { DataGridViewTextBoxColumn dgvCell = new DataGridViewTextBoxColumn(); dgvCell.Name = sDisplay; dgvCell.DataPropertyName = sDisplay; DataGridView.Columns.Add(dgvCell); } } DataGridView.DataSource = value; } get { return DataGridView.DataSource; } } [Description("下拉表格尺寸是否为自动"), Browsable(true), Category("N8")] public bool PopupGridAutoSize { set { m_blPopupAutoSize = value; } get { return m_blPopupAutoSize; } } [Description("分割符号"), Browsable(true), Category("N8")] public string SeparatorChar { set { m_Separator = value; } get { return m_Separator; } } [Browsable(false), Bindable(true)] public string Value { get { if (Text == String.Empty) { m_SelectedIndex = -1; } if (!String.IsNullOrEmpty(m_sValueMember)) { if (DataView == null) { return Text; } if (m_SelectedIndex > -1) { object obj = DataView[m_SelectedIndex][m_sValueMember]; return obj.ToString(); } else { return m_NullValue; } } else { return Text; } } set { int i = 0; if (m_sValueMember == String.Empty) { Text = value; } else { Text = ""; if (DataView != null) { DataView.RowFilter = ""; foreach (DataRowView dataRowView in DataView) { if (dataRowView[m_sValueMember].ToString() == value) { m_SelectedIndex = i; string[] sDisplayList = m_sDisplayMember.Split(','); foreach (string sDisplay in sDisplayList) { if (DataGridView.Columns.Contains(sDisplay)) { object obj = DataView[m_SelectedIndex][sDisplay]; Text += obj.ToString() + m_Separator; } } Text = Text.TrimEnd('|'); break; } i++; } } } } } #endregion #region 方法 #region 绘制DataGridView以及下拉DataGridView private void DrawDataGridView() { DataGridView dataGridView = new DataGridView(); dataGridView.BackgroundColor = SystemColors.ActiveCaptionText; dataGridView.BorderStyle = BorderStyle.None; dataGridView.ReadOnly = true; dataGridView.AllowUserToAddRows = false; dataGridView.RowHeadersVisible = false; dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView.DoubleClick += new EventHandler(dataGridView_DoubleClick); dataGridView.KeyDown += new KeyEventHandler(dataGridView_KeyDown); //设置DataGridView的数据源 Form frmDataSource = new Form(); frmDataSource.Controls.Add(dataGridView); frmDataSource.SuspendLayout(); dataGridViewHost = new ToolStripControlHost(dataGridView); dataGridViewHost.AutoSize = m_blPopupAutoSize; TextBox textBox = new TextBox(); textBox.TextChanged+=new EventHandler(textBox_TextChanged); textBox.KeyDown+=new KeyEventHandler(textBox_KeyDown); textBoxHost = new ToolStripControlHost(textBox); textBoxHost.AutoSize =false ; dropDown = new ToolStripDropDown(); dropDown.Width = this.Width; dropDown.Items.Add(textBoxHost); dropDown.Items.Add(dataGridViewHost); } #endregion public string GetDataProperty(string sColumn) { string sValue = ""; if (DataView != null) { if (DataGridView.Columns.Contains(sColumn)) { sValue = DataView[m_SelectedIndex][sColumn].ToString(); } } return sValue; } public void dataGridView_DoubleClick(object sender, EventArgs e) { PopupGridView(e); } /// <summary> /// 弹出下拉表格并触发选择后事件 /// </summary> /// <param name="e"></param> private void PopupGridView(EventArgs e) { if (DataGridView.SelectedRows.Count > 0) { DataGridViewRow dgvRow = DataGridView.CurrentRow; m_SelectedIndex = DataGridView.CurrentRow.Index; if (m_sDisplayMember != String.Empty) { Text = ""; string[] sDisplayList = m_sDisplayMember.Split(','); foreach (string sDisplay in sDisplayList) { if (DataGridView.Columns.Contains(sDisplay)) { Text += dgvRow.Cells[sDisplay].Value.ToString() + m_Separator; } } Text = Text.TrimEnd('|'); } else { Text = dgvRow.Cells[0].Value.ToString(); } if (AfterSelector != null) { AfterSelector(this,e); } } dropDown.Close(); m_blDropShow=false; } private DataTable GetDataTableFromDataSource() { object dataSource = DataGridView.DataSource; return GetDataTableFromDataSource(dataSource); } /// <summary> /// 从DataGridView 获取数据表 /// </summary> /// <returns></returns> private DataTable GetDataTableFromDataSource(object dataSource) { if (dataSource is DataTable) { return (DataTable)dataSource; } else if (dataSource is DataView) { return ((DataView)dataSource).Table; } else if (dataSource is BindingSource) { object bind = ((BindingSource)dataSource).DataSource; if (bind is DataTable) { return (DataTable)bind; } else { return ((DataView)bind).Table; } } else { return null; } } private void ShowDropDown() { if (dropDown != null) { if (DataView != null) { DataView.RowFilter = ""; TextBox.Text = ""; textBoxHost.Width = 200; dataGridViewHost.AutoSize = m_blPopupAutoSize; dataGridViewHost.Size = new Size(DropDownWidth - 2, DropDownHeight); dropDown.Show(this, 0, this.Height); } } } private void dataGridView_KeyDown(object sender,KeyEventArgs e) { if (e.KeyData == Keys.Enter) { PopupGridView(e); } } #region 重写方法 private string GetRowFilterString(string sText) { string sFilter = ""; if (m_sDisplayMember == String.Empty || m_sDisplayMember == null) { m_sDisplayMember = DataView.Table.Columns[0].ColumnName; } if (m_sKeyWords == String.Empty) { m_sKeyWords = m_sDisplayMember; } string[] sColumns = m_sKeyWords.Split(','); foreach (string sColumn in sColumns) { sFilter += sColumn + " like " + "'%" + sText + "%'"+" or "; } sFilter=sFilter.Trim().TrimEnd("or".ToCharArray()); return sFilter; } private void textBox_TextChanged(object sender,System.EventArgs e) { DataView.RowFilter = GetRowFilterString(TextBox.Text); } private void textBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { PopupGridView(e); } } protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if (e.KeyData == Keys.Enter) { DataView.RowFilter = GetRowFilterString(Text); PopupGridView(null); } } protected override void WndProc(ref Message m) { if (m.Msg == WM_LBUTTONDBLCLK || m.Msg == WM_LBUTTONDOWN) { if (m_blDropShow) { m_blDropShow = false; } else { m_blDropShow = true; } if (m_blDropShow) { ShowDropDown(); } else { dropDown.Close(); } return; } base.WndProc(ref m); } protected override void Dispose(bool disposing) { if (disposing) { if (dropDown != null) { dropDown.Dispose(); dropDown = null; } } base.Dispose(disposing); } #endregion #endregion } }