使用ASP.NET GridView进行项目进度安排






4.82/5 (27投票s)
在ASP.NET中使用GridView进行项目进度安排
引言
本文将帮助您使用ASP.NET Gridview
创建您自己的基于Web的项目进度安排。在我的一个项目中,我创建了一个基于Web的项目进度安排,但在那个项目中,我使用了Telerik pivot grid。但我想到创建一个相同功能的程序,而无需使用任何第三方控件。因此,我使用ASP.NET Gridview
开发了相同的功能,以便每个人都可以下载和使用它。
项目进度安排是项目规划中非常重要的部分。项目类型可以是任何类型,例如软件项目开发规划、生产规划等。在项目中,可能会有两个日期可用,一个是计划开始和结束日期(这是我们项目的初始计划日期或目标日期),另一个是实际开始和结束日期(这是项目实际开始和完成的时间)。对于所有项目,我们需要比较计划日期和实际日期,如果两个日期的差异较大,则需要检查项目是否按计划完成或项目开发是否延迟。
在这里,您可以看到每个项目和项目类型的“视图类型”列,我将显示计划日期的第一行和实际日期的下一行。用户可以比较这两个结果。
在我的程序中,我将显示计划和实际计划的详细信息。通过这种方式,经理可以查看所有项目,或者可以搜索一个项目并查看详细信息并生成报告。
我已经创建了两种进度安排程序
- 带有实际日期比较的生产计划进度(上面的图片是第一种类型)。
- 带有实际日期和结束日期状态显示的生产计划进度(请参见下面的图片)。
我们可以在这里看到,我在每一行的末尾都显示了一个*星号,这样用户可以很容易地找到每个项目的计划和实际结束日期。
Using the Code
本文的主要目的是创建一个简单的项目进度安排,并将结果与计划日期和实际日期进行比较。
代码部分可以分为
- 后端部分(在数据库中使用存储过程)
- 前端部分(ASP.NET
Gridview
)
在后端,即在存储过程中,我应用了所有逻辑来生成我们的输出。如果我们只修改我们的存储过程并在我们的ASP.NET中查找结果,这将非常简单。
在ASP.NET中,我使用我创建的Gridview
辅助类动态创建了一个Gridview
。让我们详细了解每一部分。
1. 首先,我们从后端开始
创建表:我已经创建并插入了将在本项目中使用的示例数据。以下是创建
和插入
查询的脚本。
CREATE TABLE [dbo].[SCHED_Master](
[ID] [int] NOT NULL,
[ProjectName] [varchar](100) NULL,
[ProjectType] int NULL,
[ProjectTypeName] [varchar](100) NULL,
[SCHED_ST_DT] [datetime] NULL,
[SCHED_ED_DT] [datetime] NULL,
[ACT_ST_DT] [datetime] NULL,
[ACT_ED_DT] [datetime] NULL,
[status] int null
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, _
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
-- Insert Query
INSERT INTO [dbo].SCHED_Master
([ID],[ProjectName],[ProjectType],[ProjectTypeName],_
[SCHED_ST_DT],[SCHED_ED_DT],[ACT_ST_DT],[ACT_ED_DT],[status])
VALUES
(1001,'Project1',1,'Urgent','2014-06-01 00:00:00.000','2014-09-02 00:00:00.000'
,'2014-06-22 00:00:00.000','2014-08-26 00:00:00.000',1)
INSERT INTO [dbo].SCHED_Master
([ID],[ProjectName],[ProjectType],[ProjectTypeName],_
[SCHED_ST_DT],[SCHED_ED_DT],[ACT_ST_DT],[ACT_ED_DT],[status])
VALUES
(1002,'Project1',2,'Important','2014-09-22 00:00:00.000','2014-12-22 00:00:00.000'
,'2014-09-19 00:00:00.000','2014-12-29 00:00:00.000',1)
INSERT INTO [dbo].SCHED_Master
([ID],[ProjectName],[ProjectType],[ProjectTypeName],_
[SCHED_ST_DT],[SCHED_ED_DT],[ACT_ST_DT],[ACT_ED_DT],[status])
VALUES
(1003,'Project1',3,'Normal','2015-01-01 00:00:00.000','2015-03-24 00:00:00.000'
,'2015-01-01 00:00:00.000','2015-03-14 00:00:00.000',1)
INSERT INTO [dbo].SCHED_Master
([ID],[ProjectName],[ProjectType],[ProjectTypeName],_
[SCHED_ST_DT],[SCHED_ED_DT],[ACT_ST_DT],[ACT_ED_DT],[status])
VALUES
(1004,'Project2',1,'Urgent','2014-07-01 00:00:00.000','2014-09-02 00:00:00.000'
,'2014-07-22 00:00:00.000','2014-08-26 00:00:00.000',1)
INSERT INTO [dbo].SCHED_Master
([ID],[ProjectName],[ProjectType],[ProjectTypeName],_
[SCHED_ST_DT],[SCHED_ED_DT],[ACT_ST_DT],[ACT_ED_DT],[status])
VALUES
(1005,'Project2',2,'Important','2014-09-29 00:00:00.000','2014-12-22 00:00:00.000'
,'2014-09-08 00:00:00.000','2014-12-14 00:00:00.000',1)
INSERT INTO [dbo].SCHED_Master
([ID],[ProjectName],[ProjectType],[ProjectTypeName],_
[SCHED_ST_DT],[SCHED_ED_DT],[ACT_ST_DT],[ACT_ED_DT],[status])
VALUES
(1006,'Project2',3,'Normal','2015-01-01 00:00:00.000','2015-03-04 00:00:00.000'
,'2015-01-01 00:00:00.000','2015-02-24 00:00:00.000',1)
-- Select Query
select ID,ProjectName,ProjectType,ProjectTypeName,SCHED_ST_DT,_
SCHED_ED_DT,ACT_ST_DT,ACT_ED_DT,status from SCHED_Master
在这里,我创建了一个表,其中包含ProjectName
、projectType
、ScheduleStartDate
、ScheduleEndDate
、ActualStartdate
和ActualEndDate
。我已经向上面的表中插入了示例数据,其中包含计划和实际的开始和结束日期。我们将使用此示例数据来生成我们的进度安排详细信息。
存储过程:在这个存储过程中,我已经应用了所有逻辑,使用Pivot查询来生成我们的进度安排输出。在我的过程中,我在每个部分都添加了注释,以便用户更好地理解。
-- =============================================
-- Author : Shanu
-- Create date : 2014-11-24
-- Description : To get all prject Schedule details
-- Latest
-- Modifier : Shanu
-- Modify date : 2014-11-24
-- =============================================
-- usp_ProjectSchedule_FNStatus 'Project1'
-- usp_ProjectSchedule_FNStatus ''
-- =============================================
Alter PROCEDURE [dbo].[usp_ProjectSchedule_FNStatus]
@projectId VARCHAR(10) = ''
AS
BEGIN
-- 1. Declared for setting the Schedule Start and End date
--1.Start /////////////
Declare @FromDate VARCHAR(20) = '2014-05-29'--DATEADD(mm,-12,getdate())
Declare @ToDate VARCHAR(20) = '2015-05-01'--DATEADD(mm, 1, getdate())
-- used for the pivot table result
DECLARE @MyColumns AS NVARCHAR(MAX),
@SQLquery AS NVARCHAR(MAX)
--// End of 1.
-- 2.This Temp table is to created for get all the days
-- between the start date and end date to display as the Column Header
--2.Start /////////////
IF OBJECT_ID('tempdb..#TEMP_EveryWk_Sndays') IS NOT NULL
DROP TABLE #TEMP_EveryWk_Sndays
DECLARE @TOTALCount INT
Select @TOTALCount= DATEDIFF(dd,@FromDate,@ToDate);
WITH d AS
(
SELECT top (@TOTALCount) AllDays = DATEADD(DAY, ROW_NUMBER()
OVER (ORDER BY object_id), REPLACE(@FromDate,'-',''))
FROM sys.all_objects
)
SELECT distinct DATEADD(DAY, 1 - DATEPART(WEEKDAY, AllDays), _
CAST(AllDays AS DATE))WkStartSundays ,1 as status
into #TEMP_EveryWk_Sndays
FROM d
where
AllDays <= @ToDate
AND AllDays >= @FromDate
-- test the sample temptable with select query
-- select * from #TEMP_EveryWk_Sndays
--///////////// End of 2.
-- 3. This temp table is created toScedule details with result here I have used the Union,
--the 1st query return the Schedule Project result and the 2nd query
--returns the Actual Project result both this query will be inserted to a Temp Table
--3.Start /////////////
IF OBJECT_ID('tempdb..#TEMP_results') IS NOT NULL
DROP TABLE #TEMP_results
SELECT ProjectName,viewtype,ProjectType,resultnew,YMWK
INTO #TEMP_results
FROM(
SELECT
A.ProjectName ProjectName -- Our Project Name
,'1-Scd' viewtype -- Our View type first we display
-- Schedule Data and then Actual
, A. ProjectType ProjectType -- Our Project type here you can
-- use your own status as Urgent,
-- normal, etc.
, Case when cast(DATEPART( wk, max(A.SCHED_ED_DT)) _
as varchar(2)) = cast(DATEPART( wk, WkStartSundays) _
as varchar(2)) then 2 else
case when min(A.SCHED_ST_DT)<= F.WkStartSundays _
AND max(A.SCHED_ED_DT) >= F.WkStartSundays
then 1 else 0 end end resultnew -- perfectResult as I expect
, RIGHT(YEAR(WkStartSundays), 2)+'-'+'W'+convert(varchar(2),_
Case when len(DATEPART( wk, WkStartSundays))='1' then '0'+
cast(DATEPART( wk, WkStartSundays) as varchar(2)) _
else cast(DATEPART( wk, WkStartSundays) as varchar(2)) END
) as 'YMWK' -- Here we display Year/month and Week of our
-- Schedule which will be displayed as the Column
FROM -- here you can youe your own table
SCHED_Master A (NOLOCK)
LEFT OUTER JOIN
#TEMP_EveryWk_Sndays F (NOLOCK) ON A.status= F.status
WHERE -- Here you can check your own where conditions
A.ProjectName like '%' + @projectId
AND A.status=1
AND A.ProjectType in (1,2,3)
AND A.SCHED_ST_DT <= @ToDate
AND A.SCHED_ED_DT >= @FromDate
GROUP BY
A.ProjectName
, A. ProjectType
,A.SCHED_ED_DT
,F.WkStartSundays
UNION -- This query is to result the Actual result
SELECT
A.ProjectName ProjectName -- Our Project Name
,'2-Act' viewtype -- Our View type first
-- we display Schedule Data and then Actual
, A. ProjectType ProjectType -- Our Project type here you can
-- use your own status as Urgent,normal and etc
, Case when cast(DATEPART( wk, max(A.ACT_ED_DT)) _
as varchar(2)) = cast(DATEPART( wk, WkStartSundays) _
as varchar(2)) then 2 else
case when min(A.ACT_ST_DT)<= F.WkStartSundays _
AND max(A.ACT_ED_DT) >= F.WkStartSundays
then 1 else 0 end end resultnew -- perfectResult as i expect
, RIGHT(YEAR(WkStartSundays), 2)+'-'+'W'+_
convert(varchar(2),Case when len(DATEPART( wk, WkStartSundays))='1' _
then '0'+
cast(DATEPART( wk, WkStartSundays) as varchar(2)) _
else cast(DATEPART( wk, WkStartSundays) as varchar(2)) END
) as 'YMWK' -- Here we display Year/month and Week of
-- our Schedule which will be displayed
-- as the Column
FROM -- here, you can use your own table
SCHED_Master A (NOLOCK)
LEFT OUTER JOIN
#TEMP_EveryWk_Sndays F (NOLOCK) ON A.status= F.status
WHERE -- Here, you can check your own where conditions
A.ProjectName like '%' + @projectId
AND A.status=1
AND A.ProjectType in (1,2,3)
AND A.ACT_ST_DT <= @ToDate
AND A.ACT_ED_DT >= @FromDate
GROUP BY
A.ProjectName
, A. ProjectType
,A.SCHED_ED_DT
,F.WkStartSundays
) q
--3.End /////////////
--4.Start /////////////
--here, first we get all the YMWK which should be display in Columns we use this
--in our next pivot query
select @MyColumns = STUFF((SELECT ',' + QUOTENAME(YMWK)
FROM #TEMP_results
GROUP BY YMWK
ORDER BY YMWK
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
--here we use the above all YMWK to display its result as column and row display
set @SQLquery = N'SELECT ProjectName,viewtype,ProjectType,' + @MyColumns + N' from
(
SELECT
ProjectName,
viewtype,
ProjectType,
YMWK,
resultnew as resultnew
FROM #TEMP_results
) x
pivot
(
sum(resultnew)
for YMWK in (' + @MyColumns + N')
) p order by ProjectName, ProjectType,viewtype'
exec sp_executesql @SQLquery;
END
2. ASP.NET Gridview代码部分
我已经使用我的辅助类动态创建了gridview
。在我的辅助类中,我有以下函数来简化设计和绑定。用户可以扩展我的辅助类并在他们的项目中使用它。
- 布局
- 数据绑定
- 模板列
Gridview布局 “ShanuGDVHelper
”是我的辅助类,用于在运行时创建gridview
。在zip文件中,您可以找到我的辅助类。首先,我设置gridview
的宽度、高度并创建所有绑定列和模板列。在模板列中,我使用了一个占位符。我将向占位符添加一个图像,并且我已经根据项目的类型状态更改了图像URL。
protected void InitializeGridControl()
{
ShanuGDVHelper.Layouts(Grid1, 600, 99, true, false, false, true, true);
ShanuGDVHelper.BoundColumnFormat(Grid1, "Project Name",
"ProjectName", HorizontalAlign.Left, 0, "", "", false, true,
VerticalAlign.Middle, HorizontalAlign.Left);
ShanuGDVHelper.BoundColumnFormat(Grid1, "view Type", "viewtype",
HorizontalAlign.Left, 0, "", "", false, true,
VerticalAlign.Middle, HorizontalAlign.Left);
ShanuGDVHelper.BoundColumnFormat(Grid1, "Project Type",
"ProjectType", HorizontalAlign.Left, 0, "", "", false, true,
VerticalAlign.Middle, HorizontalAlign.Left);
SortedDictionary<string, string=""> sd = new SortedDictionary<string, string="">() { };
sd.Add("@projectId", txtProjectID.Text.Trim());
DataSet ds = new DataSet();
ds = new ShanuProjectScheduleBizClass().SelectList(sd);
for (int i = 3; i < ds.Tables[0].Columns.Count; i++)
{
ShanuGDVHelper.Templatecolumn
(Grid1, ds.Tables[0].Columns[i].ColumnName, ds.Tables[0].Columns[i].ColumnName,
HorizontalAlign.Left, 0, GDVControlType.placeholder, "", true,
VerticalAlign.Middle, HorizontalAlign.Left);
}
//grid events
////////Grid1.RowCommand+=new GridViewCommandEventHandler(Grid1_RowCommand);
//////// Grid1.RowCreated+=new GridViewRowEventHandler(Grid1_RowCreated);
}</string,></string,>
图像绑定:使用Item模板类,我将图像绑定到占位符,并根据状态显示图像。
void plcHolder_DataBinding(object sender, EventArgs e)
{
PlaceHolder txtdata = (PlaceHolder)sender;
GridViewRow container = (GridViewRow)txtdata.NamingContainer;
object dataValue = DataBinder.Eval(container.DataItem, DataFieldName);
object dataValue1 = DataBinder.Eval(container.DataItem, "ProjectType"); // here, I
// have used this column as static user can change this to work
// with your program. Here, I have used this to check for
// Project type status and load the images
Image img = new Image();
if (Convert.ToInt32(dataValue) == 1)
{
img.ImageUrl = GetImage(Convert.ToInt32(dataValue1.ToString()));
}
else if (Convert.ToInt32(dataValue) == 2)
{
img.ImageUrl = GetImage_ScdEnd(Convert.ToInt32(dataValue1.ToString()));
}
else
{
img.ImageUrl = "~/Images/blanks.jpg";
}
img.Style["float"] = "center";
txtdata.Controls.Add(img);
}
private string GetImage(int value)
{
if (value == 1)
{
return "~/Images/red_new1.jpg";
}
else if (value == 2)
{
return "~/Images/blue_new1.jpg";
}
else
{
return "~/Images/green_new1.jpg";
}
}
将数据集绑定到Gridview:在我的项目中,我使用了一个Biz
类和一个SQL辅助类来连接数据库并将数据集返回以绑定gridview
。您可以在我的zip文件的“App_code”文件夹下找到Biz
和SQL辅助类。用户可以通过projectName
搜索项目,例如,在按钮点击事件中,我已经调用了SelectList
方法将结果绑定到Gridview
。
public void SelectList()
{
SortedDictionary<string, string=""> sd = new SortedDictionary<string, string="">() { };
sd.Add("@projectId", txtProjectID.Text.Trim());
DataSet ds = new DataSet();
ds = new ShanuProjectScheduleBizClass().SelectList(sd);
if (ds.Tables.Count > 0)
{
if (ds.Tables[0].Rows.Count > 0)
{
ShanuGDVHelper.DataBinds(Grid1, ds, false);
}
}
}
// Button Click event
protected void btnSearch_Click(object sender, ImageClickEventArgs e)
{
SelectList();
}</string,>
您可以看到,在这里我已经调用了我的Biz
类“SelectList
”方法来返回dataset
。在我的biz
类方法中,我将发送我的Sp
名称来获取数据。
//to return the dataset
public DataSet SelectList(SortedDictionary<string, string=""> sd)
{
try
{
return SqlHelper.ExecuteDataset(ConnectionString,
CommandType.StoredProcedure, "usp_ProjectSchedule", GetSdParameter(sd));
}
catch (Exception ex)
{
throw ex;
}
}
结论
本文的主要目的是创建一个简单的基于Web的项目进度安排监控程序。我希望您喜欢我的文章,如果您有任何问题,请随时留言。
历史
- 2014年11月24日:初始发布