Visual Basic Datagridview单元格事件,然后按键盘输入

时间:2016-07-12 09:03:48

标签: vb.net

我有一个问题,如果可能的话,我不明白如何解决它。我有一个datagridview,我希望有一个事件然后进入一个单元格文本我输入新行(键盘输入),我现在有一个事件" grid_keydown"或" grid_keypress",但这两个工作只有我选择datagridview完整行而不是每个datagridview单元格。有一个解决方案来配置datagridview属性来处理这个2事件也为每个datagridview单元格编辑?非常感谢你

enter image description here

1 个答案:

答案 0 :(得分:1)

所以我终于找到了解决方案来实现您的目标。坏消息:这比我想象的要复杂得多(而且应该是imho)。无论如何,您需要以下步骤:

  1. 创建自定义DataGridViewTextBoxEditingControl课程 它是覆盖Enter键接受Cell中的更改并切换到下一行的默认行为。它还会在当前单元格文本中附加NewLine

    Public Class MyDatagridTextBoxEditControl
       Inherits DataGridViewTextBoxEditingControl
    
      Public Overrides Function EditingControlWantsInputKey(keyData As Keys, dataGridViewWantsInputKey As Boolean) As Boolean
         If dataGridViewWantsInputKey AndAlso keyData = Keys.Enter Then
             AppendText(Environment.NewLine)
             Return MyBase.EditingControlWantsInputKey(keyData, False)
        End If 
        Return MyBase.EditingControlWantsInputKey(keyData, dataGridViewWantsInputKey)
      End Function
    End Class
    
  2. 创建自定义DataGridViewTextBoxCell课程 它是设置和使用以前创建的DataGridViewTextBoxEditingControl类型。

    Public Class MyDatagridTextBoxCell
       Inherits DataGridViewTextBoxCell
    
       Public Overrides ReadOnly Property EditType As Type
          Get
              Return GetType(MyDatagridTextBoxEditControl)
          End Get
       End Property
    End Class
    
  3. 将数据绑定在DataGridView
    对于我的例子,我将代码放入Form的构造函数中(之后 InitializeComponent()),但您也可以将其放入Load 事件

    'Assume [Beschreibung] is column no. 5
    DataGridView1.Columns.Item(4).CellTemplate = New MyDatagridTextBoxCell()
    
  4. (根据您放置此代码的位置,您可能需要调用DataGridVie1.Refresh())。

    备注:此代码将导致您无法再使用Enter键接受文本单元格中更改的值。但是,当您在单元格外单击鼠标时,它将接受输入。 Esc按键仍会恢复文本更改。 您可以将代码添加到EditingControlWantsInputKey中,该代码会处理另一个密钥,例如Enter,例如Insert或类似的。

    如果没有此代码,您可以使用组合键Shift + Enter

    实现相同的行为