This article shows how to bind a nested GridView and work with it. The following is the procedure.

Step 1

First we create two tables in a database as in the following:

  1. create table TeamLeader(
  2. id int identity(1,1) Primary key,
  3. Name nvarchar(30),
  4. Age int,
  5. Branch nvarchar(10)
  6. )
And:
  1. Create table TeamMember(
  2. iid int identity(1,1) primary key,
  3. TLid int CONSTRAINT FKTeamMemberPKTeamMember REFERENCES TeamLeader(id),
  4. MemberName [nvarchar](50),
  5. Age int,
  6. Branch nvarchar(50)
  7. )
Step 2

Insert some data into the table like the following:

Insert some data into table

Table

Step 3

Now create a website, add a webpage and copy the design code as in the following:
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Example.aspx.cs" Inherits="Example" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head runat="server">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form id="form1" runat="server">
  9. <div>
  10. <asp:GridView ID="GVLeader" runat="server" AutoGenerateColumns="false" AlternatingRowStyle-BackColor="lightgreen"
  11. DataKeyNames="id" OnRowCommand="GVLeader_RowCommand">
  12. <Columns>
  13. <asp:TemplateField HeaderText="Team Leader Name">
  14. <ItemTemplate>
  15. <asp:Label ID="Label1" runat="server" Text='<%# Eval("Name") %>'></asp:Label>
  16. </ItemTemplate>
  17. </asp:TemplateField>
  18. <asp:TemplateField HeaderText="Age">
  19. <ItemTemplate>
  20. <asp:Label ID="Label2" runat="server" Text='<%# Eval("Age") %>'></asp:Label>
  21. </ItemTemplate>
  22. </asp:TemplateField>
  23. <asp:TemplateField HeaderText="Branch">
  24. <ItemTemplate>
  25. <asp:Label ID="Label3" runat="server" Text='<%# Eval("Branch") %>'></asp:Label>
  26. </ItemTemplate>
  27. </asp:TemplateField>
  28. <asp:TemplateField HeaderText="Team Member" ControlStyle-BackColor="#EBEBEB">
  29. <ItemTemplate>
  30. <asp:Button ID="Button1" runat="server" Text="See Member" CommandName='<%#Eval("id") %>' CommandArgument='<%#
  31. Container.DataItemIndex%>' />
  32. <asp:GridView ID="GVMember" AutoGenerateColumns="false" runat="server" AutoGenerateEditButton="true"
  33. DataKeyNames="iid" OnRowCancelingEdit="GVMember_RowCancelingEdit" OnRowEditing="GVMember_RowEditing"
  34. OnRowUpdating="GVMember_RowUpdating">
  35. <Columns>
  36. <asp:TemplateField HeaderText="Name">
  37. <ItemTemplate>
  38. <asp:Label ID="Label4" runat="server" Text='<%#Eval("MemberName") %>'></asp:Label>
  39. </ItemTemplate>
  40. <EditItemTemplate>
  41. <asp:TextBox ID="TextBox4" runat="server" Text='<%#Eval("MemberName") %>'></asp:TextBox>
  42. </EditItemTemplate>
  43. </asp:TemplateField>
  44. <asp:TemplateField HeaderText="Age">
  45. <ItemTemplate>
  46. <asp:Label ID="Label5" runat="server" Text='<%#Eval("Age") %>'></asp:Label>
  47. </ItemTemplate>
  48. <EditItemTemplate>
  49. <asp:TextBox ID="TextBox5" runat="server" Text='<%#Eval("Age") %>'></asp:TextBox>
  50. </EditItemTemplate>
  51. </asp:TemplateField>
  52. <asp:TemplateField HeaderText="Branch">
  53. <ItemTemplate>
  54. <asp:Label ID="Label6" runat="server" Text='<%#Eval("Branch") %>'></asp:Label>
  55. </ItemTemplate>
  56. <EditItemTemplate>
  57. <asp:TextBox ID="TextBox6" runat="server" Text='<%#Eval("Branch") %>'></asp:TextBox>
  58. </EditItemTemplate>
  59. </asp:TemplateField>
  60. </Columns>
  61. </asp:GridView>
  62. </ItemTemplate>
  63. </asp:TemplateField>
  64. </Columns>
  65. </asp:GridView>
  66. </div>
  67. </form>
  68. </body>
  69. </html>
Your design will look like the following:

Design View

Write the following code in the aspx.cs page:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Data.SqlClient;
  8. using System.Data;
  9. public partial class Example : System.Web.UI.Page
  10. {
  11. SqlConnection con = new SqlConnection("data source=RAHUL-PC\\RAHUL_PC;initial catalog=Example;Integrated security=true;"); //Create sqlconnection
  12. SqlDataAdapter da;
  13. DataTable dt, dt1;
  14. protected void Page_Load(object sender, EventArgs e)
  15. {
  16. if (!IsPostBack)
  17. {
  18. LoadGVLeader();
  19. }
  20. }
  21. protected void GVLeader_RowCommand(object sender, GridViewCommandEventArgs e)
  22. {
  23. int id = int.Parse(e.CommandName.ToString());
  24. int rowindex = int.Parse(e.CommandArgument.ToString());
  25. GridView GVMember = (GridView)GVLeader.Rows[rowindex].FindControl("GVMember");
  26. Button btn = ((Button)GVLeader.Rows[rowindex].FindControl("Button1"));
  27. if (btn.Text == "See Member")
  28. {
  29. btn.Text = "Cancel";
  30. GVMember.DataSource = LoadGVMember(id);
  31. GVMember.DataBind();
  32. GVMember.Visible = true;
  33. }
  34. else
  35. {
  36. btn.Text = "See Member";
  37. GVMember.Visible = false;
  38. }
  39. }
  40. public void LoadGVLeader()
  41. {
  42. da = new SqlDataAdapter("Select * from TeamLeader", con);
  43. dt = new DataTable();
  44. da.Fill(dt);
  45. GVLeader.DataSource = dt;
  46. GVLeader.DataBind();
  47. }
  48. protected DataTable LoadGVMember(int id)
  49. {
  50. da = new SqlDataAdapter("select * from TeamMember where TLid=" + id, con);
  51. dt1 = new DataTable();
  52. da.Fill(dt1);
  53. return dt1;
  54. }
  55. protected void GVMember_RowEditing(object sender, GridViewEditEventArgs e)
  56. {
  57. GridView Gv = (GridView)sender;
  58. GridViewRow gvrow = (GridViewRow)Gv.Parent.Parent;
  59. int id = int.Parse(GVLeader.DataKeys[gvrow.RowIndex].Value.ToString());
  60. Gv.EditIndex = e.NewEditIndex;
  61. Gv.DataSource = LoadGVMember(id);
  62. Gv.DataBind();
  63. }
  64. protected void GVMember_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
  65. {
  66. GridView Gv = (GridView)sender;
  67. GridViewRow gvrow = (GridViewRow)Gv.Parent.Parent;
  68. int id = int.Parse(GVLeader.DataKeys[gvrow.RowIndex].Value.ToString());
  69. Gv.EditIndex = -1;
  70. Gv.DataSource = LoadGVMember(id);
  71. Gv.DataBind();
  72. }
  73. protected void GVMember_RowUpdating(object sender, GridViewUpdateEventArgs e)
  74. {
  75. GridView Gv = (GridView)sender;
  76. GridViewRow gvrow = (GridViewRow)Gv.Parent.Parent;
  77. int id = int.Parse(GVLeader.DataKeys[gvrow.RowIndex].Value.ToString());
  78. int iid = int.Parse(Gv.DataKeys[e.RowIndex].Value.ToString());
  79. string Name = ((TextBox)(Gv.Rows[e.RowIndex].FindControl("TextBox4"))).Text.Trim();
  80. string Age = ((TextBox)(Gv.Rows[e.RowIndex].FindControl("TextBox5"))).Text.Trim();
  81. string Branch = ((TextBox)(Gv.Rows[e.RowIndex].FindControl("TextBox6"))).Text.Trim();
  82. da = new SqlDataAdapter("Update TeamMember set MemberName='" + Name + "',Age='" + Age + "',Branch='" + Branch + "' where iid=" + iid, con);
  83. dt1 = new DataTable();
  84. da.Fill(dt1);
  85. Gv.EditIndex = -1;
  86. Gv.DataSource = LoadGVMember(id);
  87. Gv.DataBind();
  88. }
  89. }
Now run the website and you will see the following output:

Grid view
When you click on “See Member", then you will see the following:

See Member

Now you can update the team member result on an Edit button click.

edit button click

And after clicking Update, the following is the result:

update member