在DataGridView上设置下一个CurrentCell

本文关键字:下一个 CurrentCell 设置 DataGridView | 更新日期: 2023-09-27 18:19:02

我有一个三列DataGridView,我想要一个用户在最后一列输入Tab去下一行,但列1而不是列0。下面的代码得到一个错误System.StackOverflowException

我看到代码在那里如何改变CurrentCell从按钮,但事件(ChangeCurrentCell, CellLeave)似乎容忍改变当前单元格。

Private Sub dgvEngine_CellLeave(sender As Object, e As DataGridViewCellEventArgs) Handles dgvEngine.CellLeave
    If mbLoadEng = True Then Exit Sub
    If e.ColumnIndex = 2 Then
        dgvEngine.CurrentCell = dgvEngine(1, e.RowIndex + 1)
    End If
End Sub

如何从DataGridView事件更改当前单元格?

我并不局限于这种方法-我只是试图跳过第0列,因为用户通过单元格的选项卡。


找到了一个更好的方法来处理我的特定情况-使用Row HeaderCell…

        dgvEngine.Rows(iRow).HeaderCell.Value = col.ColumnName.Substring(1)
后来

        dgvEngine.AutoResizeRowHeadersWidth(
            DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders)

。ColumnName来自DataRow。我所做的基本上是一个转置的网格与DataRow列名作为行标题。

在DataGridView上设置下一个CurrentCell

发现HeaderCell是更好的方法。结果是一个未绑定的网格,其中有两组引擎数据(旧的和新的)并排,行标题设置为字段名。

    mbLoadEng = True
    Dim rowEng As DataRow
    dgvEngine.RowCount = 0
    If dgvEngines.SelectedRows.Count = 0 Then Exit Sub
    Dim sID As String = dgvEngines.SelectedRows(0).Cells(0).Value
    Dim a() As String
    Dim iRow As Integer
    Dim sWhere As String = " WHERE ID=" & sID
    Try
        Dim SQL As String = "SELECT  bYear, bMake, bModel, bSerial_Number, bEquipment_ID, bFuel_Type, bPower_Rating, bCyl, bLoad_Factor, bFuel_Consumption_Factor, "
        SQL &= "   bUnit_Conversion_Factor, bEmission_Category, bEmission_Family, bNOx_Emfac, bROG_Emfac, bPM_Emfac, bAnnual_Usage, bNOX_Emfac_Units, bROG_Emfac_Units, "
        SQL &= "   bPM_Emfac_Units, bAnnual_Usage_Units, bNotes"
        SQL &= " FROM     Engine_Equipment"
        rowEng = Gen.GetDataTable(SQL & sWhere).Rows(0)
        iRow = 0
        For Each col As DataColumn In rowEng.Table.Columns
            a = {rowEng(col).ToString, ""}
            dgvEngine.Rows.Add(a)
            dgvEngine.Rows(iRow).HeaderCell.Value = col.ColumnName.Substring(1)
            iRow += 1
        Next
        Sql = "SELECT  nYear, nMake, nModel, nSerial_Number, nEquipment_ID, nFuel_Type, nPower_Rating, nCyl, nLoad_Factor, "
        Sql &= "  nFuel_Consumption_Factor, nUnit_Conversion_Factor, nEmission_Category, nEmission_Family, nNOx_Emfac, nROG_Emfac, nPM_Emfac, nAnnual_Usage, "
        Sql &= "  nNOX_Emfac_Units, nROG_Emfac_Units, nPM_Emfac_Units, nAnnual_Usage_Units, nNotes"
        Sql &= " FROM     Engine_Equipment"
        rowEng = Gen.GetDataTable(SQL & sWhere).Rows(0)
        iRow = 0
        For Each col As DataColumn In rowEng.Table.Columns
            dgvEngine(1, iRow).Value = rowEng(col).ToString
            iRow += 1
        Next
        dgvEngine.AutoResizeColumns()
        dgvEngine.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders)
        dgvEngine.ClearSelection()
        dgvEngine.Columns(0).ReadOnly = True
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        mbLoadEng = False
    End Try