DataGridView的单击多选,求高手帮忙。谢谢

turboking 2013-03-29 09:53:30
实现的功能就是把鼠标单击单元格做成和按住CTRL单击效果一样。

看了一些别人的做法,两个思路
1、在单击时发送一个ctrl消息。
2、重写单击事件。

两个思路都不会用代码表达,个人很想用第二种方法。
...全文
168 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
turboking 2013-03-29
  • 打赏
  • 举报
回复
感谢tanghuawei提供的网页连接,第三种方法我想过,不过觉得浪费资源。已经找到解决办法,结贴。 ---------------------------------------------------------------------------------------- 通过继承,重写鼠标单击事件。 ---------------------------------------------------------------------------------------- 记得添加using System.Windows.Forms引用 class MyDataGridView : DataGridView { protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e) { if (e.ColumnIndex < 3 || e.RowIndex < 0) return; this.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = !this.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected; } protected override void OnCellMouseClick(DataGridViewCellMouseEventArgs e) { //base.OnCellMouseClick(e); } }
tanghuawei 2013-03-29
  • 打赏
  • 举报
回复
纠正一下,Dictionay<Point,bool>这样好些,Point为单元格行列索引,bool为是否选中
tanghuawei 2013-03-29
  • 打赏
  • 举报
回复
其实用代码实现也挺简单,给你个思路,设一个全局变量Dictionay<int,int>这个字典集合存你单击选中的单元格,分别为单元格的行列索引,第一次单击则在添加,第二次则删除,在单击事件里判断是否包含该单元格就行了,包含则selected = false,反之亦然
turboking 2013-03-29
  • 打赏
  • 举报
回复
这个是我个人用的办法,通过改变背景颜色,但是会和点击的时候会和自带的单击事件冲突,不是我想要的方法。 希望有高手能帮忙提示怎么重写单击事件。 private void dataGridViewData_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex < 3 || e.RowIndex < 0) return; if (dataGridViewData.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor != Color.Red) { // 单击改变行背景色和字体颜色 dataGridViewData.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.Red;; } else { dataGridViewData.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.White; }
tanghuawei 2013-03-29
  • 打赏
  • 举报
回复
参照这里写,可以将SelectedRows改为SelectedCells,你试试,我没测试过:http://stackoverflow.com/questions/3915745/select-multiple-rows-without-pressing-control-key
turboking 2013-03-29
  • 打赏
  • 举报
回复
tanghuawei补充说明很对,就是要这 还需注意单击第一次选中,单击第二次取消选中
turboking 2013-03-29
  • 打赏
  • 举报
回复
感谢tanghuawei 可是该怎么编码呢,查了好久的资料,找不到比较清晰的方法。 好像有人说过用datagridvew生成派生类,用override 重写,不知道具体怎么实现。
turboking 2013-03-29
  • 打赏
  • 举报
回复
感谢 gxingmin 不过我是多选单元格,不是多选行。这样设置是整行的吧?
tanghuawei 2013-03-29
  • 打赏
  • 举报
回复
恩,建议在单击事件里做文章,还需注意单击第一次选中,单击第二次取消选中
gxingmin 2013-03-29
  • 打赏
  • 举报
回复
1的思路不好 在单击事件里写吧,单击时判断是否currentRow!=null,设置currentRow为选中状态

110,538

社区成员

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

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

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