C# 在DataGridView上设置下一个CurrentCell
我有一个三列DataGridView,我希望最后一列中的用户输入选项卡转到下一行,但转到第1列,而不是第0列。以下代码获取一个错误System.StackOverflowException 我看到关于如何从按钮更改CurrentCell的代码,但是事件ChangeCurrentCell,CellLeave似乎允许更改当前单元格C# 在DataGridView上设置下一个CurrentCell,c#,vb.net,winforms,datagridview,C#,Vb.net,Winforms,Datagridview,我有一个三列DataGridView,我希望最后一列中的用户输入选项卡转到下一行,但转到第1列,而不是第0列。以下代码获取一个错误System.StackOverflowException 我看到关于如何从按钮更改CurrentCell的代码,但是事件ChangeCurrentCell,CellLeave似乎允许更改当前单元格 Private Sub dgvEngine_CellLeave(sender As Object, e As DataGridViewCellEventArgs) Han
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)
后来
col.ColumnName来自数据行。我所做的基本上是一个用DataRow列名作为行标题的转置网格。发现HeaderCell是更好的方法。结果是一个未绑定的网格,两组引擎数据新旧并排,行标题设置为fieldname
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
它与c有什么关系?你为什么给c加标签?我愿意接受一个用c写的答案——这只是扩大了听众的范围。加上C语言的人比VB语言的人聪明多了…:我自我回答——我改变了方向。如果有人在寻找分数,那么改变当前单元格的操作肯定会得到回答。@rheitzman这一评论主要基于观点,可能会引起激烈的争论。
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