【问题标题】:Set next CurrentCell on DataGridView在 DataGridView 上设置下一个 CurrentCell
【发布时间】:2015-10-22 21:17:29
【问题描述】:

我有一个三列 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)

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

【问题讨论】:

  • 它与c#有什么关系?为什么要标记 c#?
  • 我对用 C# 编写的答案持开放态度 - 只是扩大了受众范围。再加上 C# 比 VB 人聪明得多... :)
  • 我自我回答了——我改变了方向。如果有人正在寻找积分,当然可以回答关于更改当前单元格的 OP。
  • @rheitzman 此评论主要基于意见,可能会引发热议。 toddelliott.net/2014/03/production/…

标签: c# vb.net winforms datagridview


【解决方案1】:

发现 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2012-12-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多