In this example, we create a nested GridView. In this Griview we will expand the grid to show the complete data regarding a Student with "jQuery" and Filter the GridView using a "Stored Procedure" like this:
Expanding
Filter
Here we filter the Name and Total Marks depending on the Conditions (greater than 90 and less than 30).
Step 1: First we will create a table in the database (here we will use the example of a Student) as in the following:
create table Student
(
id int identity(1,1),
Name varchar(20),
Class varchar(20),
Age int,
s_Address varchar(100),
Phone varchar(20),
Total varchar(20)
)
Step 2: Now we create the nested GridView as in the following:
<asp:GridView ID="gvStudents" runat="server" AutoGenerateColumns="false" DataKeyNames="id"
OnRowDataBound="OnRowDataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<img alt="" style="height: 10px;" src="images/Up.jpg" />
<asp:Panel ID="pnlDetails" runat="server" Style="display: none">
<asp:GridView ID="gvDetails" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField ItemStyle-Width="150px" DataField="id" HeaderText="id" />
<asp:BoundField ItemStyle-Width="150px" DataField="age" HeaderText="age" />
<asp:BoundField ItemStyle-Width="150px" DataField="Class" HeaderText="Class" />
<asp:BoundField ItemStyle-Width="150px" DataField="s_Address" HeaderText="Address" />
<asp:BoundField ItemStyle-Width="150px" DataField="Phone" HeaderText="Phone" />
</Columns>
</asp:GridView>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<HeaderTemplate>
Name:
<asp:DropDownList ID="ddlName" runat="server" OnSelectedIndexChanged="NameChanged"
AutoPostBack="true" AppendDataBoundItems="true">
<asp:ListItem Text="Select" Value="Select"></asp:ListItem>
<asp:ListItem Text="All" Value="All"></asp:ListItem>
</asp:DropDownList>
</HeaderTemplate>
<ItemTemplate>
<%# Eval("Name") %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<HeaderTemplate>
Total
<asp:DropDownList ID="ddlTotal" runat="server" OnSelectedIndexChanged="TotalChanged"
AutoPostBack="true" AppendDataBoundItems="true">
<asp:ListItem Text="Select" Value="Select"></asp:ListItem>
<asp:ListItem Text="All" Value="All"></asp:ListItem>
<asp:ListItem Text="Greater Than 90" Value="90"></asp:ListItem>
<asp:ListItem Text="Less Than 30" Value="30"></asp:ListItem>
</asp:DropDownList>
</HeaderTemplate>
<ItemTemplate>
<%# Eval("Total") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Here we will create a GridView(gvStudents), Inside this GridView, Here we take an
Image(for Exapand and Collapse) and a Panel(pnlDetails) in which we will take an
another GridView(gvDetails) as Nested GridView.
<asp:GridView ID="gvStudents" runat="server" AutoGenerateColumns="false" DataKeyNames="id"
OnRowDataBound="OnRowDataBound">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<img alt="" style="height: 10px;" src="images/Up.jpg" />
<asp:Panel ID="pnlDetails" runat="server" Style="display: none">
<asp:GridView ID="gvDetails" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField ItemStyle-Width="150px" DataField="id" HeaderText="id" />
<asp:BoundField ItemStyle-Width="150px" DataField="age" HeaderText="age" />
<asp:BoundField ItemStyle-Width="150px" DataField="Class" HeaderText="Class" />
<asp:BoundField ItemStyle-Width="150px" DataField="s_Address" HeaderText="Address" />
<asp:BoundField ItemStyle-Width="150px" DataField="Phone" HeaderText="Phone" />
</Columns>
</asp:GridView>
</asp:Panel>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Step 3: Now we will create the HeaderTemplate in our GridView for Filtering the data. Here we will use a DropDownList to filter the data like this:
<headertemplate>
Name:
<asp:DropDownList ID="ddlName" runat="server"
OnSelectedIndexChanged = "NameChanged" AutoPostBack = "true"
AppendDataBoundItems = "true">
<asp:ListItem Text = "Select" Value = "Select"></asp:ListItem>
<asp:ListItem Text = "All" Value = "All"></asp:ListItem>
</asp:DropDownList>
</headertemplate>
<itemtemplate>
<%# Eval("Name") %>
</itemtemplate>
</asp:TemplateField>
<asp:TemplateField>
<headertemplate>
Total:
<asp:DropDownList ID="ddlTotal" runat="server"
OnSelectedIndexChanged = "TotalChanged" AutoPostBack = "true"
AppendDataBoundItems = "true">
<asp:ListItem Text = "Select" Value = "Select"></asp:ListItem>
<asp:ListItem Text = "All" Value = "All"></asp:ListItem>
<asp:ListItem Text = "Greater Than 90" Value = "90"></asp:ListItem>
<asp:ListItem Text = "Less Than 30" Value = "30"></asp:ListItem>
</asp:DropDownList>
</headertemplate>
<itemtemplate>
<%# Eval("Total") %>
</itemtemplate>
</asp:TemplateField>
Step 4: Now we will create the Stored Procedure for Name and Total like this:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetName
@Search VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
IF @Search = 'Select'
SELECT *
FROM Student
ELSE If @Search = 'All'
SELECT *
FROM Student
ELSE IF @Search= '2'
SELECT TOP 2 id, Name, Total
FROM Student
ELSE
SELECT id, Name, Total
FROM Student WHERE Name=@Search
END
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetTotal
@Search VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
IF @Search = 'All'
SELECT *
FROM Student
ELSE IF @Search= '90'
SELECT * from Student where Total>@Search
ELSE IF @Search= '30'
SELECT * from Student where Total<@Search
ELSE
SELECT id, Name, Total
FROM Student WHERE Total=@Search
END
GO
Here we set the value of the search depending on the value of the DropDownList, by which we can filter the data like this:
<asp:ListItem Text = "Select" Value = "Select"></asp:ListItem>
<asp:ListItem Text = "All" Value = "All"></asp:ListItem>
<asp:ListItem Text = "Greater Than 90" Value = "90"></asp:ListItem>
<asp:ListItem Text = "Less Than 30" Value = "30"></asp:ListItem>
Here we will set the ListItem value "All" so the SP calls the following query:
IF @Search = 'All'
SELECT *
FROM Student
Step 5: Now we will write our jQuery function for expanding and collapasing the data:
<script type="text/javascript">
$("[src*=Up]").live("click", function () {
$(this).closest("tr").after("<tr><td></td><td colspan = '1000'>" + $(this).next().html() + "</td></tr>")
$(this).attr("src", "images/Down.jpg");
});
$("[src*=Down]").live("click", function () {
$(this).attr("src", "images/Up.jpg");
$(this).closest("tr").next().remove();
});
</script>
Here we will use the two images (Up.jpg and Down.jpg), so when we click on the image (Up.jpg) a new row will be added. This is called Expanding and when we click on the Down.jpg the row is removed, this is called collapsing.
Step 6: Now we will write the code in the .cs page as in the following:
if (!IsPostBack)
{
ViewState["Search"] = "All";
ViewState["Search1"] = "All";
BindName();
BindTotal();
gvStudents.DataSource = GetData("select * from Student");
gvStudents.DataBind();
}
Step 7: Now we will write the code to filter the data by name as in the following:
protected void NameChanged(object sender, EventArgs e)
{
DropDownList ddlName = (DropDownList)sender;
ViewState["Search"] = ddlName.SelectedValue;
this.BindName();
}
Here we will assign the DropDownlist Value in the ViewState, so it will be helpful in the filtering of data.
private void BindName()
{
SqlConnection con = new SqlConnection("Data Source=ADMIN-PC\\SQLEXPRESS;Initial Catalog=student;Integrated Security=True");
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand("GetName");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Search", ViewState["Search"].ToString());
cmd.Connection = con;
da.SelectCommand = cmd;
da.Fill(dt);
gvStudents.DataSource = dt;
gvStudents.DataBind();
DropDownList ddlName =
(DropDownList)gvStudents.HeaderRow.FindControl("ddlName");
this.BindNameList(ddlName);
}
Here we will first create the ConnectionString and call the Stored Procedure (GetName) and set the value of the search depending on the value of ViewState["Search"]. And call another funtion (BindNameList) as in the following:
private void BindNameList(DropDownList ddlName)
{
SqlConnection con = new SqlConnection("Data Source=ADMIN-PC\\SQLEXPRESS;Initial Catalog=student;Integrated Security=True");
SqlDataAdapter sda = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand("select * from Student");
cmd.Connection = con;
con.Open();
ddlName.DataSource = cmd.ExecuteReader();
ddlName.DataTextField = "Name";
ddlName.DataValueField = "Name";
ddlName.DataBind();
con.Close();
ddlName.Items.FindByValue(ViewState["Search"].ToString())
.Selected = true;
}
Here we will add the data in the DropDownList(ddlName).
protected void NameChanged(object sender, EventArgs e)
{
DropDownList ddlName = (DropDownList)sender;
ViewState["Search"] = ddlName.SelectedValue;
this.BindName();
}
Like this we will write the code for Total:
private void BindTotal()
{
SqlConnection con = new SqlConnection("Data Source=ADMIN-PC\\SQLEXPRESS;Initial Catalog=student;Integrated Security=True");
DataTable dt1 = new DataTable();
SqlDataAdapter da1 = new SqlDataAdapter();
SqlCommand cmd1 = new SqlCommand("GetTotal");
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.AddWithValue("@Search", ViewState["Search1"].ToString());
cmd1.Connection = con;
da1.SelectCommand = cmd1;
da1.Fill(dt1);
gvStudents.DataSource = dt1;
gvStudents.DataBind();
DropDownList ddlTotal =
(DropDownList)gvStudents.HeaderRow.FindControl("ddlTotal");
this.BindTotalList(ddlTotal);
}
private void BindTotalList(DropDownList ddlTotal)
{
SqlConnection con = new SqlConnection("Data Source=ADMIN-PC\\SQLEXPRESS;Initial Catalog=student;Integrated Security=True");
SqlDataAdapter sda = new SqlDataAdapter();
SqlCommand cmd = new SqlCommand("select * from Student");
cmd.Connection = con;
con.Open();
ddlTotal.DataSource = cmd.ExecuteReader();
ddlTotal.DataTextField = "Total";
ddlTotal.DataValueField = "Total";
ddlTotal.DataBind();
con.Close();
ddlTotal.Items.FindByValue(ViewState["Search1"].ToString())
.Selected = true;
}
protected void TotalChanged(object sender, EventArgs e)
{
DropDownList ddlTotal = (DropDownList)sender;
ViewState["Search1"] = ddlTotal.SelectedValue;
this.BindTotal();
}
Now we will write the code for creating the DataTable like this:
private static DataTable GetData(string query)
{
SqlConnection con = new SqlConnection("Data Source=ADMIN-PC\\SQLEXPRESS;Initial Catalog=student;Integrated Security=True");
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = query;
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataSet ds = new DataSet())
{
DataTable dt = new DataTable();
sda.Fill(dt);
return dt;
}
}
}
}
Step 8: Now we will write the code to fill the data in the GridView (gvDetails) as in the following:
protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string StudentId = gvStudents.DataKeys[e.Row.RowIndex].Value.ToString();
GridView gvDetails = e.Row.FindControl("gvDetails") as GridView;
gvDetails.DataSource = GetData(string.Format("select * from Student where id='" + StudentId + "'"));
gvDetails.DataBind();
}
}
Here we will fill in the data in the GridView depending on the KeyName, that we already specified in our GridView like this:
<asp:GridView ID="gvStudents" runat="server" AutoGenerateColumns="false"
DataKeyNames="id" OnRowDataBound="OnRowDataBound">