在 vb.net 中的 datagridview 问题中将 ENTER 键作为 TAB

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18689743/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 14:59:50  来源:igfitidea点击:

ENTER key as TAB in datagridview issue in vb.net

vb.netdatagridview

提问by Matthew

Here is my working code of pressing Enter key to move to another cell like TAB:

这是我按 Enter 键移动到另一个单元格(如 TAB)的工作代码:

Private Sub dvFromAlloc_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dvFromAlloc.KeyDown
    If e.KeyCode = Keys.Enter Then

        Dim colm As Integer = dvFromAlloc.ColumnCount - 1
        Dim row As Integer = dvFromAlloc.RowCount - 1
        Dim currCell As DataGridViewCell = dvFromAlloc.CurrentCell

        If currCell.ColumnIndex = colm Then
            If currCell.RowIndex < row Then
                'gets the next row and the first selected index
                dvFromAlloc.CurrentCell = dvFromAlloc.Item(0, currCell.RowIndex + 1)
            End If
        Else
            'move in next col in the current row
            dvFromAlloc.CurrentCell = dvFromAlloc.Item(currCell.ColumnIndex + 1,  currCell.RowIndex)
        End If

        e.Handled = True
    End If

End Sub

Private Sub dvFromAlloc_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dvFromAlloc.CellEndEdit
    isEdited = True
    iColumnindex = e.ColumnIndex
    irowindex = e.RowIndex
End Sub

Private Sub dvFromAlloc_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dvFromAlloc.SelectionChanged
    If isEdited Then
        isEdited = False
        dvFromAlloc.CurrentCell = dvFromAlloc.Item(iColumnindex + 1, irowindex)
    End If
End Sub

The main problem here is that when I'm in the last row, I have to press enter twice after editing a cell before it moves to another cell, but if I'm in the other rows, I will only press enter once after editing the cell and it will move to the next cell.

这里的主要问题是,当我在最后一行时,我必须在编辑一个单元格后按两次 Enter 才能移动到另一个单元格,但是如果我在其他行中,我只会在编辑后按 Enter 一次单元格,它将移动到下一个单元格。

Thank you for your help

感谢您的帮助

采纳答案by Matthew

This is my edited code in the CellandEdit and SelectionChanged:

这是我在 CellandEdit 和 SelectionChanged 中编辑的代码:

Private Sub dvFromAlloc_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dvFromAlloc.CellEndEdit
    isEdited = True
    iColumnindex = e.ColumnIndex
    irowindex = e.RowIndex

    If dvFromAlloc.CurrentRow.Index = dvFromAlloc.RowCount - 1 Then
        If dvFromAlloc.CurrentCell.ColumnIndex < dvFromAlloc.ColumnCount - 1 Then
            dvFromAlloc.CurrentCell = dvFromAlloc.Item(iColumnindex + 1, irowindex)
        End If
        isEdited = False
    End If

End Sub

In the code above(CellEndEdit), I have a first If statement: If the current row index is equals to the row count(that means I am checking if I am in the last rows) then I will execute the second If statement.

在上面的代码(CellEndEdit)中,我有第一个 If 语句:如果当前行索引等于行数(这意味着我正在检查我是否在最后一行),那么我将执行第二个 If 语句。

The second If statement: if the current column index is less than the column count, then I will move the current cell to the next cell.

第二条If语句:如果当前列索引小于列数,那么我将当前单元格移动到下一个单元格。

Private Sub dvFromAlloc_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dvFromAlloc.SelectionChanged

    If isEdited Then
        If dvFromAlloc.CurrentCell.ColumnIndex < dvFromAlloc.ColumnCount - 1 Then
            dvFromAlloc.CurrentCell = dvFromAlloc.Item(iColumnindex + 1, irowindex)
        Else
            dvFromAlloc.CurrentCell = dvFromAlloc.Item(1, irowindex + 1)
        End If
        isEdited = False

    End If

In the code above(SelectionChanged), I have put an If else statement: If the current cell column index is less than the column count, then I will move to the next cell until I reach the last column. Elseif I am in the last column, then I set the current cell to the column index 1 and increment the row index to 1 so that it will move to the next row.

在上面的代码(SelectionChanged)中,我放置了一个 If else 语句:如果当前单元格列索引小于列数,那么我将移动到下一个单元格,直到到达最后一列。Elseif 我在最后一列,然后我将当前单元格设置为列索引 1 并将行索引增加到 1,以便它移动到下一行。

And also I change the properties of my DGV of the EditMode to:EditonKeystrokeOrF2

我还将 EditMode 的 DGV 的属性更改为:EditonKeystrokeOrF2

This code is perfectly working for me, I do not change code in the keydown event.

这段代码非常适合我,我不会更改 keydown 事件中的代码。