选择 DataGridView 中的最后一行时,将返回上一行的值,而不是所选行的值

  • 本文关键字:一行 DataGridView 最后 选择 返回 vb.net
  • 更新时间 :
  • 英文 :


我在由数据集填充的表单上有一个 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.用户单击NewRowClickedCell刚刚被选中,然后你得到正确的 RowIndex

dgv.SelectedCells(0).RowIndex

这与

BenutzerDataGridView.NewRowIndex

CurrentRow.Index将始终为 -1

  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

我很高兴你把它解决了^^

最新更新