zoukankan      html  css  js  c++  java
  • Winform带dataGridview的Combox控件

    调用控件:
    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
        }
    }
    

      

  • 相关阅读:
    docker相关
    多线程
    设计模式
    ftp下载乱码问题
    Windows无法启动SQL server 代理服务(服务器)错误1067:进程意外终止
    Struts2 if标签
    Java项目编译时经常会出现不编译,或者报一些假性错误
    ajaxSubmit 上传文件 提示下载json处理
    MySQL中优化sql语句查询常用的30种方法
    mybatis 中的where标签
  • 原文地址:https://www.cnblogs.com/XACOOL/p/5589821.html
Copyright © 2011-2022 走看看