Ok, I program mostly in vb.net.  Vb.net provides a nifty control called the gridview, which I use quite a bit.  Gridviews are basically just a tabular layout with built in sorting and paging capabilities. 

One thing some developers like about gridviews, is that it has built in support for inline editing.  I almost never use them for that though.  Why? 

1) Because most of my objects are too complicated to "look good" while being edited via a single line table.

2)  If it something simple, its probably something that ideally the user wants to update simultaneously multiple records, which gridviews aren't good at.

So what do I use? The repeater.  A very basic control, it just repeats a collection of objects.  You can bind the properties of the objects to either display their info or bind them to properties of asp.net controls. 

Something I need a lot lately is to display text boxes, drop down boxes, calendar pickers, etc, all in a format that allows the user to edit all of them simultaneously.

I'm going to write down how I do it currently, in the hopes that I can look at it later on and optimize it a bit, maybe someone else can help with some comments too.

So I might have a repeater like so
[code]
<asp:Repeater id="repeat1" runat="server">
<ItemTemplate><asp:TextBox id="txtvalue" runat="server" value='<%# eval("property1")%>'></ItemTemplate></asp:Repeater>
[/code]

I bind it to a dataset, often one that I store in viewstate (I don't normally care about the download time for admins, as the whole point of showing multiple edits is that it minimizes postbacks).

Then, when the user hits "save", it runs this code.
updatevalues()
Savevalues()

The important part is the updatevalues, as anyone can save the dataset to the database.  The dataset has to be updated with the new values entered by the user.

Dim objtime As TextBox

Dim i As Integer = 0

For x As Integer = 0 To Me.Times.Count - 1

If Not Me.Times(x).RowState = Data.DataRowState.Deleted And Not Me.Times(x).RowState = Data.DataRowState.Detached Then

objtime = CType(Me.dlisttimes.Items(i).FindControl("txtvalue"), TextBox)

Me.Times(x).BeginEdit()

Me.Times(x).Time = objtime.value

Me.Times(x).EndEdit()

i = i + 1

End If

Next

Me.Times = Times

This is the centerpiece of the code, and it works fairly well.  I have to check if the rowstate is deleted because I usually provide a small button that allows deletion of a record, but until they actually "save" to the database, the datarow is sitting in the database waiting to be deleted. 

Is there a better way?  I don't know, more efficient? Probably.  What matters to me most of the time is maintainability of code, which is something I still want to improve on with the above snippet.