Solved

Can not delete datagrid row from dataset

Posted on 2011-03-10
6
369 Views
Last Modified: 2012-05-11
I have a datagrid that is bound to a dataset.  I use the datagrids, edit and delete auto buttons.  When I delete the row, code example 1 fires, then makes visible to update button which is to be used to updated the underlying database.  But when I run the update code (the 2nd example) I receive erroor that "Deleted row information can not be accessed through the row.

Please help, the update items seem to work fine, although I thought if I attached each of the sqlcommands to the correct dataapdapter function,  all I had to do was to dataadapter.update(ds.tables(0)) rather than having to iriderate through the database.  Maybe someone could elaborate on that for me.



thanks

Private Sub UpdateTable()
        'Dim myUpdateCMD As New SqlCommand
        Dim cmdEdit As New SqlCommand
        Dim cmdADD As New SqlCommand
        Dim cmdDelete As New SqlCommand
        '' Dim strUpdate As String
        Dim i As Integer = 0
        If dsCategories.HasChanges Then
            For i = 0 To dsCategories.Tables(0).Rows.Count - 1
                Dim myRow As DataRow
                If dsCategories.Tables(0).Rows(i).RowState = DataRowState.Added Then
                    myRow = dsCategories.Tables(0).Rows(i)
                    With cmdADD
                        .Connection = myConn
                        .CommandText = "TAG_InsertCategory"
                        .CommandType = CommandType.StoredProcedure
                        .Parameters.Add(New SqlParameter("@ID", myRow.Item(0)))
                        .Parameters.Add(New SqlParameter("@Long_Name", myRow.Item(1)))
                        .Parameters.Add(New SqlParameter("@Short_Name", myRow.Item(2)))
                        .Parameters.Add(New SqlParameter("@Color", myRow.Item(3)))
                        .Parameters.Add(New SqlParameter("@Active", myRow.Item(4)))
                        .Parameters.Add(New SqlParameter("@LocationID", myRow.Item(5)))
                    End With

                ElseIf dsCategories.Tables(0).Rows(i).RowState = DataRowState.Deleted Then
                    myRow = dsCategories.Tables(0).Rows(i)

                    With cmdDelete
                        .Connection = myConn
                        .CommandText = "TAG_DeleteCategory"
                        .CommandType = CommandType.Text
                        .Parameters.Add(New SqlParameter("@RowID", myRow(0)))
                    End With

                ElseIf dsCategories.Tables(0).Rows(i).RowState = DataRowState.Modified Then
                    myRow = dsCategories.Tables(0).Rows(i)
                    With cmdEdit
                        .Connection = myConn
                        .CommandText = "TAG_UpdateCategories"
                        .CommandType = CommandType.StoredProcedure
                        .Parameters.Add(New SqlParameter("@ID", myRow.Item(0)))
                        .Parameters.Add(New SqlParameter("@Long_Name", myRow.Item(1)))
                        .Parameters.Add(New SqlParameter("@Short_Name", myRow.Item(2)))
                        .Parameters.Add(New SqlParameter("@Color", myRow.Item(3)))
                        .Parameters.Add(New SqlParameter("@Active", myRow.Item(4)))
                        .Parameters.Add(New SqlParameter("@LocationID", myRow.Item(5)))
                    End With
                End If
            Next
        Else
            ' nothing to change
        End If
        Dim daAdapter As New SqlDataAdapter
        Try
            myConn.Open()
            daAdapter.UpdateCommand = cmdEdit
            daAdapter.InsertCommand = cmdADD
            daAdapter.DeleteCommand = cmdDelete
            daAdapter.Update(dsCategories.Tables(0))
            myConn.Close()
        Catch ex As Exception
            Dim myError As String
            myError = ex.Message
        End Try

    End Sub

Open in new window

Private Sub gvCategories_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles gvCategories.RowDeleting
        dsCategories.Tables(0).Rows(e.RowIndex).BeginEdit()
        dsCategories.Tables(0).Rows(e.RowIndex).Delete()
        dsCategories.Tables(0).Rows(e.RowIndex).EndEdit()
        'dsCategories.Tables(0).Rows(e.RowIndex).AcceptChanges()
        gvCategories.DataSource = dsCategories.Tables(0)
        gvCategories.DataBind()
        If dsCategories.HasChanges Then
            btnUpdate.Visible = True
        Else
            btnUpdate.Visible = False
        End If
    End Sub

Open in new window

0
Comment
Question by:mgmhicks
  • 3
  • 2
6 Comments
 
LVL 17

Expert Comment

by:nepaluz
Comment Utility
Call a refresh of the datagridview AFTER deleting the row in the datatable.
0
 

Author Comment

by:mgmhicks
Comment Utility
Where under row_deleting or the update sub.  Looking at the row_deleting sub, looks like I removed the row from the dataset, however the problem is updating the sql server to delete that row in the update sub.
0
 
LVL 17

Expert Comment

by:nepaluz
Comment Utility
I mis-understood your question.

Now that you know that your routine to delete the data from the table works:
1. you should call the routine to delete the same data from the database before acually deleting it from the table, thereby making use of the data in the datatable BEFORE it is deleted, or:

2. keep some referencing data in a variable so that you can access this data to call your routine to update the database, e.g row number or key data

0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 15

Accepted Solution

by:
x77 earned 500 total points
Comment Utility
On RowDeleting event, you can cancel the Deleting action.
If yo do´nt  cancel the action (e.Cancel = true), then GridView do the delete action over datarow.

You are deletin the row, then when the Gridview do the action, then a exception occurs.
0
 

Author Comment

by:mgmhicks
Comment Utility
x77 I have a bound grid, and I have a delete button (auto delete link) and I cant get it deleted from the underlying database.  Should I update the underlying database after each change or wait and do all the changes to the database at once like I have tried to do in the update sub I have.  Its not supposed to be this hard I am missing the boat somewhere.  If I cancel the delete, when I do the UpdateTable sub, how can I tell the underlying database which record to delete.

thanks
0
 

Author Comment

by:mgmhicks
Comment Utility
Here is how I handle getting rid of the row, within the underlying database

Private Sub gvCategories_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles gvCategories.RowDeleting
        Dim mValue As Integer = dsCategories.Tables(0).Rows(e.RowIndex).Item(0)

        dsCategories.Tables(0).Rows(e.RowIndex).BeginEdit()
        dsCategories.Tables(0).Rows(e.RowIndex).Delete()
        dsCategories.Tables(0).Rows(e.RowIndex).EndEdit()
        dsCategories.Tables(0).Rows(e.RowIndex).AcceptChanges()
        Dim mystr As String
        mystr = "DELETE FROM TAG_InspectionCategories WHERE ID = " & mValue
        Dim myCMD As New SqlCommand
        Dim myDA As New SqlDataAdapter
        'myDA.DeleteCommand.CommandText = mystr

        Try
            myConn.Open()
            With myCMD
                .Connection = myConn
                .CommandText = mystr
                .CommandType = CommandType.Text

            End With
            myCMD.ExecuteNonQuery()
            myConn.Close()
        Catch ex As Exception
            Dim mtest As String
            mtest = ex.Message

        End Try
        gvCategories.DataSource = dsCategories.Tables(0)
        gvCategories.DataBind()
        If dsCategories.HasChanges Then
            btnUpdate.Visible = True
        Else
            btnUpdate.Visible = False
        End If
    End Sub
0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Microsoft Reports are based on a report definition, which is an XML file that describes data and layout for the report, with a different extension. You can create a client-side report definition language (*.rdlc) file with Visual Studio, and build g…
The ECB site provides FX rates for major currencies since its inception in 1999 in the form of an XML feed. The files have the following format (reducted for brevity) (CODE) There are three files available HERE (http://www.ecb.europa.eu/stats/exch…
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

8 Experts available now in Live!

Get 1:1 Help Now