1

我为 datagridview 上的每一行创建了一个命令按钮。


datagridview 行按钮


代码工作正常。

    Private Sub dgv_employees_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_employees.CellClick
    'If dgv_employees.Columns(e.ColumnIndex).HeaderText = "Edit" Then
    If e.ColumnIndex = 16 Then
        'dgv_employees.Columns(16).SortMode = DataGridViewColumnSortMode.NotSortable
        Dim constr As String = "Data Source=CARSON-PC;Initial Catalog=payroll;Integrated Security=True"
        Dim row As DataGridViewRow = dgv_employees.Rows(e.RowIndex)
        Dim ds As New DataSet()

        If MessageBox.Show(String.Format("Do you want to delete ID: {0}", row.Cells("empNum").Value), "Confirmation", MessageBoxButtons.YesNo) = DialogResult.Yes Then
            Using con As New SqlConnection(constr)
                Using cmd As New SqlCommand("DELETE FROM [dbo].[emp_personal] WHERE empNum = @empNum", con)
                    cmd.CommandType = CommandType.Text
                    cmd.Parameters.AddWithValue("@empNum", row.Cells("empNum").Value)
                    con.Open()
                    cmd.ExecuteNonQuery()
                    con.Close()
                End Using
            End Using

            Me.BindGrid()
        End If

    End If

End Sub

但是,每当我单击列标题时,都会出现错误。

我怎样才能解决这个问题?


错误

4

2 回答 2

0

我认为问题是由于排序尝试引起的,我将使用以下代码禁用对那些DataGridViewButtonColumns.

 DataGridView.Columns.Item(<columnIndex or "Name">).SortMode = DataGridViewColumnSortMode.Programmatic

您还可以避免使用负索引,仅修复后果:

Dim row as DataGridViewRow
If e.RowIndex >=0 Then
    row = dgv_employees.Rows(e.RowIndex)
End If    

请注意,可能有一些我不知道的上下文,因此需要进一步修改。

可能,您还可以使用Overides禁用标题本身的点击事件:disable-sorting-when-clicking-datagridview-column-header

于 2019-12-17T11:33:04.900 回答
0

发布我提出的代码,以便其他人可以参考。

我删除了这一行Dim row As DataGridViewRow = dgv_employees.Rows(e.RowIndex)

这个现在对我有用:

        If e.RowIndex >= 0 AndAlso e.ColumnIndex = 16 Then
        If MessageBox.Show(String.Format("Do you want to delete ID: {0}", dgv_employees.Rows(e.RowIndex).Cells("empNum").Value), "Confirmation", MessageBoxButtons.YesNo) = DialogResult.Yes Then
            Using con As New SqlConnection(constr)
                Using cmd As New SqlCommand("DELETE FROM [dbo].[emp_personal] WHERE empNum = @empNum", con)
                    cmd.CommandType = CommandType.Text
                    cmd.Parameters.AddWithValue("@empNum", dgv_employees.Rows(e.RowIndex).Cells("empNum").Value)
                    con.Open()
                    cmd.ExecuteNonQuery()
                    con.Close()
                End Using
            End Using

            Me.BindGrid()
        End If
    End If
于 2019-12-17T12:52:59.010 回答