Skip to main content

Nested GridView in ASP.NET Using c# with show/hide


In This example shows how to create Nested GridView In Asp.Net Using C# And VB.NET With Expand Collapse Functionality.

Sending Email from Asp.net With Dynamic Content , SQL Server- Case Sensitive Search in SQL Server


I have used JavaScript to Create Expandable Collapsible Effect by displaying Plus Minus image buttons.

Nested GridView Example In Asp.Net With Expand Collapse

Customers and Orders Table of Northwind Database are used to populate nested GridViews.

Drag and place SqlDataSource from toolbox on aspx page and configure and choose it as datasource from smart tags

Go to HTML source of page and add 2 TemplateField in <Columns>, one as first column and one as last column of gridview.

Place another grid in last templateField column.

Markup of page after adding both templatefields will like as shown below.



HTML SOURCE
     <asp:GridView ID="gvMaster" runat="server" 
                 AllowPaging="True" 
                   AutoGenerateColumns="False" 
                  DataKeyNames="CustomerID" 
                 DataSourceID="SqlDataSource1" 
                  onrowdatabound="gvMaster_RowDataBound">
    <Columns>
    <asp:TemplateField>
       <ItemTemplate>
       <a href="javascript:collapseExpand('customerID-
                 <%# Eval("CustomerID") %>');">
      <img id="imagecustomerID-<%# Eval("CustomerID") %>" 
             alt="Click to show/hide orders" 
            border="0" src="plus.png" /></a>
       </ItemTemplate>
   </asp:TemplateField>
   <asp:BoundField DataField="CustomerID" 
                   HeaderText="CustomerID"/>
   <asp:BoundField DataField="CompanyName" 
                    HeaderText="CompanyName"/>
     
    <asp:TemplateField>
    <ItemTemplate>
   <tr><td colspan="100%">
   <div id="customerID-<%# Eval("CustomerID") %>" 
        style="display:none;
         position:relative;left:25px;">
       
    <asp:GridView ID="nestedGridView" runat="server" 
                 AutoGenerateColumns="False" 
                  DataKeyNames="OrderID">
    <Columns>
   <asp:BoundField DataField="OrderID" HeaderText="OrderID"/>
    <asp:BoundField DataField="OrderDate" HeaderText="OrderDate"/>
   <asp:BoundField DataField="Freight" HeaderText="Freight"/>
    </Columns>
    </asp:GridView>
    </div>
    </td></tr>
    </ItemTemplate>
    </asp:TemplateField>
    </Columns>
   </asp:GridView>
    
  <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
   ConnectionString="<%$ ConnectionStrings:ConnectionString %>" 
   SelectCommand="SELECT [CustomerID], [CompanyName] 
                FROM [Customers]">
   </asp:SqlDataSource>

Add following JavaScript in head section of page.
<script type="text/javascript">
function collapseExpand(obj)
{
  var gvObject = document.getElementById(obj);
  var imageID = document.getElementById('image' + obj);
 
 if (gvObject.style.display == "none")
      {
         gvObject.style.display = "inline";
         imageID.src = "minus.png";
      }
  else
     {
         gvObject.style.display = "none";
         imageID.src = "plus.png";
     }
}
</script>
Write following code in RowDataBound Event of parent Grid to populate nested gridview.

C#
protected void gvMaster_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
 string customerID = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "CustomerID"));
            GridView gvChild = (GridView)e.Row.FindControl("nestedGridView");
            SqlDataSource gvChildSource = new SqlDataSource();
            gvChildSource.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            gvChildSource.SelectCommand = "SELECT [OrderID], [OrderDate],[Freight] FROM [Orders] WHERE [CustomerID] = '" + customerID + "'";
            gvChild.DataSource = gvChildSource;
            gvChild.DataBind();     }
}

VB.NET
Protected Sub gvMaster_RowDataBound(sender As Object, e As GridViewRowEventArgs)
 If e.Row.RowType = DataControlRowType.DataRow Then
  Dim customerID As String = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "CustomerID"))
  Dim gvChild As GridView = DirectCast(e.Row.FindControl("nestedGridView"), GridView)
  Dim gvChildSource As New SqlDataSource()
  gvChildSource.ConnectionString = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
  gvChildSource.SelectCommand = "SELECT [OrderID], [OrderDate],[Freight] FROM [Orders] WHERE [CustomerID] = '" + customerID + "'"
  gvChild.DataSource = gvChildSource
  gvChild.DataBind()
 End If
End Sub

I hope this will be helpful for you. I would like to have any feedback from you. 
Your valuable feedback, question, or comments about this article are always welcome.

Comments

Popular posts from this blog

How to hide url parameters in asp.net

There are different ways to Hide the URL in asp.net , you can choose any one from bellow options . Previously I was Explained about the  Difference between Convert.tostring and .tostring() method Example  ,   Reasons to use Twitter Bootstrap , How to Register AJAX toolkit in web.config file in asp.net a) Using Post Method b) Using Of Session . c) URL Encoding & decoding process . d) Using Server.Transfer() instead of Response.Redirect() method (1)Use a form and POST the information. This might require additional code in source pages, but should not require logic changes in the target pages (merely change Request.QueryString to Request.Form). While POST is not impossible to muck with, it's certainly less appealing than playing with QueryString parameters. (2)Use session variables to carry information from page to page. This is likely a more substantial effort compared to (1), because you will need to take session variable checking into account...

12 Sentences that Change Your Attitude at Work

If you work with the right attitude and right way, you’ll have your productivity up another level, and eventually, success will be just a step away. These are the 12 encouraging sentences that could change your attitude at work. #1 Don’t work harder, work deeper. #2 When you are young, work to learn, not to earn. #3 If you work really hard and are kind, amazing things will happen. #4 Productivity is never an accident. It is always the result of commitment to excellence, intelligent planning, and focused effort. #5 Most people work just hard enough not to get fired and get paid just enough money not to quit. #6 Boost your productivity by taking action immediately after setting a target even without perfect plans. Adjust your course along the way. #7 To be successful, the first thing to do is to fall in love with your work. #8 Identify your peak hour of productivity. Schedule your most important task for this period. Work on unimportant tasks during non-peak hours. #9 Be a mo...

Asp.Net AjaxFileUpload Control With Drag Drop And Progress Bar

This Example explains how to use AjaxFileUpload Control With Drag Drop And Progress Bar Functionality In Asp.Net 2.0 3.5 4.0 C# And VB.NET. Previous Post  I was Explained about the   jQuery - Allow Alphanumeric (Alphabets & Numbers) Characters in Textbox using JavaScript  ,  Fileupload show selected file in label when file selected  ,  Check for file size with JavaScript before uploading  . May 2012 release of AjaxControlToolkit includes a new AjaxFileUpload Control  which supports Multiple File Upload, Progress Bar and Drag And Drop functionality. These new features are supported by Google Chrome version 16+, Firefox 8+ , Safari 5+ and Internet explorer 10 + , IE9 or earlier does not support this feature. To start with it, download and put latest AjaxControlToolkit.dll in Bin folder of application, Place ToolkitScriptManager  and AjaxFileUpload on the page. HTML SOURCE < asp:ToolkitScriptManager I...