<%@ Import Namespace="System.Data" %>
<%@ Page Language="vb" AutoEventWireup="false" %>
<script language="vb" runat="server">
Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)
Dim gv As GridView = DirectCast(sender, GridView)
Dim rowIndex As Integer = e.CommandArgument
Select Case e.CommandName
Case "Select"
Dim tb As TextBox = Ctype(gv.HeaderRow.FindControl("txtHeaderValue"), TextBox)
lblHeaderValue.Text = "In the header textbox you entered: " & tb.Text
Dim childgv As GridView = DirectCast(gv.Rows(rowIndex).FindControl("ChildGridView1"), GridView)
If Not childgv Is Nothing Then
childgv.Visible = Not childgv.Visible
Dim odsOrders As ObjectDataSource = DirectCast(gv.Rows(rowIndex).FindControl("odsOrders"), ObjectDataSource)
odsOrders.SelectParameters("CustomerID").DefaultValue = gv.DataKeys(rowIndex)(0).ToString
Dim detV As DetailsView = DirectCast(gv.Rows(rowIndex).FindControl("detvOrder"), DetailsView)
If Not detV Is Nothing Then detV.Visible = childgv.Visible
End If
End Select
End Sub
Protected Sub ChildGridView_RowCommand(ByVal sender As Object, ByVal e As GridViewCommandEventArgs)
Dim gv As GridView = DirectCast(sender, GridView)
Dim rowIndex As Integer = e.CommandArgument
Select Case e.CommandName
Case "Select"
Dim detv As DetailsView = DirectCast(gv.Parent.FindControl("detvOrder"), DetailsView)
If Not detv Is Nothing Then
Dim odsOrders As ObjectDataSource = DirectCast(gv.Parent.FindControl("odsOrderDetails"), ObjectDataSource)
odsOrders.SelectParameters("OrderID").DefaultValue = gv.DataKeys(rowIndex)(0).ToString
End If
End Select
End Sub
Protected Sub GridView1_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.Header Then
Dim grvrow As GridViewRow = e.Row
Dim tbl As Table = New Table()
Dim row As TableRow = New TableRow()
Dim aTD(grvrow.Cells.Count - 1) As TableCell
grvrow.Cells.CopyTo(aTD, 0)
grvrow.Cells.Clear()
row.Cells.AddRange(aTD)
tbl.Rows.Add(row)
'second row
row = New TableRow()
Dim cell As TableCell = New TableCell()
cell.ColumnSpan = aTD.Length
row.Cells.Add(cell)
Dim lbl As new Label()
lbl.Text = "This section contains a new header line that was added while handling the RowCreated event to manipulate the header row." & _
" Enter a value in this textbox then I will grab it and display while handling the select command"
cell.Controls.Add(lbl)
Dim tb as new TextBox()
tb.Text = "Enter a value"
tb.ID = "txtHeaderValue"
cell.Controls.Add(tb)
tbl.Rows.Add(row)
'create a new cell within the gridview row
Dim cellGRV As TableCell = New TableCell()
cellGRV.ColumnSpan = aTD.Length
grvrow.Cells.Add(cellGRV)
cellGRV.Controls.Add(tbl)
End If
End Sub
Protected Sub ChildGridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
GridView1.SelectedRow.FindControl("detvOrder").Visible = Not GridView1.SelectedRow.FindControl("detvOrder").Visible
End Sub
</script>
<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="MainContent">
<div style="width: 750px;">
<h2>
Parent-Child GridViews using show/hide rows within the same table</h2>
<p>
Click on the arrow icon in front of a record to toggle the view between detail and
summary.</p>
<asp:Label id="lblHeaderValue" runat="Server"></asp:Label>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="False"
OnRowCommand ="GridView1_RowCommand" DataKeyNames="CustomerID"
DataSourceID="odsCustomers" AutoGenerateColumns="false" CssClass="NestedGridView1Style"
OnRowCreated ="GridView1_RowCreated">
<SelectedRowStyle CssClass="Green" />
<HeaderStyle CssClass="Pink" />
<Columns>
<asp:ButtonField ButtonType="Image" ImageUrl="~/App_Themes/WEBSWAPP/images/arrow.gif"
CommandName="Select" Text="Click here to toggle the display of the orders list for this customer" />
<asp:TemplateField>
<HeaderTemplate>
<table cellpadding="2" cellspacing="0" border="0" width="860px">
<!-- this row has the parent grid -->
<tr>
<td width="660px">
Company Name</td>
<td width="100px">
City</td>
<td width="100px">
Country</td>
</tr>
</table>
</HeaderTemplate>
<ItemTemplate>
<table border="0" cellpadding="2" cellspacing="0" width="860px">
<!-- this row has the parent grid -->
<tr>
<td width="660px">
<asp:Label ID="lblCompanyName" runat="server" Text='<%# Eval("CompanyName") %>'></asp:Label>
</td>
<td width="100px">
<asp:Label ID="lblCity" runat="server" Text='<%# Eval("City") %>'></asp:Label>
</td>
<td width="100px">
<asp:Label ID="lblCountry" runat="server" Text='<%# Eval("Country") %>'></asp:Label>
</td>
</tr>
<!-- this row has the child grid and its details view-->
<tr>
<td colspan="3">
<table border="0" cellpadding="3" cellspacing="0" width="100%">
<tr>
<!-- this cell has the list of orders for the selected customer -->
<td>
<asp:GridView ID="ChildGridView1" runat="server" DataKeyNames="OrderID" Visible="False"
DataSourceID="odsOrders" AutoGenerateColumns="False" CssClass="GridView1ChildStyle"
OnRowCommand="ChildGridView_RowCommand">
<SelectedRowStyle CssClass="Blue" />
<HeaderStyle CssClass="Header" />
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:TemplateField HeaderText="Order Date">
<EditItemTemplate>
<asp:TextBox ID="txtOrderDate" runat="server" Text='<%# Bind("OrderDate", "{0:d}") %>'
Width="70px"></asp:TextBox>
<asp:CompareValidator ID="valComp1" ValueToCompare="01/01/2020" ControlToValidate="txtOrderDate"
Operator="LessThan" Type="Date" runat="server" Display="None" ErrorMessage="A valid date must be before January 01 2020" />
<asp:CompareValidator ID="valComp2" ValueToCompare="01/01/1980" ControlToValidate="txtOrderDate"
Operator="GreaterThan" Type="Date" runat="server" Display="None" ErrorMessage="Invalid Date: A valid date must be after January 01 1980" />
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("OrderDate", "{0:d}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Shipped Date">
<EditItemTemplate>
<asp:TextBox ID="txtShippedDate" runat="server" Text='<%# Bind("ShippedDate", "{0:d}") %>'
Width="70px"></asp:TextBox>
<asp:CompareValidator ID="valComp3" ValueToCompare="01/01/2020" ControlToValidate="txtShippedDate"
Operator="LessThan" Type="Date" runat="server" Display="None" ErrorMessage="A valid date must be before January 01 2020" />
<asp:CompareValidator ID="valComp4" ValueToCompare="01/01/1980" ControlToValidate="txtShippedDate"
Operator="GreaterThan" Type="Date" runat="server" Display="None" ErrorMessage="Invalid Date: A valid date must be after January 01 1980" />
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Eval("ShippedDate", "{0:d}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Ship Name">
<EditItemTemplate>
<asp:TextBox ID="txtShipName" runat="server" Text='<%# Bind("ShipName") %>' Width="150px"
MaxLength="35"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("ShipName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Freight">
<EditItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("Freight", "{0:c}") %>'
Width="70px"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("Freight", "{0:c}") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:ButtonField ButtonType="Image" ImageUrl="~/App_Themes/WEBSWAPP/images/arrow.gif"
CommandName="Select" Text="Click here to toggle the display of the detailed products on this order" />
</Columns>
</asp:GridView>
</td>
<!--This cell has the order detail -->
<td>
<asp:DetailsView ID="detvOrder" runat="server" DataSourceID="odsOrderDetails" AllowPaging="True"
DataKeyNames="OrderID,ProductID" AutoGenerateRows="false" >
<FieldHeaderStyle CssClass="DetailsView1Header" />
<HeaderStyle CssClass="Header" />
<HeaderTemplate>
<p>
Order Details</p>
</HeaderTemplate>
<Fields>
<asp:BoundField HeaderText="Order ID" DataField ="OrderID"/>
<asp:BoundField DataField="ProductName" HeaderText="Product Name" />
<asp:BoundField DataField="UnitPrice" HeaderText="Unit Price" DataFormatString="{0:c}"
HtmlEncode="False" />
<asp:BoundField DataField="Quantity" HeaderText="Quantity" DataFormatString="{0:#}"
HtmlEncode="False" />
<asp:BoundField DataField="Discount" HeaderText="Discount" DataFormatString="{0:c}"
HtmlEncode="False" />
<asp:BoundField DataField="ExtendedPrice" HeaderText="Extended Price" DataFormatString="{0:c}"
HtmlEncode="False" />
<asp:CommandField ShowInsertButton ="true" />
</Fields>
</asp:DetailsView>
</td>
</tr>
</table>
<asp:ObjectDataSource ID="odsOrderDetails" runat="server" SelectMethod="CustomerOrderDetails"
TypeName="WEBSWAPP_BLL.Demos">
<SelectParameters>
<asp:Parameter Name="OrderId" DefaultValue="0" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
<asp:ObjectDataSource ID="odsOrders" runat="server" SelectMethod="OrdersForCustomer"
TypeName="WEBSWAPP_BLL.Demos" OldValuesParameterFormatString="original_{0}" UpdateMethod="UpdateOrder">
<SelectParameters>
<asp:Parameter Name="CustomerID" DefaultValue="0" Type="string" />
</SelectParameters>
<UpdateParameters>
<asp:Parameter Name="OrderID" Type="Int32" />
<asp:Parameter Name="OrderDate" Type="DateTime" />
<asp:Parameter Name="ShippedDate" Type="DateTime" />
<asp:Parameter Name="ShipName" Type="String" />
<asp:Parameter Name="Freight" Type="String" />
</UpdateParameters>
</asp:ObjectDataSource>
</td>
</tr>
</table>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="odsCustomers" runat="server" SelectMethod="Customers" TypeName="WEBSWAPP_BLL.Demos">
</asp:ObjectDataSource>
<asp:Label ID="lblStatus" runat="server"></asp:Label>
</div>
</asp:Content>