如何在DataGridViewCell中处理KeyEvents?

是否存在DataGridViewCellKeydown事件?
我想要做的是当用户在特定单元格中键入内容时,他可以按F1获取该特定列的帮助。 一些表格将弹出…

它是什么事件?

我在一个论坛中找到了这个代码,它确实有效。

 private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { DataGridViewTextBoxEditingControl tb =(DataGridViewTextBoxEditingControl)e.Control; tb.KeyPress += new KeyPressEventHandler(dataGridViewTextBox_KeyPress); e.Control.KeyPress += new KeyPressEventHandler(dataGridViewTextBox_KeyPress); } private void dataGridViewTextBox_KeyPress(object sender, KeyPressEventArgs e) { //when i press enter,bellow code never run? if (e.KeyChar==(char)Keys.Enter) { MessageBox.Show("You press Enter"); } } 

DataGridViewCell没有任何事件,但您可以在DataGridView本身上侦听KeyDown事件,然后查看选择的单元格:

 public void dataGridView_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.F1) { var selectedCell = dataGridView.SelectedCells[0]; // do something with selectedCell... } } 

当用户键入单元格时,它实际上是键入放置在单元格内的控件以进行编辑。 例如,字符串列类型实际上将创建一个TextBox,以便在单元格内部供用户输入。 因此,您需要实际挂接到编辑发生时放置在单元格内的TextBox的KeyDown事件。

我知道这是一个老问题,但我相信我已经改进了最高投票的答案。

  IDataGridViewEditingControl _iDataGridViewEditingControl; private void SlotTimesDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { if (_iDataGridViewEditingControl is DataGridViewComboBoxEditingControl) { DataGridViewComboBoxEditingControl iDataGridViewEditingControl = _iDataGridViewEditingControl as DataGridViewComboBoxEditingControl; iDataGridViewEditingControl.KeyPress -= SlotTimesDGV_EditingControlShowing_KeyPress; } if (e.Control is DataGridViewComboBoxEditingControl) { DataGridViewComboBoxEditingControl iDataGridViewEditingControl = e.Control as DataGridViewComboBoxEditingControl; iDataGridViewEditingControl.KeyPress += SlotTimesDGV_EditingControlShowing_KeyPress; _iDataGridViewEditingControl = iDataGridViewEditingControl; } } private void SlotTimesDGV_EditingControlShowing_KeyPress(object sender, KeyPressEventArgs e) { MessageBox.Show(""); } 

通过拥有IDataGridViewEditingControl的实例变量,您可以删除KeyPress事件,该事件在移动单元格时会导致重复调用,并且您的事件不仅限于一种类型的单元格。

另一个解决方案是

 private void grdDetalle_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { // Sólo queremos esta funcionalidad para determinadas columnas Clave y Nombre if ((grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colClaveArticulo") || (grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colNombre")) { /// Workarround para que estando editando en las columnas del grid Clave y Nombre /// podamos detectar cuando se dio F4 para lanzar el dialogo de busqueda del /// articulo. e.Control.KeyDown += new KeyEventHandler(dataGridViewTextBox_KeyDown); e.Control.Leave += new EventHandler(dataGridViewTextBox_Leave); } } private void dataGridViewTextBox_Leave(object sender, EventArgs e) { if ((grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colClaveArticulo") || (grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colNombre")) { try { (sender as DataGridViewTextBoxEditingControl).KeyDown -= new KeyEventHandler(dataGridViewTextBox_KeyDown); } catch (Exception ex) { } } } private void dataGridViewTextBox_KeyDown(object sender, KeyEventArgs e) { // F4 Pressed if ((grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colClaveArticulo") || (grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colNombre")) { if (e.KeyCode == Keys.F4) // 115 { MessageBox.Show("Oprimieron F4"); e.Handled = true; e.SuppressKeyPress = true; } } }