Practical ASP.NET

Databinding without Tables: Updates and Deletes

Peter adds the code to support doing updates and deletes with an unbound GridView.

In last week's column (Databinding the GridView Without Using a Table), I looked at working with the GridView in an "unbound" mode. I was doing this because I need to display multiple items of data that I was retrieving from a string property on a middle-tier business object (i.e. data available only in memory at runtime). By the end of last week's column, I was extracting some XML data from the middle-tier object, loading that XML into a typed DataSet (which I called Parameters) and displaying the data in a GridView.

This week, I'll look at the code required to support changing and deleting records. It's here that I'll reap the benefits of converting my XML data into a DataTable in a DataSet.

Handling Update
To support updating, I needed to add code to the events that are fired by the GridView's Edit, Update, and Cancel buttons.

The Edit button fires the RowEditing event. In that event, I needed to set the GridView's EditIndex property to have the right row display using its EditItemTemplate (which I had the GridView generate in last week's column). Fortunately, the e parameter passed to this event reports the row the user is editing through its NewEditIndex property. After setting the EditIndex property, I have to reset the DataSource using the copy of my DataSet retrieved from my LoadData method (discussed last week), and rebind the GridView:

With Me.GridView1
.EditIndex = e.NewEditIndex
.DataSource = LoadData()
.DataBind()
End With

After this code executes (and the page redisplays) the user will have a row of textboxes where he or she can enter data and two buttons: Update and Cancel.

To support the Cancel button, I must add code to the GridView's RowCancelingEdit event. The only difference between this code and the code in the RowEditing event is that I have to set the EditIndex property to -1, so that no rows will display using their EditItemTemplate:

With Me.GridView1
.EditIndex = -1
.DataSource = LoadData()
.DataBind()
End With

The Update button fires the RowUpdating event. Handling data changes in this event isn't very complicated, because I'm using a DataSet to hold my data. In the event, I first need to recreate my DataSet and set the Name and Values fields in the Parameter table using values from the corresponding cells in the GridView. The RowIndex property on the event's e parameter tells me which row to update:

Dim ds As Parameters = LoadData()
With ds
.Parameter(e.RowIndex).Name =
CType(Me.GridView1.Rows(e.RowIndex).Cells(2).Controls(1),
TextBox).Text
.Parameter(e.RowIndex).Value =
CType(Me.GridView1.Rows(e.RowIndex).Cells(3).Controls(1),
TextBox).Text

Having updated the DataSet, I need to save it somewhere. I do that with a method called SaveData (discussed later in this article). Once the DataSet is saved, I set the GridView to have no rows in edit mode and rebind it to the DataSet:

SaveData(ds, True)
With Me.GridView1
.EditIndex = -1
.DataSource = ds
.DataBind()
End With

Dealing with Deletes
Clicking the Delete button fires the RowDeleting event. In this event, I again retrieve my Parameter DataSet. Once I have the DataSet, I delete the row indicated by the RowIndex property of the event's e parameter and call the DataSet's AcceptChanges method to flush the deleted row. Here again, I use my SaveData routine to save the updated DataSet before rebinding it to the GridView:

Dim ds As Parameters = LoadData()
ds.Parameter(e.RowIndex).Delete()
ds.AcceptChanges()
SaveData(ds, True)
With Me.GridView1
.DataSource = ds
.DataBind()
End With

The SaveData method is simpler than the LoadData method I discussed in last week's column. In the SaveData method, I extract the XML from the DataSet passed to the method and stuff it into the Page's ViewState to be used later. If the second parameter passed to the method is True, I also update the object that holds the data:

Sub SaveData(ByVal ds As Parameters, ByVal Update As Boolean)
Me.ViewState("XML") = ds.GetXml
If Update Then
Dim cmd As New MyCommandObject(cmdId)
cmd.Parameters = ds.GetXml
End If
End Sub

I'll discuss the reason for controlling updates to the business level object in next week's article when I cover doing inserts with the GridView.

All that's left now is to handle adding new records, which is next week's topic, along with returning to the sorting problem discussed in my earlier column, titled Sorting in the ObjectDataSource.

Finally, a tip of the hat to Robin Hood, for doing much of the work that I'm taking credit for here.

About the Author

Peter Vogel is a system architect and principal in PH&V Information Services. PH&V provides full-stack consulting from UX design through object modeling to database design. Peter tweets about his VSM columns with the hashtag #vogelarticles. His blog posts on user experience design can be found at http://blog.learningtree.com/tag/ui/.

comments powered by Disqus

Featured

  • Hands On: New VS Code Insiders Build Creates Web Page from Image in Seconds

    New Vision support with GitHub Copilot in the latest Visual Studio Code Insiders build takes a user-supplied mockup image and creates a web page from it in seconds, handling all the HTML and CSS.

  • Naive Bayes Regression Using C#

    Dr. James McCaffrey from Microsoft Research presents a complete end-to-end demonstration of the naive Bayes regression technique, where the goal is to predict a single numeric value. Compared to other machine learning regression techniques, naive Bayes regression is usually less accurate, but is simple, easy to implement and customize, works on both large and small datasets, is highly interpretable, and doesn't require tuning any hyperparameters.

  • VS Code Copilot Previews New GPT-4o AI Code Completion Model

    The 4o upgrade includes additional training on more than 275,000 high-quality public repositories in over 30 popular programming languages, said Microsoft-owned GitHub, which created the original "AI pair programmer" years ago.

  • Microsoft's Rust Embrace Continues with Azure SDK Beta

    "Rust's strong type system and ownership model help prevent common programming errors such as null pointer dereferencing and buffer overflows, leading to more secure and stable code."

  • Xcode IDE from Microsoft Archrival Apple Gets Copilot AI

    Just after expanding the reach of its Copilot AI coding assistant to the open-source Eclipse IDE, Microsoft showcased how it's going even further, providing details about a preview version for the Xcode IDE from archrival Apple.

Subscribe on YouTube

Upcoming Training Events