A great example of how to nest one gridview inside of another and collapse/expand the set of nested records.
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim gv As GridView = e.Row.FindControl("GridView2")
Dim dbSrc As New SqlDataSource
dbSrc.ConnectionString = ConfigurationManager.ConnectionStrings("TASSupport_ConnectionString").ConnectionString
dbSrc.SelectCommand = "SELECT ResponseID, Response, TicketID, Response_Date, Responder FROM v_Responses WHERE TicketID = '" & _
e.Row.DataItem("TicketID").ToString & "' ORDER BY Response_Date DESC"
gv.DataSource = dbSrc
gv.DataBind()
End If
End Sub
<div id="dvGrid" class="grid">
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CssClass="datatable"
BorderWidth="1px" DataKeyNames="TicketID" BackColor="White"
GridLines="Horizontal" DataSourceID="dsAllTickets"
CellPadding="3" BorderColor="#E7E7FF" Width="95%" HorizontalAlign="Center"
AllowSorting="True" BorderStyle="None" AllowPaging="True"
PageSize="25" EnableModelValidation="True" OnRowDataBound="GridView1_RowDataBound">
<EmptyDataTemplate>
<asp:Label ID ="lblEmptyDataTemplate" runat ="server" Text ="No tickets have been assigned to you" CssClass="nomatch" />
</EmptyDataTemplate>
<Columns>
<asp:TemplateField HeaderText=" ">
<ItemTemplate>
<a href="javascript:switchViews('div<%# Eval("TicketID") %>', 'one');">
<img id="imgdiv<%# Eval("TicketID") %>" alt="Click to show/hide responses" border="0"
src="../images/expand_button.png" />
</a>
</ItemTemplate>
<AlternatingItemTemplate>
<a href="javascript:switchViews('div<%# Eval("TicketID") %>', 'alt');">
<img id="imgdiv<%# Eval("TicketID") %>" alt="Click to show/hide responses" border="0"
src="../images/expand_button.png" />
</a>
</AlternatingItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Ticket ID" SortExpression="TicketID" ItemStyle-CssClass="first"
HeaderStyle-CssClass="first">
<ItemTemplate>
<a href="ticket.detail.aspx?TicketID=<%#Eval("TicketID") %>"><%#Eval("TicketID")%></a>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Date_Received" HeaderText="Date" SortExpression="Date_Received" />
<asp:BoundField DataField="Request_Type" HeaderText="Request Type" SortExpression="Request_Type" />
<asp:BoundField DataField="Subject" HeaderText="Subject" SortExpression="Subject" />
<asp:BoundField DataField="Status" HeaderText="Status" SortExpression="Status" />
<asp:BoundField DataField="Urgency" HeaderText="Urgency" SortExpression="Urgency" />
<asp:BoundField DataField="Requestor_Name" HeaderText="Requestor Name" SortExpression="Requestor_Name" />
<asp:BoundField DataField="TAS_Name" HeaderText="Assigned To" SortExpression="TAS_Name" />
<asp:TemplateField HeaderText=" ">
<ItemTemplate>
</td></tr>
<tr>
<td colspan="100%">
<div id="div<%# Eval("TicketID") %>" style="display:none;position:relative;left:25px;" >
<asp:GridView ID="GridView2" runat="server" Width="80%"
AutoGenerateColumns="false" DataKeyNames="ResponseID"
EmptyDataText="No responses for this ticket.">
<RowStyle CssClass="row" />
<AlternatingRowStyle CssClass="rowalternate" />
<HeaderStyle CssClass="gridcolumnheader" />
<Columns>
<asp:BoundField DataField="Response" HeaderText="Response" />
<asp:BoundField DataField="Response_Date" HeaderText="Date" />
<asp:BoundField DataField="Responder" HeaderText="Responder" />
</Columns>
</asp:GridView>
</div>
</td>
</tr>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<RowStyle CssClass="row" />
<AlternatingRowStyle CssClass="rowalternate" />
<FooterStyle CssClass="gridcolumnheader" />
<PagerStyle HorizontalAlign="Left" CssClass="gridpager" />
<HeaderStyle CssClass="gridcolumnheader" />
</asp:GridView>
</div>
<script language="javascript" type="text/javascript">
function switchViews(obj,row)
{
var div = document.getElementById(obj);
var img = document.getElementById('img' + obj);
if (div.style.display=="none")
{
div.style.display = "inline";
if (row=='alt')
{
img.src = "../images/expand_button_down.png"; mce_src = "../images/expand_button_down.png";
}
else
{
img.src = "../images/expand_button_down.png"; mce_src = "../images/expand_button_down.png";
}
img.alt = "Close to view other customers";
}
else
{
div.style.display = "none";
if (row=='alt')
{
img.src = "../images/expand_button.png"; mce_src = "../images/expand_button.png";
}
else
{
img.src = "../images/expand_button.png"; mce_src = "../images/expand_button.png";
}
img.alt = "Expand to show orders";
}
}
</script>
<asp:SqlDataSource ID="dsAllTickets" runat="server" SelectCommand="p_AllTickets" SelectCommandType="StoredProcedure"
ConnectionString="<%$ ConnectionStrings:TASSupport_ConnectionString %>" OnSelected="OnSelectedHandler">
p