想通过单击表头实现 DataGridViewCheckBoxColumn的全选或全不选,当有至少一个checkbox未被选中时,则全部赋值为选中;如原本就是全选中状态,则全部赋值为不选中。
但由于第一行始终是选择状态(蓝色选中状态,但是checkbox并没有勾上),所以对第一行无效。即使给其赋值为true,也没有出现勾,怎么办?任意点击一个checkbox令其勾上后,下面的程序也是对这一个checkbox无效。private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex == -1 && e.ColumnIndex == -1)//单击表头
{
bool checkAll = false;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (dataGridView1.Rows[i].Cells[0].Value == null)//没有给checkBox列激活即选中的情况下,直接获取值.ToString会报错
{
checkAll = false;//checkBox列还未激活,即都还为选中
break;
}
else if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "True")
{
string a = dataGridView1.Rows[i].Cells[0].Value.ToString();
checkAll = true;
}
else if (dataGridView1.Rows[i].Cells[0].Value.ToString() != "True")
{
checkAll = false;//有未被选中的记录,则标记全选为false,跳出循环
break;
} }
if (checkAll == false) //存在未选的记录,则更新为全选
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Cells[0].Value = true;
}
}
else //如果原为全选状态,则更新为全不选
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Cells[0].Value = false;
}
//下面的代码都无法彻底清空行选中状态(不是勾上)
dataGridView1.ClearSelection();
dataGridView1.CurrentCell = null;
// dataGridView1.Rows[0].Selected = false;
}
}
}
但由于第一行始终是选择状态(蓝色选中状态,但是checkbox并没有勾上),所以对第一行无效。即使给其赋值为true,也没有出现勾,怎么办?任意点击一个checkbox令其勾上后,下面的程序也是对这一个checkbox无效。private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.RowIndex == -1 && e.ColumnIndex == -1)//单击表头
{
bool checkAll = false;
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (dataGridView1.Rows[i].Cells[0].Value == null)//没有给checkBox列激活即选中的情况下,直接获取值.ToString会报错
{
checkAll = false;//checkBox列还未激活,即都还为选中
break;
}
else if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "True")
{
string a = dataGridView1.Rows[i].Cells[0].Value.ToString();
checkAll = true;
}
else if (dataGridView1.Rows[i].Cells[0].Value.ToString() != "True")
{
checkAll = false;//有未被选中的记录,则标记全选为false,跳出循环
break;
} }
if (checkAll == false) //存在未选的记录,则更新为全选
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Cells[0].Value = true;
}
}
else //如果原为全选状态,则更新为全不选
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
dataGridView1.Rows[i].Cells[0].Value = false;
}
//下面的代码都无法彻底清空行选中状态(不是勾上)
dataGridView1.ClearSelection();
dataGridView1.CurrentCell = null;
// dataGridView1.Rows[0].Selected = false;
}
}
}
解决方案 »
- C# WINFORM 学习视频?
- 如何给安装项目(C#)设置终止条件
- 一个文本框,如何得到按下任一个键之后文本框内字符串值?(keyPress发生之后,textChange发生之前)
- Wince中的问题
- 比较两个数据库中有什么不相同的地方,将不相同的字段用红色标识出来?
- c#读取数据库中数据的问题~
- 请问如何获得下载进度
- Essential .Net读书笔记(一)
- 如何以表格的形式打印输出dataset中的table?
- Bug报告(about vc#)
- (每最先给出一个答案奖15分)刚刚看到一个笔试题,分享一下:给定一个字符串数字,现在要求这个字符串数组中的每个元素最后两个字符?最多写出几种方法?
- C# 如何实现类似WSASend()的方法。Socket相关。
http://download.csdn.net/detail/qq81867376/4434784
if(Control.XX.GetType().name=="CheckBox")
Object.Items.selected=false;
可能你还有什么属性没有设置,关于某一个获得焦点之类吧,新手仅借鉴
this.dataGridView1.EndEdit();//结束编辑状态,必须要此句另外,datagridview的checkbox列只是单击它,出现小勾,或取消小勾,该单元格的Value不一定相应的是true或者false,所以我还加上了以下的代码。 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0 && e.RowIndex != -1)
{
int rIndex = dataGridView1.CurrentCell.RowIndex;
if (this.dataGridView1.Rows[rIndex].Cells[0].EditedFormattedValue.ToString() == "True")//或者=="False"
{
this.dataGridView1.Rows[rIndex].Cells[0].Value = false;
}
else
{
this.dataGridView1.Rows[rIndex].Cells[0].Value = true;
}
}
}