在我的 DataGridView 中,我使一个单元格处于活动状态
dgw.CurrentCell = dgw.Rows[e.RowIndex].Cells["ColumnHeader"];
这样,用户只需按任意键即可直接在单元格中开始输入。当第一个键是加号时,我想删除单元格中的文本。
如何捕捉按键按下事件?dgw_KeyDown 不起作用,因为该事件是针对 DataGridView 本身的,但在这种情况下它不会触发,因为单元格处于焦点。
在我的 DataGridView 中,我使一个单元格处于活动状态
dgw.CurrentCell = dgw.Rows[e.RowIndex].Cells["ColumnHeader"];
这样,用户只需按任意键即可直接在单元格中开始输入。当第一个键是加号时,我想删除单元格中的文本。
如何捕捉按键按下事件?dgw_KeyDown 不起作用,因为该事件是针对 DataGridView 本身的,但在这种情况下它不会触发,因为单元格处于焦点。
你不是第一个问这个问题的人,这就是我发现的。
您无法捕获单元格内发生的事情,因为您尝试捕获的事件与 DataGridView 无关。当一个单元格获得焦点时,一个 DataGridViewTextBoxEditingControl 封装了选定的单元格,并且它就是您想要的事件。TextChanged 事件。结合 DataGridView 的 EditingControllShowing 事件,您可以捕获用户在键入时输入的文本。
Private Sub DataGridView1_EditingControlShowing( sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
AddHandler e.Control.TextChanged, AddressOf CellTextChanged
End Sub
private sub cellTextChanged(sender as object, e as EventArgs)
dim textCtrl as DataGridViewTextBoxEditingControl = DirectCast(sender, DataGridViewTextBoxEditingControl)
console.WriteLine(textCtrl.Text)
end sub
当您离开单元格时,DataGridViewTextBoxEditingControl 或 dgvtbec 将被清理,因此您无需担心任何额外的问题!
等待!我想使用 KeyDown 事件,就像我的问题一样。你为什么不使用它?当您使用 KeyDown 事件时,该事件将在您按下任意键时引发。这并不意味着它会在您的单元格中的输入发生更改后提高它。这意味着,如果我们在一个空单元格上使用 KeyDown 事件,我们仍然会看到该单元格没有文本,而不是在使用 TextChanged 事件时找到我们输入的任何文本。
相关发现(链接):
网格没有 TextChanged 事件。您没有在网格本身中编辑任何内容。当您开始编辑会话时,单元格的适当类型的新控件或现有控件将嵌入到单元格中,您可以在其中编辑数据。这就是为什么在网格中没有引发任何事件:因为在您离开单元格之前,网格中没有任何变化,编辑会话结束并且新值被推送到单元格。