在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列名作为行标题。
发现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