Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 删除datagridview行而不删除重复项_Vb.net - Fatal编程技术网

Vb.net 删除datagridview行而不删除重复项

Vb.net 删除datagridview行而不删除重复项,vb.net,Vb.net,我有一个带有数据的datagridview,一个列(EmployeeID)具有相同的值,因为它可以出现多次,我有一个delete按钮,单击它可以删除所有具有EmployeeID的行。是否可以使其工作,以便它只删除我选择的行,而不是删除具有特定值的所有行 我这里有代码: Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click 'check for the selected

我有一个带有数据的datagridview,一个列(EmployeeID)具有相同的值,因为它可以出现多次,我有一个delete按钮,单击它可以删除所有具有EmployeeID的行。是否可以使其工作,以便它只删除我选择的行,而不是删除具有特定值的所有行

我这里有代码:

Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
        'check for the selected item in the list
        If Me.DataGridView1.Rows.Count > 0 Then
            If Me.DataGridView1.SelectedRows.Count > 0 Then
                Dim intemployeeno As Integer = Me.DataGridView1.SelectedRows(0).Cells("EmployeeID").Value
                'open connection if not already opened
                If Not cnn.State = ConnectionState.Open Then
                    cnn.Open()
                End If
                'delete data
                Dim cmd As New OleDb.OleDbCommand
                cmd.Connection = cnn
                'cmd.CommandText = "DELETE * FROM attendance " & intemployeeno
                cmd.CommandText = "DELETE FROM attendance WHERE employeeID=" & intemployeeno
                cmd.ExecuteNonQuery()
                'refresh data
                Me.refreshdata()
                'Display pop up alert before deleting row of data
            Else
                MessageBox.Show("Select 1 row before you hit Delete")
                'close connection
                cnn.Close()

            End If
        End If
    End Sub
谢谢

代码的下一部分

公开课表格4

Dim cnn As New OleDb.OleDbConnection

'open connection to database

Private Sub refreshdata()
    If Not cnn.State = ConnectionState.Open Then
        'open connection
        cnn.Open()
    End If
    'create new data and insert the data values
    Dim da As New OleDb.OleDbDataAdapter("SELECT TestNumber as [TestNumber], EmployeeID as [EmployeeID], " & _
                                    "firstname as [FirstName], lastname as [LastName], date as [Date], holiday as [Holiday], halfday as [HalfDay], other as [Other], sick as [Sick], unpaidholiday as [UnpaidHoliday], daystaken as [DaysTaken], datefrom as [DateFrom], dateto as [DateTo] " & _
                                    "FROM Attendance ORDER BY FirstName", cnn)
    Dim dt As New DataTable
    'fill data into datatable
    da.Fill(dt)
    'offer data to be placed in datagridview
    Me.DataGridView1.DataSource = dt
    'close connection
    cnn.Close()
End Sub

datagridview需要一个列,其中包含
考勤
表的主键。如果您不希望用户看到它,它可以是隐藏(不可见)列

如果没有主键(或唯一约束,但为了简单起见,让我们使用PK),数据库就无法确保您引用的是单个特定行

然后,您需要更改VB代码中的以下行:

Dim myPrimaryKey As Integer = Me.DataGridView1.SelectedRows(0).Cells("PrimaryKeyColumnName").Value
同时更改删除语句:

cmd.CommandText = "DELETE FROM attendance WHERE AttendancePK=" & myPrimaryKey

我刚刚做了适当的编辑,所以您需要更多的更改。如果情况是,您的用户已选择要删除的一行

更改标记为*

此外,您还可以测试cnn在进入途中是否连接。如果你想在cnn仍然连接的情况下返回,你必须设置一个标志来确定退出时的状态

Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click
    'check for the selected item in the list
    If Me.DataGridView1.Rows.Count > 0 Then
        If Me.DataGridView1.SelectedRows.Count =  1 Then   *****
            Dim intemployeeno As Integer = Me.DataGridView1.SelectedRows(0).Cells("EmployeeID").Value
            'open connection if not already opened
            If Not cnn.State = ConnectionState.Open Then
                cnn.Open()
            End If
            'delete data
            Dim cmd As New OleDb.OleDbCommand
            cmd.Connection = cnn
            'cmd.CommandText = "DELETE * FROM attendance " & intemployeeno
            cmd.CommandText = "DELETE FROM attendance WHERE employeeID=" & intemployeeno
            cmd.ExecuteNonQuery()
            cnn.Close()  *****  
            'refresh data
            Me.refreshdata()
            'Display pop up alert before deleting row of data
        Else
            MessageBox.Show("Select 1 row before you hit Delete")
            'close connection
          '  cnn.Close()  *****

        End If
    End If
End Sub

我希望如此。更新您要添加其他参数的位置,以便只删除一行关于如何。。。在不知道您的数据的情况下,我不能说。在删除行之前,我是否可以删除突出显示的行而不指示任何特定类型的值?考勤表的主键是什么?我没有为考勤表设置主键,那么您怎么可能期望能够挑出特定的行?Douglas更接近了尽管我猜您可以从第一个选中的行中获取ID#,并执行删除操作一次,然后刷新数据集。在最初的SQL中,它看起来有点吓人——从所有具有给定ID的记录中大规模删除。这就是您想要的吗?问题不是选择了多行;问题是SQL正在删除所有具有特定
employeeID
的行。它不是唯一的。很好,我现在让它工作了,但是如何删除带有主键的列,我不希望用户看到它?将其
Visible
属性设置为false。我使用sql在表中输入datagrid。我刚刚从内存上传了代码,但请尝试
Me.DataGridView1.Columns(“PrimaryKeyColumnName”).Visible=False
。或者您可以在设计器中设置它,假设列不是自动生成的。我似乎无法找到并将其更改为我。DataGridView1.columns(“PrimaryKeyColumnName”)。Visible=False。。