DataGridView keydown事件不工作在C#
当我编辑单元格内的文本时,DataGridView的keydown事件不起作用。DataGridView keydown事件不工作在C#
我指定快捷Alt + S键保存数据,它的工作原理时,细胞不处于编辑模式,但是如果是在下面的代码编辑模式下无法正常工作
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == (Keys.Alt | Keys.S))
{
//save data
}
}
每当单元处于编辑模式,其托管的控件正在接收KeyDown
事件,而不是包含它的父代DataGridView
。这就是您的键盘快捷键在单元格未处于编辑模式时(即使它被选中)正在工作的原因,因为您的DataGridView
控件本身会收到KeyDown
事件。但是,当处于编辑模式时,单元格包含的编辑控件正在接收事件,并且没有发生任何事情,因为它没有附加自定义处理程序例程。
我已经花了太多的时间调整的标准DataGridView
控制处理编辑提交我想它的方式,我发现要解决这种现象的最简单的方法是通过继承已有的DataGridView
控制和覆盖其ProcessCmdKey
function。无论您在此处输入的自定义代码是否在DataGridView
顶部按下某个键时都会运行,而不管它是否处于编辑模式。
例如,你可以做这样的事情:
class MyDataGridView : System.Windows.Forms.DataGridView
{
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
{
MessageBox.Show("Key Press Detected");
if ((keyData == (Keys.Alt | Keys.S)))
{
//Save data
}
return base.ProcessCmdKey(ref msg, keyData);
}
}
另请参阅相关的,虽然有点老,文章:How to trap keystrokes in controls by using Visual C#
好建议。 WM_KEYDOWN测试不是必须的顺便说一句。 – 2010-11-26 15:42:10
非常感谢,您的建议 – 2010-11-26 16:08:29
@Hans Passant:我同意这不是必要的,我通常不会包含它。在我看到我所链接的文章将其推荐为“良好实践”后,我回过头去添加它。 – 2010-11-26 23:39:59
做的另一种方法是使用EditingControlShowing事件重定向事件处理如下自定义事件处理程序:
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control is DataGridViewTextBoxEditingControl tb)
{
tb.KeyDown -= dataGridView1_KeyDown;
tb.KeyDown += dataGridView1_KeyDown;
}
}
//then in your keydown event handler, execute your code
private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == (Keys.Alt | Keys.S))
{
//save data
}
}
使用PreviewKeyDown
事件
private void dataGridView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
}
我只是尝试了更简单的方法如下:
- 设置窗体的
KeyPreview
属性true
。 - 而不是在网格上捕获KeyDown事件,捕获窗体上的KeyDown事件。
如下代码:
Private Sub form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
If grd.Focused Then
'Do your work
End If
End Sub
这是事实,EditingControlShowing可以帮助,但如果你要赶上Enter键。在这种情况下,应该使用以下方法:
private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (e.Control is DataGridViewTextBoxEditingControl)
{
DataGridViewTextBoxEditingControl tb = e.Control as DataGridViewTextBoxEditingControl;
tb.KeyDown -= dataGridView_KeyDown;
tb.PreviewKeyDown -= dataGridView_PreviewKeyDown;
tb.KeyDown += dataGridView_KeyDown;
tb.PreviewKeyDown += dataGridView_PreviewKeyDown;
}
}
void dataGridView_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyData == Keys.Enter)
{
<your logic goes here>
}
}
它没有被触发,或者代码执行不正确?你能解释一下你在做什么吗? – Rox 2010-11-26 10:23:35
部分在这个链接的答案是有点相关 - http://*.com/questions/686309/datagridview-change-edit-control-size-while-editing/23703744 – barlop 2016-05-29 03:50:29