C# DataGridView 右键选中行
DataGridView 我设定的是整行选择,即dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;并且显示了RowHeader,所以添加了两个事件,分别是CellMouseClick和RowHeaderMouseClick;
1 void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 2 { 3 if (e.Button == System.Windows.Forms.MouseButtons.Right && e.RowIndex > -1 && e.ColumnIndex > -1) 4 { 5 //取消当前选中行的选中状态 6 (sender as DataGridView).CurrentRow.Selected = false; 7 //右键单击的行设定为选中状态 8 (sender as DataGridView).Rows[e.RowIndex].Selected = true ; 9 //将右键单击的单元格设定为当前单元格 10 (sender as DataGridView).CurrentCell = (sender as DataGridView).Rows[e.RowIndex].Cells[e.ColumnIndex]; 11 } 12 }
代码中对鼠标按键进行了右键过滤,并且右键单击的行和列必须大于0,防止是在其它区域,首先取消当前行的选中状态,然后将右键单击的行设定为选中状态,切记,设置当前单元格很重要,如果不设置的话当你在次右键单击另一行的时候,上次右键单击的行的取消状态不会被清除,因为那一行不是当前行,或者也可以使用ClearSelection()取消所有选中再对右键单击的行进行选择,这个主要看后续的功能需要什么。
在做完这个之后,发现我在右键单击行头的时候,并不能完成这个功能,但是左键是有这个功能的,于是添加了RowHeaderMouseClick事件,如果不显示RowHeader则可以省了这个事件
1 void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 2 { 3 if (e.Button == System.Windows.Forms.MouseButtons.Right) 4 { 5 (sender as DataGridView).CurrentRow.Selected = false; 6 (sender as DataGridView).Rows[e.RowIndex].Selected = true; 7 (sender as DataGridView).CurrentCell = (sender as DataGridView).Rows[e.RowIndex].Cells[0]; 8 } 9 }
这个事件里的代码与单元格鼠标单击事件类似,只是设置当前单元格时使用了索引0,单击行头时
DataGridViewCellMouseEventArgs参数
e.ColumnIndex=-1,
对了,在第一段代码设置当前单元格是为保证在有水平滚动条滚动到后面时,右键选中行时不会造成滚动条的滚动
如果只是要求右键选中一行的话,那么上面两个事件内的代码留下最后一行设定当前单元格就好:
(sender as DataGridView).CurrentCell = (sender as DataGridView).Rows[e.RowIndex].Cells[0];
但一般情况下,我们右键单击的话都会有一些后续操作,如弹出快捷菜单,看如下代码:
1 /// <summary> 2 /// 单元格鼠标单击事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) 7 { 8 if (e.Button == System.Windows.Forms.MouseButtons.Right && e.RowIndex > -1 && e.ColumnIndex > -1) 9 { 10 if ((sender as DataGridView).Rows[e.RowIndex].Selected == false) 11 { 12 //取消当前选中行的选中状态 13 (sender as DataGridView).CurrentRow.Selected = false; 14 //右键单击的行设定为选中状态 15 (sender as DataGridView).Rows[e.RowIndex].Selected = true; 16 //将右键单击的单元格设定为当前单元格 17 (sender as DataGridView).CurrentCell = (sender as DataGridView).Rows[e.RowIndex].Cells[e.ColumnIndex]; 18 } 19 if ((sender as DataGridView).SelectedRows.Count > 0) 20 { 21 ItemscontextMenu.Show(MousePosition); 22 } 23 } 24 }
这段代码的作用就是如果右键单击的行已被选中,则不做任何选择操作,只是弹出快捷菜单,如果没有选中,则选中,然后弹出快捷菜单。