using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;
using System.Text;namespace ZLControlLibrary
{
    public delegate void HeaderCellComboxSelectIndexChange(object sender,HeaderCmbValueChangeEventArgs h);
    public class DGVColumnHederCell: DataGridViewColumnHeaderCell
    {
        public event HeaderCellComboxSelectIndexChange OnHeaderCMBVauleChange;
        
        private System.Windows.Forms.ComboBox _headerCombox = new ComboBox();        public System.Windows.Forms.ComboBox HeaderCombox
        {
            get { return _headerCombox; }
            set { _headerCombox = value; }
        }        private static int nameCount=0;
        private int myCounts=0;        public DGVColumnHederCell()
        {
            nameCount++;
        }        protected override void Paint(System.Drawing.Graphics graphics, System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds, int rowIndex, DataGridViewElementStates dataGridViewElementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            cellStyle.Alignment = DataGridViewContentAlignment.TopCenter;
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, dataGridViewElementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
            Rectangle cmbLocation = new Rectangle();
            cmbLocation.X = cellBounds.X;
            cmbLocation.Y = cellBounds.Y + cellBounds.Height/2;
            cmbLocation.Width = cellBounds.Width - 1;
            cmbLocation.Height = cellBounds.Height / 2;
            _headerCombox.Name = "headerCombox" + nameCount;
            _headerCombox.Bounds = cmbLocation;
            this.DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
            this.DataGridView.ColumnHeadersHeight = 40;
            _headerCombox.DropDownStyle = ComboBoxStyle.DropDownList;
            _headerCombox.SelectedIndexChanged += new EventHandler(_headerCombox_SelectedIndexChanged);
            this.DataGridView.Controls.Add(_headerCombox);
        }        void _headerCombox_SelectedIndexChanged(object sender, EventArgs e)
        {
            myCounts++;
            
            if (OnHeaderCMBVauleChange != null)
            {
                if (myCounts %2 ==1)
                {
                    
                    HeaderCmbValueChangeEventArgs hce = new HeaderCmbValueChangeEventArgs();
                    hce.ColumnIndex = this.ColumnIndex;
                    hce.SelectItem = _headerCombox.SelectedItem;
                    hce.SelectText = _headerCombox.SelectedText;
                    hce.SelectValue = _headerCombox.SelectedValue;
                    hce.SelectIndex = _headerCombox.SelectedIndex;
                    OnHeaderCMBVauleChange(sender, hce);
                }
            }
        }        public override object Clone()
        {
            return base.Clone();
        }
    }    public class HeaderCmbValueChangeEventArgs
    {
        /// <summary>
        /// 当前的列索引
        /// </summary>
        private int _columnIndex;
        
        /// <summary>
        /// 当前的列索引
        /// </summary>
        public int ColumnIndex
        {
            get { return _columnIndex; }
            set { _columnIndex = value; }
        }        
        private string _selectText;
        /// <summary>
        /// 当前用户选择的可编辑文本
        /// </summary>
        public string SelectText
        {
            get { return _selectText; }
            set { _selectText = value; }
        }        private int _selectIndex;        public int SelectIndex
        {
            get { return _selectIndex; }
            set { _selectIndex = value; }
        }        
        private object _selectItem;
        /// <summary>
        /// 当前用户选择的项
        /// </summary>
        public object SelectItem
        {
            get { return _selectItem; }
            set { _selectItem = value; }
        }        private object _selectValue;        /// <summary>
        /// 当前用户选择项的值
        /// </summary>
        public object SelectValue
        {
            get { return _selectValue; }
            set { _selectValue = value; }
        }
    }
}我的DataGridView 中有20列,滚动条移动后Combox再一边堆积到一起了