In my earlier post Read and Display Data From an Given Sheet of Excel File (.xsl or .xlsx) and Save in SQL Database in ASP.NET I have described how to upload the data from excel sheet to SQL server database.
In this topic I will be showing that uploaded data in the grid view category wise into a collapsible panel. I have made small change on my previous topic, I have added one extra column on the database i.e. ProjId and update 2 fields as bit. Added one new table to fetch the projects from database. So my new structure of the tables is like :
Table CodeReveiw:
CREATE TABLE [dbo].[CodeReview](
[QID] [int] IDENTITY(1,1) NOT NULL,
[Question_Description] [varchar](250) NULL,
[Category] [varchar](50) NULL,
[Reviewed] [bit] NOT NULL,
[ReviewerComments] [varchar](8000) NULL,
[DevelopmentStatus] [bit] NOT NULL,
[DeveloperComments] [varchar](8000) NULL,
[CreartedDate] [datetime] NULL,
[Createdby] [varchar](50) NULL,
[dcmVer] [varchar](5) NULL,
[ProjId] [int] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[CodeReview] ADD CONSTRAINT [DF_CodeReview_Reviewed] DEFAULT ((0)) FOR [Reviewed]
GO
ALTER TABLE [dbo].[CodeReview] ADD CONSTRAINT [DF_CodeReview_DevelopmentStatus] DEFAULT ((0)) FOR [DevelopmentStatus]
GO
ALTER TABLE [dbo].[CodeReview] ADD CONSTRAINT [DF_CodeReview_CreartedDate] DEFAULT (getdate()) FOR [CreartedDate]
GO
Table: ProjectDesc
CREATE TABLE [dbo].[ProjectDesc](
[ProjectID] [int] IDENTITY(1,1) NOT NULL,
[ProjectName] [varchar](50) NULL,
[createtiondate] [datetime] NULL,
[createdby] [varchar](50) NULL,
[IsActive] [char](1) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[ProjectDesc] ADD CONSTRAINT [DF_ProjectDesc_createtiondate] DEFAULT (getdate()) FOR [createtiondate]
GO
ALTER TABLE [dbo].[ProjectDesc] ADD CONSTRAINT [DF_ProjectDesc_IsActive] DEFAULT ('Y') FOR [IsActive]
GO
Note: Please add some data on ProjectDesc table to populate the data in dropdownlist
.aspx page:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Edit.aspx.cs" Inherits="ExcelApplication.Edit" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolKit" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Edit Data</title>
<style type="text/css">
tr.sectiontableentry1 td, tr.sectiontableentry2 td
{
padding: 4px;
}
tr.sectiontableentry1 td
{
padding: 8px 5px;
background: url(hline.gif) repeat-x bottom;
}
tr.sectiontableentry2 td
{
padding: 8px 5px;
background: url(hline.gif) repeat-x bottom #F2F2F2;
}
.cpHeader
{
color: white;
background-color: #719DDB;
font-size: 12px;
font-family: Arial;
font-weight: bold;
cursor: pointer;
height: 20px;
padding: 2px;
padding-top: 18px;
padding-left: 7px;
text-align: left;
vertical-align: middle;
}
.cpBody
{
background-color: #DCE4F9;
font-size: 11px;
font-family: Arial;
font-weight: normal;
border: 10px solid #719DDB;
padding: 4px;
padding-top: 7px;
}
.gridColumn
{
font-size: 11px;
font-family: Arial;
font-weight: normal;
}
</style>
<script type="text/javascript">
function pageLoad()
{
var currentBehavior = null;
var allBehaviors = Sys.Application.getComponents();
for (var loopIndex = 0; loopIndex < allBehaviors.length; loopIndex++)
{
currentBehavior = allBehaviors[loopIndex];
if (currentBehavior.get_name() == "CollapsiblePanelBehavior")
{
currentBehavior._animation._fps = 0;
currentBehavior._animation._duration = 0;
}
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div style="font-family:Arial;">
<asp:Label ID="lblProject" runat="server" Text="Select Project: " Font-Bold="true" Height="20px"></asp:Label>
<asp:DropDownList ID="ddlProject" runat="server" Height="20px" OnSelectedIndexChanged="ddlProject_SelectedIndexChanged" AutoPostBack="True"></asp:DropDownList>
<asp:RequiredFieldValidator ID="rfvProject" Height="20px" runat="server" ControlToValidate="ddlProject" ErrorMessage="*" ForeColor="Red" InitialValue="0" SetFocusOnError="True"></asp:RequiredFieldValidator>
<br />
<asp:Label ID="lblMessage" runat="server"></asp:Label>
</div>
<div id="Main" runat="server" visible="false" width="100%" style="font-family:Arial;">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<h3><b>Category Details : </b></h3>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DataList ID="Repeater1" runat="server"
OnItemDataBound="Repeater1_ItemDataBound" RepeatDirection="Horizontal" Width="100%" >
<ItemTemplate>
<tr>
<td>
<asp:Panel ID="Panel1" runat="server" BackColor="#F2F2F2" Font-Size="Medium">
<div>
<asp:Panel ID="TitlePanel" runat="server" CssClass="cpHeader">
<asp:Label ID="Label2" runat="server" Font-Bold="true" ForeColor="White"><%# DataBinder.Eval(Container.DataItem, "CategoryName")%></asp:Label>
<asp:Image ID="Image1" runat="server" ImageAlign="Right" ImageUrl="~/Images/expand_blue.jpg" />
<asp:Label ID="Label1" runat="server" ForeColor="Blue" Text="(Show details)"></asp:Label></asp:Panel>
<asp:Panel ID="ContentPanel" runat="server" CssClass="cpBody">
<asp:Label ID="lblCategoryName" runat="server" Visible="false" Text='<%# DataBinder.Eval(Container.DataItem, "CategoryName")%>'></asp:Label>
<asp:Label ID="lblEmptyData" runat="server" ForeColor="Red" Text="" Visible="false"></asp:Label>
<asp:GridView ID="GridView1" runat="server" EmptyDataText="No Record Exists!" AutoGenerateColumns="false" AutoGenerateDeleteButton="True" OnRowDeleting="GridView1_RowDeleting" onrowdatabound="GridView1_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="QID" Visible="false">
<ItemTemplate>
<asp:Label ID="lblQID" runat="server" Text='<%#Eval("QID") %>' Visible="false"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Question Description" ItemStyle-CssClass="gridColumn" ItemStyle-Width="25%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<%#Eval("Question_Description")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Category" ItemStyle-CssClass="gridColumn" ItemStyle-Width="10%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:Label ID="lblCategory" runat="server" Text='<%#Eval("Category") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Reviewed" ItemStyle-CssClass="gridColumn" ItemStyle-Width="5%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:CheckBox ID="chkReviewed" runat="server" Checked='<%#Eval("Reviewed") %>'></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Reviewer Comments" ItemStyle-CssClass="gridColumn" ItemStyle-Width="25%">
<ItemTemplate>
<asp:TextBox ID="txtReviewerComments" Width="95%" MaxLength="8000" TextMode="MultiLine" runat="server" Text='<%#Eval("ReviewerComments") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Development Status" ItemStyle-CssClass="gridColumn" ItemStyle-Width="5%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:CheckBox ID="chkDevelopmentStatus" runat="server" Checked='<%#Eval("DevelopmentStatus") %>'></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Developer Comments" ItemStyle-CssClass="gridColumn" ItemStyle-Width="25%">
<ItemTemplate>
<asp:TextBox ID="txtDeveloperComments" Width="95%" MaxLength="8000" TextMode="MultiLine" runat="server" Text='<%#Eval("DeveloperComments") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<br />
<asp:Button ID="btnSave" runat="server" Text="SAVE" OnClick="UpdateButton_Click"></asp:Button>
</asp:Panel>
<ajaxToolKit:CollapsiblePanelExtender ID="cpe" runat="server" TargetControlID="ContentPanel"
ExpandControlID="TitlePanel" CollapseControlID="TitlePanel" ExpandedText="(hide details)"
CollapsedText="(show details)" CollapsedImage="~/Images/expand_blue.jpg" ExpandedImage="~/Images/collapse_blue.jpg"
ImageControlID="Image1" EnableViewState="true" TextLabelID="Label1" Collapsed="true">
</ajaxToolKit:CollapsiblePanelExtender>
</div>
</asp:Panel>
</td>
</tr>
</ItemTemplate>
</asp:DataList>
<br />
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
Note:
1. Please add the reference of the AjaxControlToolkit dll in the project. you can download it from internet.
Desinger file :
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ExcelApplication {
public partial class Edit {
/// <summary>
/// form1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
/// <summary>
/// lblProject control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblProject;
/// <summary>
/// ddlProject control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList ddlProject;
/// <summary>
/// rfvProject control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator rfvProject;
/// <summary>
/// lblMessage control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblMessage;
/// <summary>
/// Main control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlGenericControl Main;
/// <summary>
/// ScriptManager1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.ScriptManager ScriptManager1;
/// <summary>
/// UpdatePanel1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel UpdatePanel1;
/// <summary>
/// Repeater1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DataList Repeater1;
}
}
Code Behind file :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.Text;
namespace ExcelApplication
{
public partial class Edit : System.Web.UI.Page
{
// create SqlConnection
SqlConnection myConnection;
SqlDataAdapter da;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
BindProject();
}
protected void ddlProject_SelectedIndexChanged(object sender, EventArgs e)
{
Main.Visible = true;
BindRepeater();
}
protected void BindProject()
{
try
{
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
SqlCommand myCommand = new SqlCommand("usp_GetProjects",myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myConnection.Open();
da = new SqlDataAdapter(myCommand);
DataSet aus = new DataSet();
da.Fill(aus);
if (aus.Tables[0].Rows.Count > 0)
{
foreach (DataRow Dr in aus.Tables[0].Rows)
{
ddlProject.Items.Add(new ListItem(Dr["ProjectName"].ToString(), Dr["ProjectID"].ToString()));
}
}
ddlProject.Items.Insert(0, "---Select---");
ddlProject.Items[0].Value = "0";
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;
lblMessage.ForeColor = System.Drawing.Color.Red;
lblMessage.Visible = true;
}
finally
{
//Destroy the adapter and close the connection
da.Dispose();
myConnection.Close();
myConnection.Dispose();
}
}
protected void BindRepeater()
{
try
{
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
SqlCommand myCommand = new SqlCommand("usp_GetPanels",myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myConnection.Open();
SqlParameterCollection spc = myCommand.Parameters;
spc.AddWithValue("@ProjID", ddlProject.SelectedValue);
da = new SqlDataAdapter(myCommand);
DataSet aus = new DataSet();
da.Fill(aus);
if (aus.Tables[0].Rows.Count > 0)
{
Repeater1.DataSource = aus;
Repeater1.DataBind();
lblMessage.Visible = false;
}
else
{
lblMessage.Text = "<br />No record exists!";
lblMessage.Visible = true;
lblMessage.ForeColor = System.Drawing.Color.Red;
Main.Visible = false;
}
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;
lblMessage.ForeColor = System.Drawing.Color.Red;
lblMessage.Visible = true;
}
finally
{
//Destroy the adapter and close the connection
da.Dispose();
myConnection.Close();
myConnection.Dispose();
}
}
protected void BindGrid(string ProjectID,string CategoryName,GridView DG)
{
DataListItem ri = (DataListItem)DG.NamingContainer;
Label lblEmptyData = (Label)ri.FindControl("lblEmptyData");
Button btnSave = (Button)ri.FindControl("btnSave");
try
{
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
SqlCommand myCommand = new SqlCommand("usp_GetGridData",myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myConnection.Open();
SqlParameterCollection spc = myCommand.Parameters;
spc.AddWithValue("@ProjectID", ProjectID);
spc.AddWithValue("@CategoryName", CategoryName);
da = new SqlDataAdapter(myCommand);
DataSet aus = new DataSet();
da.Fill(aus);
DG.DataSource = aus;
DG.DataBind();
if (aus.Tables[0].Rows.Count > 0)
{
btnSave.Visible = true;
}
else
{
btnSave.Visible = false;
}
}
catch (Exception ex)
{
lblEmptyData.Text = ex.Message;
lblEmptyData.ForeColor = System.Drawing.Color.Red;
lblEmptyData.Visible = true;
}
finally
{
//Destroy the adapter and close the connection
da.Dispose();
myConnection.Close();
myConnection.Dispose();
}
}
protected void Repeater1_ItemDataBound(object sender, DataListItemEventArgs e)
{
Label Category = (Label)e.Item.FindControl("lblCategoryName");
GridView DataGrid = (GridView)e.Item.FindControl("GridView1");
BindGrid(ddlProject.SelectedValue, Category.Text,DataGrid);
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
GridView GridView1 = (GridView)sender;
DataListItem ri = (DataListItem)GridView1.NamingContainer;
Label lblEmptyData = (Label)ri.FindControl("lblEmptyData");
GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];
Label lbldeleteID = (Label)row.FindControl("lblQID");
Label lbl = (Label)row.FindControl("lblCategory");
try
{
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
myConnection.Open();
SqlCommand myCommand = new SqlCommand("usp_DeleteGridData", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
SqlParameterCollection spc = myCommand.Parameters;
spc.AddWithValue("@QID", lbldeleteID.Text);
spc.AddWithValue("@CategoryName", lbl.Text);
spc.AddWithValue("@ProjectID", ddlProject.SelectedValue);
myCommand.ExecuteNonQuery();
lblEmptyData.Text = "Record deleted successfully";
lblEmptyData.ForeColor = System.Drawing.Color.Green;
lblEmptyData.Visible = true;
BindGrid(ddlProject.SelectedValue, lbl.Text, GridView1);
}
catch (Exception ex)
{
lblEmptyData.Text = ex.Message;
lblEmptyData.ForeColor = System.Drawing.Color.Red;
lblEmptyData.Visible = true;
}
finally
{
//Destroy the adapter and close the connection
myConnection.Close();
myConnection.Dispose();
}
}
protected void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e)
{
GridView GridView1 = (GridView)sender;
DataListItem ri = (DataListItem)GridView1.NamingContainer;
Label lblEmptyData = (Label)ri.FindControl("lblEmptyData");
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
CheckBox chkReviewed = (CheckBox)e.Row.FindControl("chkReviewed");
TextBox txtReviewerComments = (TextBox)e.Row.FindControl("txtReviewerComments");
CheckBox chkDevelopmentStatus = (CheckBox)e.Row.FindControl("chkDevelopmentStatus");
TextBox txtDeveloperComments = (TextBox)e.Row.FindControl("txtDeveloperComments");
if (chkReviewed.Checked)
{
chkReviewed.Enabled = false;
txtReviewerComments.ReadOnly = true;
}
else
{
chkReviewed.Enabled = true;
txtReviewerComments.ReadOnly = false;
}
if (chkDevelopmentStatus.Checked)
{
chkDevelopmentStatus.Enabled = false;
txtDeveloperComments.ReadOnly = true;
}
else
{
chkDevelopmentStatus.Enabled = true;
txtDeveloperComments.ReadOnly = false;
}
}
}
catch (Exception ex)
{
lblEmptyData.Text = ex.Message;
lblEmptyData.Visible = true;
}
}
protected void UpdateButton_Click(object sender, EventArgs e)
{
Button btnSave = (Button)sender;
DataListItem ri = (DataListItem)btnSave.NamingContainer;
Label lblEmptyData = (Label)ri.FindControl("lblEmptyData");
GridView gv = (GridView)ri.FindControl("GridView1");
Label lblCategoryName = (Label)ri.FindControl("lblCategoryName");
StringBuilder sb = new StringBuilder();
sb.Append("<root>");
for (int i = 0; i < gv.Rows.Count; i++)
{
Label lblQID = (Label)gv.Rows[i].FindControl("lblQID");
CheckBox chkReviewed = (CheckBox)gv.Rows[i].FindControl("chkReviewed");
TextBox txtReviewerComments = (TextBox)gv.Rows[i].FindControl("txtReviewerComments");
CheckBox chkDevelopmentStatus = (CheckBox)gv.Rows[i].FindControl("chkDevelopmentStatus");
TextBox txtDeveloperComments = (TextBox)gv.Rows[i].FindControl("txtDeveloperComments");
sb.Append("<row QID='" + lblQID.Text + "' Reviewed='" + chkReviewed.Checked + "' ReviewerComments='" + txtReviewerComments.Text.Trim() +
"' DevelopmentStatus='" + chkDevelopmentStatus.Checked + "' DeveloperComments='" + txtDeveloperComments.Text.Trim() + "'/>");
}
sb.Append("</root>");
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
myConnection.Open();
SqlCommand myCommand = new SqlCommand("usp_UpdateGrid", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@XMLGridData", sb.ToString());
try
{
myCommand.ExecuteNonQuery();
lblEmptyData.Text = "Record(s) updated successfully";
lblEmptyData.Visible = true;
lblEmptyData.ForeColor = System.Drawing.Color.Green;
}
catch (Exception ex)
{
lblEmptyData.Text = ex.Message;
lblEmptyData.Visible = false;
lblEmptyData.ForeColor = System.Drawing.Color.Red;
}
finally
{
myConnection.Close();
myConnection.Dispose();
}
BindGrid(ddlProject.SelectedValue, lblCategoryName.Text, gv);
}
}
}
Now I have created some procedure to fetch,update and delete the data.
1. To retrieve the distint category which will be my name of collapsible panel.
CREATE Procedure [dbo].[usp_GetPanels]
@ProjID varchar(10)
AS
Begin
SELECT distinct(Category) as CategoryName FROM CodeReview WHERE projId=@ProjID
END
2. Get the list of active projects. To populate the projects dropdown.
CREATE Procedure [dbo].[usp_GetProjects]
AS
Begin
Select ProjectID,ProjectName from ProjectDesc where IsActive='Y'
END
3. Get the data to fill datagrid for each panel.
CREATE Procedure [dbo].[usp_GetGridData]
@ProjectID varchar(10),
@CategoryName varchar(50)
AS
Begin
SELECT [QID] ,
[Question_Description],
[Category],
[Reviewed],
[ReviewerComments],
[DevelopmentStatus],
[DeveloperComments] FROM CodeReview WHERE projId=@ProjectID and Category=@CategoryName
END
4. Update the grid data using mass update.
CREATE PROCEDURE [dbo].[usp_UpdateGrid]
(
@XMLGridData XML
)
AS
BEGIN
UPDATE CodeReview
SET Reviewed=TempGridData.Item.value('@Reviewed', 'Bit'),
ReviewerComments=TempGridData.Item.value('@ReviewerComments', 'VARCHAR(8000)'),
DevelopmentStatus=TempGridData.Item.value('@DevelopmentStatus', 'Bit'),
DeveloperComments=TempGridData.Item.value('@DeveloperComments', 'VARCHAR(8000)')
FROM @XMLGridData.nodes('/root/row') AS TempGridData(Item)
WHERE QID=TempGridData.Item.value('@QID', 'VARCHAR(50)')
RETURN 0
END
5. Delete the grid data.
CREATE Procedure [dbo].[usp_DeleteGridData]
@QID varchar(10),
@CategoryName varchar(50),
@ProjectID varchar(50)
AS
Begin
Delete From CodeReview WHERE projId=@ProjectID and Category=@CategoryName and QID=@QID
END
Note: Don't forget the connection string [ConnectionInfo] which need to add in the web.config file :)
Please let me know if you have any doubts.
Happy learning..........
In this topic I will be showing that uploaded data in the grid view category wise into a collapsible panel. I have made small change on my previous topic, I have added one extra column on the database i.e. ProjId and update 2 fields as bit. Added one new table to fetch the projects from database. So my new structure of the tables is like :
Table CodeReveiw:
CREATE TABLE [dbo].[CodeReview](
[QID] [int] IDENTITY(1,1) NOT NULL,
[Question_Description] [varchar](250) NULL,
[Category] [varchar](50) NULL,
[Reviewed] [bit] NOT NULL,
[ReviewerComments] [varchar](8000) NULL,
[DevelopmentStatus] [bit] NOT NULL,
[DeveloperComments] [varchar](8000) NULL,
[CreartedDate] [datetime] NULL,
[Createdby] [varchar](50) NULL,
[dcmVer] [varchar](5) NULL,
[ProjId] [int] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[CodeReview] ADD CONSTRAINT [DF_CodeReview_Reviewed] DEFAULT ((0)) FOR [Reviewed]
GO
ALTER TABLE [dbo].[CodeReview] ADD CONSTRAINT [DF_CodeReview_DevelopmentStatus] DEFAULT ((0)) FOR [DevelopmentStatus]
GO
ALTER TABLE [dbo].[CodeReview] ADD CONSTRAINT [DF_CodeReview_CreartedDate] DEFAULT (getdate()) FOR [CreartedDate]
GO
Table: ProjectDesc
CREATE TABLE [dbo].[ProjectDesc](
[ProjectID] [int] IDENTITY(1,1) NOT NULL,
[ProjectName] [varchar](50) NULL,
[createtiondate] [datetime] NULL,
[createdby] [varchar](50) NULL,
[IsActive] [char](1) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[ProjectDesc] ADD CONSTRAINT [DF_ProjectDesc_createtiondate] DEFAULT (getdate()) FOR [createtiondate]
GO
ALTER TABLE [dbo].[ProjectDesc] ADD CONSTRAINT [DF_ProjectDesc_IsActive] DEFAULT ('Y') FOR [IsActive]
GO
Note: Please add some data on ProjectDesc table to populate the data in dropdownlist
.aspx page:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Edit.aspx.cs" Inherits="ExcelApplication.Edit" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolKit" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Edit Data</title>
<style type="text/css">
tr.sectiontableentry1 td, tr.sectiontableentry2 td
{
padding: 4px;
}
tr.sectiontableentry1 td
{
padding: 8px 5px;
background: url(hline.gif) repeat-x bottom;
}
tr.sectiontableentry2 td
{
padding: 8px 5px;
background: url(hline.gif) repeat-x bottom #F2F2F2;
}
.cpHeader
{
color: white;
background-color: #719DDB;
font-size: 12px;
font-family: Arial;
font-weight: bold;
cursor: pointer;
height: 20px;
padding: 2px;
padding-top: 18px;
padding-left: 7px;
text-align: left;
vertical-align: middle;
}
.cpBody
{
background-color: #DCE4F9;
font-size: 11px;
font-family: Arial;
font-weight: normal;
border: 10px solid #719DDB;
padding: 4px;
padding-top: 7px;
}
.gridColumn
{
font-size: 11px;
font-family: Arial;
font-weight: normal;
}
</style>
<script type="text/javascript">
function pageLoad()
{
var currentBehavior = null;
var allBehaviors = Sys.Application.getComponents();
for (var loopIndex = 0; loopIndex < allBehaviors.length; loopIndex++)
{
currentBehavior = allBehaviors[loopIndex];
if (currentBehavior.get_name() == "CollapsiblePanelBehavior")
{
currentBehavior._animation._fps = 0;
currentBehavior._animation._duration = 0;
}
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div style="font-family:Arial;">
<asp:Label ID="lblProject" runat="server" Text="Select Project: " Font-Bold="true" Height="20px"></asp:Label>
<asp:DropDownList ID="ddlProject" runat="server" Height="20px" OnSelectedIndexChanged="ddlProject_SelectedIndexChanged" AutoPostBack="True"></asp:DropDownList>
<asp:RequiredFieldValidator ID="rfvProject" Height="20px" runat="server" ControlToValidate="ddlProject" ErrorMessage="*" ForeColor="Red" InitialValue="0" SetFocusOnError="True"></asp:RequiredFieldValidator>
<br />
<asp:Label ID="lblMessage" runat="server"></asp:Label>
</div>
<div id="Main" runat="server" visible="false" width="100%" style="font-family:Arial;">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<h3><b>Category Details : </b></h3>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DataList ID="Repeater1" runat="server"
OnItemDataBound="Repeater1_ItemDataBound" RepeatDirection="Horizontal" Width="100%" >
<ItemTemplate>
<tr>
<td>
<asp:Panel ID="Panel1" runat="server" BackColor="#F2F2F2" Font-Size="Medium">
<div>
<asp:Panel ID="TitlePanel" runat="server" CssClass="cpHeader">
<asp:Label ID="Label2" runat="server" Font-Bold="true" ForeColor="White"><%# DataBinder.Eval(Container.DataItem, "CategoryName")%></asp:Label>
<asp:Image ID="Image1" runat="server" ImageAlign="Right" ImageUrl="~/Images/expand_blue.jpg" />
<asp:Label ID="Label1" runat="server" ForeColor="Blue" Text="(Show details)"></asp:Label></asp:Panel>
<asp:Panel ID="ContentPanel" runat="server" CssClass="cpBody">
<asp:Label ID="lblCategoryName" runat="server" Visible="false" Text='<%# DataBinder.Eval(Container.DataItem, "CategoryName")%>'></asp:Label>
<asp:Label ID="lblEmptyData" runat="server" ForeColor="Red" Text="" Visible="false"></asp:Label>
<asp:GridView ID="GridView1" runat="server" EmptyDataText="No Record Exists!" AutoGenerateColumns="false" AutoGenerateDeleteButton="True" OnRowDeleting="GridView1_RowDeleting" onrowdatabound="GridView1_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="QID" Visible="false">
<ItemTemplate>
<asp:Label ID="lblQID" runat="server" Text='<%#Eval("QID") %>' Visible="false"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Question Description" ItemStyle-CssClass="gridColumn" ItemStyle-Width="25%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<%#Eval("Question_Description")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Category" ItemStyle-CssClass="gridColumn" ItemStyle-Width="10%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:Label ID="lblCategory" runat="server" Text='<%#Eval("Category") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Reviewed" ItemStyle-CssClass="gridColumn" ItemStyle-Width="5%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:CheckBox ID="chkReviewed" runat="server" Checked='<%#Eval("Reviewed") %>'></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Reviewer Comments" ItemStyle-CssClass="gridColumn" ItemStyle-Width="25%">
<ItemTemplate>
<asp:TextBox ID="txtReviewerComments" Width="95%" MaxLength="8000" TextMode="MultiLine" runat="server" Text='<%#Eval("ReviewerComments") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Development Status" ItemStyle-CssClass="gridColumn" ItemStyle-Width="5%" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:CheckBox ID="chkDevelopmentStatus" runat="server" Checked='<%#Eval("DevelopmentStatus") %>'></asp:CheckBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Developer Comments" ItemStyle-CssClass="gridColumn" ItemStyle-Width="25%">
<ItemTemplate>
<asp:TextBox ID="txtDeveloperComments" Width="95%" MaxLength="8000" TextMode="MultiLine" runat="server" Text='<%#Eval("DeveloperComments") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<br />
<asp:Button ID="btnSave" runat="server" Text="SAVE" OnClick="UpdateButton_Click"></asp:Button>
</asp:Panel>
<ajaxToolKit:CollapsiblePanelExtender ID="cpe" runat="server" TargetControlID="ContentPanel"
ExpandControlID="TitlePanel" CollapseControlID="TitlePanel" ExpandedText="(hide details)"
CollapsedText="(show details)" CollapsedImage="~/Images/expand_blue.jpg" ExpandedImage="~/Images/collapse_blue.jpg"
ImageControlID="Image1" EnableViewState="true" TextLabelID="Label1" Collapsed="true">
</ajaxToolKit:CollapsiblePanelExtender>
</div>
</asp:Panel>
</td>
</tr>
</ItemTemplate>
</asp:DataList>
<br />
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
Note:
1. Please add the reference of the AjaxControlToolkit dll in the project. you can download it from internet.
Desinger file :
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ExcelApplication {
public partial class Edit {
/// <summary>
/// form1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
/// <summary>
/// lblProject control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblProject;
/// <summary>
/// ddlProject control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DropDownList ddlProject;
/// <summary>
/// rfvProject control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator rfvProject;
/// <summary>
/// lblMessage control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Label lblMessage;
/// <summary>
/// Main control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlGenericControl Main;
/// <summary>
/// ScriptManager1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.ScriptManager ScriptManager1;
/// <summary>
/// UpdatePanel1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel UpdatePanel1;
/// <summary>
/// Repeater1 control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.DataList Repeater1;
}
}
Code Behind file :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.Text;
namespace ExcelApplication
{
public partial class Edit : System.Web.UI.Page
{
// create SqlConnection
SqlConnection myConnection;
SqlDataAdapter da;
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
BindProject();
}
protected void ddlProject_SelectedIndexChanged(object sender, EventArgs e)
{
Main.Visible = true;
BindRepeater();
}
protected void BindProject()
{
try
{
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
SqlCommand myCommand = new SqlCommand("usp_GetProjects",myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myConnection.Open();
da = new SqlDataAdapter(myCommand);
DataSet aus = new DataSet();
da.Fill(aus);
if (aus.Tables[0].Rows.Count > 0)
{
foreach (DataRow Dr in aus.Tables[0].Rows)
{
ddlProject.Items.Add(new ListItem(Dr["ProjectName"].ToString(), Dr["ProjectID"].ToString()));
}
}
ddlProject.Items.Insert(0, "---Select---");
ddlProject.Items[0].Value = "0";
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;
lblMessage.ForeColor = System.Drawing.Color.Red;
lblMessage.Visible = true;
}
finally
{
//Destroy the adapter and close the connection
da.Dispose();
myConnection.Close();
myConnection.Dispose();
}
}
protected void BindRepeater()
{
try
{
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
SqlCommand myCommand = new SqlCommand("usp_GetPanels",myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myConnection.Open();
SqlParameterCollection spc = myCommand.Parameters;
spc.AddWithValue("@ProjID", ddlProject.SelectedValue);
da = new SqlDataAdapter(myCommand);
DataSet aus = new DataSet();
da.Fill(aus);
if (aus.Tables[0].Rows.Count > 0)
{
Repeater1.DataSource = aus;
Repeater1.DataBind();
lblMessage.Visible = false;
}
else
{
lblMessage.Text = "<br />No record exists!";
lblMessage.Visible = true;
lblMessage.ForeColor = System.Drawing.Color.Red;
Main.Visible = false;
}
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;
lblMessage.ForeColor = System.Drawing.Color.Red;
lblMessage.Visible = true;
}
finally
{
//Destroy the adapter and close the connection
da.Dispose();
myConnection.Close();
myConnection.Dispose();
}
}
protected void BindGrid(string ProjectID,string CategoryName,GridView DG)
{
DataListItem ri = (DataListItem)DG.NamingContainer;
Label lblEmptyData = (Label)ri.FindControl("lblEmptyData");
Button btnSave = (Button)ri.FindControl("btnSave");
try
{
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
SqlCommand myCommand = new SqlCommand("usp_GetGridData",myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myConnection.Open();
SqlParameterCollection spc = myCommand.Parameters;
spc.AddWithValue("@ProjectID", ProjectID);
spc.AddWithValue("@CategoryName", CategoryName);
da = new SqlDataAdapter(myCommand);
DataSet aus = new DataSet();
da.Fill(aus);
DG.DataSource = aus;
DG.DataBind();
if (aus.Tables[0].Rows.Count > 0)
{
btnSave.Visible = true;
}
else
{
btnSave.Visible = false;
}
}
catch (Exception ex)
{
lblEmptyData.Text = ex.Message;
lblEmptyData.ForeColor = System.Drawing.Color.Red;
lblEmptyData.Visible = true;
}
finally
{
//Destroy the adapter and close the connection
da.Dispose();
myConnection.Close();
myConnection.Dispose();
}
}
protected void Repeater1_ItemDataBound(object sender, DataListItemEventArgs e)
{
Label Category = (Label)e.Item.FindControl("lblCategoryName");
GridView DataGrid = (GridView)e.Item.FindControl("GridView1");
BindGrid(ddlProject.SelectedValue, Category.Text,DataGrid);
}
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
GridView GridView1 = (GridView)sender;
DataListItem ri = (DataListItem)GridView1.NamingContainer;
Label lblEmptyData = (Label)ri.FindControl("lblEmptyData");
GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];
Label lbldeleteID = (Label)row.FindControl("lblQID");
Label lbl = (Label)row.FindControl("lblCategory");
try
{
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
myConnection.Open();
SqlCommand myCommand = new SqlCommand("usp_DeleteGridData", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
SqlParameterCollection spc = myCommand.Parameters;
spc.AddWithValue("@QID", lbldeleteID.Text);
spc.AddWithValue("@CategoryName", lbl.Text);
spc.AddWithValue("@ProjectID", ddlProject.SelectedValue);
myCommand.ExecuteNonQuery();
lblEmptyData.Text = "Record deleted successfully";
lblEmptyData.ForeColor = System.Drawing.Color.Green;
lblEmptyData.Visible = true;
BindGrid(ddlProject.SelectedValue, lbl.Text, GridView1);
}
catch (Exception ex)
{
lblEmptyData.Text = ex.Message;
lblEmptyData.ForeColor = System.Drawing.Color.Red;
lblEmptyData.Visible = true;
}
finally
{
//Destroy the adapter and close the connection
myConnection.Close();
myConnection.Dispose();
}
}
protected void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e)
{
GridView GridView1 = (GridView)sender;
DataListItem ri = (DataListItem)GridView1.NamingContainer;
Label lblEmptyData = (Label)ri.FindControl("lblEmptyData");
try
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
CheckBox chkReviewed = (CheckBox)e.Row.FindControl("chkReviewed");
TextBox txtReviewerComments = (TextBox)e.Row.FindControl("txtReviewerComments");
CheckBox chkDevelopmentStatus = (CheckBox)e.Row.FindControl("chkDevelopmentStatus");
TextBox txtDeveloperComments = (TextBox)e.Row.FindControl("txtDeveloperComments");
if (chkReviewed.Checked)
{
chkReviewed.Enabled = false;
txtReviewerComments.ReadOnly = true;
}
else
{
chkReviewed.Enabled = true;
txtReviewerComments.ReadOnly = false;
}
if (chkDevelopmentStatus.Checked)
{
chkDevelopmentStatus.Enabled = false;
txtDeveloperComments.ReadOnly = true;
}
else
{
chkDevelopmentStatus.Enabled = true;
txtDeveloperComments.ReadOnly = false;
}
}
}
catch (Exception ex)
{
lblEmptyData.Text = ex.Message;
lblEmptyData.Visible = true;
}
}
protected void UpdateButton_Click(object sender, EventArgs e)
{
Button btnSave = (Button)sender;
DataListItem ri = (DataListItem)btnSave.NamingContainer;
Label lblEmptyData = (Label)ri.FindControl("lblEmptyData");
GridView gv = (GridView)ri.FindControl("GridView1");
Label lblCategoryName = (Label)ri.FindControl("lblCategoryName");
StringBuilder sb = new StringBuilder();
sb.Append("<root>");
for (int i = 0; i < gv.Rows.Count; i++)
{
Label lblQID = (Label)gv.Rows[i].FindControl("lblQID");
CheckBox chkReviewed = (CheckBox)gv.Rows[i].FindControl("chkReviewed");
TextBox txtReviewerComments = (TextBox)gv.Rows[i].FindControl("txtReviewerComments");
CheckBox chkDevelopmentStatus = (CheckBox)gv.Rows[i].FindControl("chkDevelopmentStatus");
TextBox txtDeveloperComments = (TextBox)gv.Rows[i].FindControl("txtDeveloperComments");
sb.Append("<row QID='" + lblQID.Text + "' Reviewed='" + chkReviewed.Checked + "' ReviewerComments='" + txtReviewerComments.Text.Trim() +
"' DevelopmentStatus='" + chkDevelopmentStatus.Checked + "' DeveloperComments='" + txtDeveloperComments.Text.Trim() + "'/>");
}
sb.Append("</root>");
myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionInfo"].ConnectionString);
myConnection.Open();
SqlCommand myCommand = new SqlCommand("usp_UpdateGrid", myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@XMLGridData", sb.ToString());
try
{
myCommand.ExecuteNonQuery();
lblEmptyData.Text = "Record(s) updated successfully";
lblEmptyData.Visible = true;
lblEmptyData.ForeColor = System.Drawing.Color.Green;
}
catch (Exception ex)
{
lblEmptyData.Text = ex.Message;
lblEmptyData.Visible = false;
lblEmptyData.ForeColor = System.Drawing.Color.Red;
}
finally
{
myConnection.Close();
myConnection.Dispose();
}
BindGrid(ddlProject.SelectedValue, lblCategoryName.Text, gv);
}
}
}
Now I have created some procedure to fetch,update and delete the data.
1. To retrieve the distint category which will be my name of collapsible panel.
CREATE Procedure [dbo].[usp_GetPanels]
@ProjID varchar(10)
AS
Begin
SELECT distinct(Category) as CategoryName FROM CodeReview WHERE projId=@ProjID
END
2. Get the list of active projects. To populate the projects dropdown.
CREATE Procedure [dbo].[usp_GetProjects]
AS
Begin
Select ProjectID,ProjectName from ProjectDesc where IsActive='Y'
END
3. Get the data to fill datagrid for each panel.
CREATE Procedure [dbo].[usp_GetGridData]
@ProjectID varchar(10),
@CategoryName varchar(50)
AS
Begin
SELECT [QID] ,
[Question_Description],
[Category],
[Reviewed],
[ReviewerComments],
[DevelopmentStatus],
[DeveloperComments] FROM CodeReview WHERE projId=@ProjectID and Category=@CategoryName
END
4. Update the grid data using mass update.
CREATE PROCEDURE [dbo].[usp_UpdateGrid]
(
@XMLGridData XML
)
AS
BEGIN
UPDATE CodeReview
SET Reviewed=TempGridData.Item.value('@Reviewed', 'Bit'),
ReviewerComments=TempGridData.Item.value('@ReviewerComments', 'VARCHAR(8000)'),
DevelopmentStatus=TempGridData.Item.value('@DevelopmentStatus', 'Bit'),
DeveloperComments=TempGridData.Item.value('@DeveloperComments', 'VARCHAR(8000)')
FROM @XMLGridData.nodes('/root/row') AS TempGridData(Item)
WHERE QID=TempGridData.Item.value('@QID', 'VARCHAR(50)')
RETURN 0
END
5. Delete the grid data.
CREATE Procedure [dbo].[usp_DeleteGridData]
@QID varchar(10),
@CategoryName varchar(50),
@ProjectID varchar(50)
AS
Begin
Delete From CodeReview WHERE projId=@ProjectID and Category=@CategoryName and QID=@QID
END
Note: Don't forget the connection string [ConnectionInfo] which need to add in the web.config file :)
Please let me know if you have any doubts.
Happy learning..........
nice one, put some more article
ReplyDelete