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再一边堆积到一起了
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再一边堆积到一起了
我从前做过一个这方面的程序。
你可以看看下面这两个总结,也许对你有用:
http://blog.csdn.net/hejialin666/archive/2009/12/19/5036871.aspx
http://blog.csdn.net/hejialin666/archive/2009/12/19/5036762.aspx