A couple points that may help you, Tracy.
Your on the right track with option number 1, except instead of popping up a window or using the DataNavigateUrlformatString, you would redirect to an edit control. This is because you can't navigate to an ascx control because it's not a web page, it's just a control.
Here is an example of one of my modules (i stripped alot out, so syntax wise it may not be 100%)
ascx (this is a datalist for categories, and a nested datagrid with associated topics)
<asp:DataList id="dlCats" runat="server" RepeatLayout="Flow">
<ItemTemplate>
<table border="1" width="550" ID="Table1">
<tr>
<td colspan="2" noWrap bgColor="silver">
<asp:Label Runat="server" id="lblCatName" visible="true" text='<%# DataBinder.Eval(Container.DataItem,"CatName") %>' >
</asp:Label>
</td>
</tr>
<tr>
<td>
<asp:DataGrid id="grdTopics" DataKeyField="TopicId" AutoGenerateColumns="False" Runat="server" OnItemCommand="grdTopics_ItemCommand" DataSource='<%# BuildSummary(DataBinder.Eval(Container.DataItem,"TopicCatId")) %>' >
<Columns>
<asp:BoundColumn Visible="False" DataField="TopicID" HeaderText="TopicID"></asp:BoundColumn>
<asp:TemplateColumn HeaderText="Topic" ItemStyle-Width="75%">
<ItemTemplate>
<asp:LinkButton id="cmdView" CommandArgument='<%# DataBinder.Eval(Container.DataItem,"TopicId") %>' CommandName="Select" Runat="server" CssClass="CommandButton">
<%# DataBinder.Eval(Container.DataItem,"TopicName") %>
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="Cert_Date_d" HeaderText="Date Complete" ItemStyle-Width="25%" ItemStyle-CssClass="Normal"></asp:BoundColumn>
</Columns>
</asp:DataGrid>
</td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
VB codebehind
'This fills the nested topic grid
Function BuildSummary(ByVal TopicID As Integer) As ArrayList
Dim objCtrl As New SummaryController
Dim arr As ArrayList
arr = objCtrl.GetSummary(TopicID)
Return arr
End Function
'This is the grid command event
Public Sub grdTopics_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)
Try
If CType(e.CommandSource, LinkButton).CommandName = "Select" Then
Dim TopicID As Integer = CType(e.CommandArgument, Int16)
Response.Redirect(NavigateURL(TabId, "EditTopic", "Mid=" & ModuleId & "&TopicID=" & TopicID))
End If
Catch exc As Exception 'Module failed to load
ProcessModuleLoadException(Me, exc)
End Try
End Sub
That would go to your edit page, which you load all the editable stuff into text boxes, or whatever, based on the TopicId parameter.
Technically, you don't even have to go to another page, you could do all of it on one page with panels. Stick your grids in one panel that is set to visible, and all your edit fields in a non-visible panel. When the ItemCommand fired, load the data into your edit controls and switch the visibility on the panels. Rebind the grids after the edit, and set the panel visibility.
I hope these options help. They work well for me.