是否有Keydown
DataGridViewCell
的事件?
我想要做的是,當用戶在特定的單元格中鍵入內容時,他可以按F1獲得該特定列的幫助。並且有些窗體會彈出...如何處理DataGridViewCell中的KeyEvent?
它是什麼事件?
是否有Keydown
DataGridViewCell
的事件?
我想要做的是,當用戶在特定的單元格中鍵入內容時,他可以按F1獲得該特定列的幫助。並且有些窗體會彈出...如何處理DataGridViewCell中的KeyEvent?
它是什麼事件?
我在論壇發現了this的代碼,它的工作原理。
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...
}
}
ok先生...我會嘗試。謝謝 – yonan2236 2010-09-13 02:22:18
來自編輯控件的鍵盤事件不會針對DGV觸發,上述代碼無法在編輯模式下處理關鍵事件。 – 2017-03-12 18:52:29
當用戶鍵入到單元格,它實際上是輸入放置在單元格內的控件以進行編輯。例如,一個字符串列類型實際上會創建一個文本框供用戶輸入。所以,當編輯發生時,您需要實際掛鉤放置在單元格內的TextBox的KeyDown事件。
另一種解決方案是
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;
}
}
}
我建議使用英文變量名稱和註釋修改代碼,這樣人們可以更容易地理解你在做什麼。 – user1071777 2014-12-12 20:12:40
我知道這是一個老問題,但我相信我已經在好轉前投答案。
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事件細胞周圍移動,你的事件不僅限於一種類型的細胞時,將導致重複呼叫。
爲什麼添加兩次? – 2013-05-31 13:59:20