怎么将 DataGridViewCheckBoxColumn 的列头设置为checkbox

qibing_08 2008-12-08 03:27:19
代码类似于下面:
DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn();
col.HeaderText = "CheckBox";
我想把HeaderText位置的换成一个checkbox控件 有没有什么办法?
...全文
707 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
坐看昀起 2010-02-25
  • 打赏
  • 举报
回复
引用 9 楼 whchina 的回复:
只能通过重写datagridview的列头来实现了。查了下,可参考。

http://www.cnblogs.com/gossip/archive/2008/11/22/1338868.html


灰常有用!
qibing_08 2008-12-09
  • 打赏
  • 举报
回复
谢谢楼上各位了 学习中
我也只是用.NET做了一个java webservice 客户端的测试
昨天没办法 加了一个按钮 在测试需要的上功能实现了全选 就OK 了
江城老温 2008-12-09
  • 打赏
  • 举报
回复
测试了下,顺手把代码给你贴出来吧。

//datagridviewCheckboxHeaderCell.cs,跟你的窗体类放同一个工程目录下吧。


using System;
using System.Drawing;
using System.Windows.Forms;

//定义触发单击事件的委托
public delegate void datagridviewcheckboxHeaderEventHander(object sender, datagridviewCheckboxHeaderEventArgs e);

/// <summary>
/// 定义包含列头checkbox选择状态的参数类
/// </summary>
class datagridviewCheckboxHeaderEventArgs : EventArgs
{
private bool checkedState = false;

public bool CheckedState
{
get { return checkedState; }
set { checkedState = value; }
}
}

/// <summary>
/// 定义继承于DataGridViewColumnHeaderCell的类,用于绘制checkbox,定义checkbox鼠标单击事件
/// </summary>
class datagridviewCheckboxHeaderCell : DataGridViewColumnHeaderCell
{
Point checkBoxLocation;
Size checkBoxSize;
bool _checked = false;
Point _cellLocation = new Point();
System.Windows.Forms.VisualStyles.CheckBoxState _cbState =
System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal;
public event datagridviewcheckboxHeaderEventHander OnCheckBoxClicked;

//绘制列头checkbox
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)
{
base.Paint(graphics, clipBounds, cellBounds, rowIndex,
dataGridViewElementState, value,
formattedValue, errorText, cellStyle,
advancedBorderStyle, paintParts);
Point p = new Point();
Size s = CheckBoxRenderer.GetGlyphSize(graphics,
System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
p.X = cellBounds.Location.X +
(cellBounds.Width / 2) - (s.Width / 2) - 1;//列头checkbox的X坐标
p.Y = cellBounds.Location.Y +
(cellBounds.Height / 2) - (s.Height / 2);//列头checkbox的Y坐标
_cellLocation = cellBounds.Location;
checkBoxLocation = p;
checkBoxSize = s;
if (_checked)
_cbState = System.Windows.Forms.VisualStyles.
CheckBoxState.CheckedNormal;
else
_cbState = System.Windows.Forms.VisualStyles.
CheckBoxState.UncheckedNormal;
CheckBoxRenderer.DrawCheckBox
(graphics, checkBoxLocation, _cbState);
}

/// <summary>
/// 点击列头checkbox单击事件
/// </summary>
protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
{
Point p = new Point(e.X + _cellLocation.X, e.Y + _cellLocation.Y);
if (p.X >= checkBoxLocation.X && p.X <=
checkBoxLocation.X + checkBoxSize.Width
&& p.Y >= checkBoxLocation.Y && p.Y <=
checkBoxLocation.Y + checkBoxSize.Height)
{
_checked = !_checked;


//获取列头checkbox的选择状态
datagridviewCheckboxHeaderEventArgs ex = new datagridviewCheckboxHeaderEventArgs();
ex.CheckedState = _checked;

object sender = new object();//此处不代表选择的列头checkbox,只是作为参数传递。应该列头checkbox是绘制出来的,无法获得它的实例

if (OnCheckBoxClicked != null)
{
OnCheckBoxClicked(sender, ex);//触发单击事件
this.DataGridView.InvalidateCell(this);
}
}
base.OnMouseClick(e);
}
}



调用方法,在你的窗体load方法里添加如下代码:

datagridviewCheckboxHeaderCell ch = new datagridviewCheckboxHeaderCell();
//ch.OnCheckBoxClicked += new datagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);//关联单击事件
//假设第三列为DataGridViewCheckBoxColumn
DataGridViewCheckBoxColumn checkboxCol = this.dataGridView1.Columns[2] as DataGridViewCheckBoxColumn;
checkboxCol.HeaderCell = ch;
checkboxCol.HeaderCell.Value = string.Empty;//消除列头checkbox旁出现的文字
江城老温 2008-12-09
  • 打赏
  • 举报
回复
只能通过重写datagridview的列头来实现了。查了下,可参考。

http://www.cnblogs.com/gossip/archive/2008/11/22/1338868.html
江城老温 2008-12-09
  • 打赏
  • 举报
回复
DataGridView在winfrom里用的较多。在winfrom里可以修改列头模板吗?晕鸟。
bao_yan 2008-12-09
  • 打赏
  • 举报
回复


可以的!

我的就是这样做的!

<asp:TemplateField HeaderText="全选">
//这是表头的CheckBox
<HeaderTemplate>
<asp:CheckBox ID="chkAll" runat="server" onclick="selectAll(this)" />
</HeaderTemplate>
//这是ITEM列的CheckBox
<ItemTemplate>
<asp:CheckBox ID="chkSelect" runat="server" />
</ItemTemplate>
</asp:TemplateField>

accpyy 2008-12-09
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20070921/16/a2ef1e74-eeba-47aa-b753-3414d6a1e643.html
OKILOVE 2008-12-09
  • 打赏
  • 举报
回复
在GridView checkbox列的下面加一个全选checkbox吧,表头估计比较困难。
qibing_08 2008-12-08
  • 打赏
  • 举报
回复
如果是你们做全选的话 你们是怎么做呢?
列头上不能加一个checkbox的控件吗
我是第一次用.net 不是很了解
希望各位能帮忙!!
qibing_08 2008-12-08
  • 打赏
  • 举报
回复
谢谢 楼上
我是需要把一个xml 放在DataGridViewRow 第一列的checkbox是
DataGridViewCheckBoxColumn col = new DataGridViewCheckBoxColumn();
col.HeaderText = "CheckBox";
this.ItemView.Columns.Add(col);
后来加进去的
江城老温 2008-12-08
  • 打赏
  • 举报
回复
很有想象力啊。似乎不行。要么继承个控件。
journeydj 2008-12-08
  • 打赏
  • 举报
回复
不清楚,好像不行。
不过可以重绘第一行作为列头。

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧