Here is an example of nested gridview. I have a gridview and inside it another gridview. The innergrid has a dropdownlist control... Now when user changes dropdown selected item i want to get the data of outer gridview.
Here is the code:
<div>
<asp:GridView ID="GridView1" DataKeyNames="id" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" >
<Columns>
<asp:TemplateField HeaderText="Empid">
<ItemTemplate>
<%# Eval("id") %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<%# Eval("EmpName")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="DropDown">
<ItemTemplate>
<asp:GridView ID="innerGrid" AutoGenerateColumns="false" runat="server" OnRowDataBound="innergrid_rowDataBound">
<Columns>
<asp:TemplateField HeaderText="inner grid">
<ItemTemplate>
<asp:DropDownList ID="dd1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="dd1_indexchanged" >
<asp:ListItem Value="1" Text="text1"></asp:ListItem>
<asp:ListItem Value="2" Text="text2"></asp:ListItem>
<asp:ListItem Value="3" Text="text3"></asp:ListItem>
<asp:ListItem Value="4" Text="text4"></asp:ListItem>
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
Code Behind:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Default6 : System.Web.UI.Page
{
DataSet ds = new DataSet();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
createdataset();
bindOuterGrid();
}
}
protected void bindOuterGrid()
{
GridView1.DataSource = ds;
GridView1.DataBind();
}
protected void createdataset()
{
#region "Create table"
DataTable dt = new DataTable();
DataColumn dc;
//EmpId
dc = new DataColumn();
dc.DataType = Type.GetType("System.String");
dc.ColumnName = "id";
dt.Columns.Add(dc);
//EmpName
dc = new DataColumn();
dc.DataType = Type.GetType("System.String");
dc.ColumnName = "EmpName";
dt.Columns.Add(dc);
#endregion
#region "Insert Data"
DataRow dr;
dr = dt.NewRow();
dr[0] = "1";
dr[1] = "John";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "2";
dr[1] = "Jorddon";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "3";
dr[1] = "Mathew";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "4";
dr[1] = "Crook";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "5";
dr[1] = "Andrew";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "6";
dr[1] = "Luthar";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "7";
dr[1] = "Shane";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "8";
dr[1] = "Vince";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "9";
dr[1] = "Smith";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "10";
dr[1] = "Woodsmith";
dt.Rows.Add(dr);
ds.Tables.Add(dt);
#endregion
}
protected void dd1_indexchanged(object sender, EventArgs e)
{
GridViewRow selectedChildRow = (GridViewRow)(((DropDownList)sender).Parent.Parent) ;
//alternatively we can also use
//GridViewRow selectedChildRow = ((DropDownList)sender).NamingContainer as GridViewRow;
GridViewRow selectedParentRow = (GridViewRow)(selectedChildRow.Parent.Parent.Parent.Parent) ;
string s = ((DataBoundLiteralControl)(selectedParentRow.Cells[0].Controls[0])).Text;
Response.Write(s);
//alternatively we can also use
//GridViewRow selectedParentRow = selectedChildRow.NamingContainer.NamingContainer as GridViewRow;
}
protected void innergrid_rowDataBound(object sender, GridViewRowEventArgs e)
{
}
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if(e.Row.RowType == DataControlRowType.DataRow)
{
int[] arr = new int[1]{1};
GridView grd = (GridView)e.Row.FindControl("innerGrid");
grd.DataSource = arr;
grd.DataBind();
}
}
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
}
}