我在由数据集填充的表单上有一个 DataGridView。除了一件事,一切都有效。在第一列中,我有 ID 号。用户单击某行,该列中的 ID 号将从数据库中删除。除最后一行外,每个 id 都正确获取 - 如您所知,它是一个新行,因为用户可以在数据库中创建新记录。无论如何,如果用户犯了一个错误并选择了这一行,下面显示的代码会以某种方式从上一行获取 ID 号。我不知道如何避免这个问题。我使用以下代码获取它:
dgv.CurrentRow.Cells(0).Value
编辑:我添加了用于更好地了解情况的代码:
表单加载事件:
Private Sub FrmNewRodzaj_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim del As DelegateGridRefresh = New DelegateGridRefresh(AddressOf FillGrid)
Dim del2 As DelegateGridRefresh = New DelegateGridRefresh(AddressOf AlignGrid)
del = [Delegate].Combine(del, del2)
AddHandler EventGridRefresh, AddressOf del.Invoke
del.Invoke()
End Sub
填充网格方法:
Private Sub FillGrid()
NewRodzaj = New MachineRodzaj()
dgv.DataSource = NewRodzaj.GetRodzaje.Tables(0)
End Sub
GetRodzaje method:
Public Function GetRodzaje() As DataSet
Dim con As New SqlConnection(strcon)
Dim cmd As New SqlCommand("Select * from tbMachRodzajList", con)
con.Open()
GetRodzajeDataAdapter = New SqlDataAdapter(cmd)
GetRodzajeDataAdapter.Fill(GetRodzajeDataSet, "trial1")
Return GetRodzajeDataSet
End Function
对齐网格方法:
Private Sub AlignGrid()
dgv.RowsDefaultCellStyle.BackColor = Color.SkyBlue 'LightSkyBlue
dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.LightBlue
dgv.ColumnHeadersBorderStyle = DataGridViewCellBorderStyle.None
dgv.AllowUserToAddRows = True
dgv.DefaultCellStyle.Font = New Font("Tahoma", 9)
Me.dgv.DefaultCellStyle.SelectionForeColor = Color.Red
Me.dgv.DefaultCellStyle.SelectionBackColor = Color.Yellow
Me.dgv.RowHeadersVisible = False
Dim column0 As DataGridViewColumn = dgv.Columns(0)
column0.Visible = False
Dim ColNazwa As DataGridViewColumn = dgv.Columns(1)
ColNazwa.HeaderText = "Nazwa"
ColNazwa.[ReadOnly] = False
Dim ColOpis As DataGridViewColumn = dgv.Columns(2)
ColOpis.HeaderText = "Opis"
ColOpis.[ReadOnly] = False
Dim column3 As DataGridViewColumn = dgv.Columns(3)
column3.Visible = False
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
Dim dgvColumnHeaderStyle As New DataGridViewCellStyle()
dgvColumnHeaderStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
dgv.ColumnHeadersDefaultCellStyle = dgvColumnHeaderStyle
'You cannot change the column and row header colours without disabling visual styles:
dgv.EnableHeadersVisualStyles = False
' Set the row and column header styles.
dgv.ColumnHeadersDefaultCellStyle.ForeColor = Color.WhiteSmoke
dgv.ColumnHeadersDefaultCellStyle.BackColor = Color.Firebrick
dgv.ColumnHeadersDefaultCellStyle.Font = New Font("Tahoma", 14)
End Sub
保存/更新数据的按钮方法:
Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnZapisz.Click
NewRodzaj.MakeChanges()
RaiseEvent EventGridRefresh()
End Sub
修改方法:
Public Sub MakeChanges()
MachineRodzajDAO.GetRodzajeMakeChanges()
End Sub
GetRodzajeMakeChanges 方法:
Public Sub GetRodzajeMakeChanges()
If Not GetRodzajeDataSet.HasChanges Then
MessageBox.Show("No changes no need to update", "Informacja", MessageBoxButtons.OK, MessageBoxIcon.Information)
Else
Dim cmdbuilder As New SqlCommandBuilder(GetRodzajeDataAdapter)
Dim i As Integer
Try
i = GetRodzajeDataAdapter.Update(GetRodzajeDataSet, "trial1")
MsgBox("Updated" & i & " records")
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
End Sub
所以缺少一个,我正在与之抗争的是用户选择要从数据库中删除的行并单击删除按钮后的删除按钮,如果他选择 newRow,则应该会出现消息 - 您选择了错误的行。id值放在列(0(中,当我使用CurrentRow.Cells(0(时。如果用户单击 newRow,则 id 是行前的 id,因此我不能只是检查值是否为无,并且 IsNewRow 不起作用。
Private Sub btnDelete_Click(sender As System.Object, e As System.EventArgs) Handles btnUsun.Click
End Sub
希望现在足够清楚
实际上是NewRow工作得很好
把它放在事件 dgv 上。单元格点击示例
If dgv.CurrentRow.IsNewRow Then
'Cancel your code
Else
'Execute your code
End If
编辑:然后像检查行索引一样
dgv.NewRowIndex
将永远是新行索引
因此,如果用户单击一行或 NewRow,该行将成为当前行
然后你可以检查类似的东西
If dgv.CurrentRow.Index = dgv.NewRowIndex - 1 Then
'User clicked NewRow but CurrentRow is the one before the NewRow
End If
编辑:实际上这很简单
但你必须知道你的DGV上发生了什么。
1.用户单击NewRow
,ClickedCell
刚刚被选中,然后你得到正确的 RowIndex
dgv.SelectedCells(0).RowIndex
这与
BenutzerDataGridView.NewRowIndex
CurrentRow.Index
将始终为 -1
- 用户单击
NewRow
并开始键入。现在NewRow
向下移动一行,正在编辑的行变为CurrentRow
。
这就是为什么我添加了上述内容以始终确保它不是NewRow
If dgv.CurrentRow.Index = dgv.NewRowIndex - 1 Then
这实际上应该足以做你想做的事^^
最后编辑:
If dgv.SelectedCells(0).RowIndex = dgv.NewRowIndex Then
MsgBox("wrong row")
End If
或者这样
If dgv.Rows(dgv.SelectedCells(0).RowIndex).IsNewRow Then
MsgBox("wrong row")
End If
我很高兴你把它解决了^^