65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (27投票s)

2015年1月27日

CPOL

4分钟阅读

viewsIcon

52358

downloadIcon

1896

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

引言

本文将帮助您使用ASP.NET Gridview创建您自己的基于Web的项目进度安排。在我的一个项目中,我创建了一个基于Web的项目进度安排,但在那个项目中,我使用了Telerik pivot grid。但我想到创建一个相同功能的程序,而无需使用任何第三方控件。因此,我使用ASP.NET Gridview开发了相同的功能,以便每个人都可以下载和使用它。

项目进度安排是项目规划中非常重要的部分。项目类型可以是任何类型,例如软件项目开发规划、生产规划等。在项目中,可能会有两个日期可用,一个是计划开始和结束日期(这是我们项目的初始计划日期或目标日期),另一个是实际开始和结束日期(这是项目实际开始和完成的时间)。对于所有项目,我们需要比较计划日期和实际日期,如果两个日期的差异较大,则需要检查项目是否按计划完成或项目开发是否延迟。

在这里,您可以看到每个项目和项目类型的“视图类型”列,我将显示计划日期的第一行和实际日期的下一行。用户可以比较这两个结果。

在我的程序中,我将显示计划和实际计划的详细信息。通过这种方式,经理可以查看所有项目,或者可以搜索一个项目并查看详细信息并生成报告。

我已经创建了两种进度安排程序

  1. 带有实际日期比较的生产计划进度(上面的图片是第一种类型)。
  2. 带有实际日期和结束日期状态显示的生产计划进度(请参见下面的图片)。

我们可以在这里看到,我在每一行的末尾都显示了一个*星号,这样用户可以很容易地找到每个项目的计划和实际结束日期。

Using the Code

本文的主要目的是创建一个简单的项目进度安排,并将结果与计划日期和实际日期进行比较。

代码部分可以分为

  1. 后端部分(在数据库中使用存储过程)
  2. 前端部分(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

在这里,我创建了一个表,其中包含ProjectNameprojectTypeScheduleStartDateScheduleEndDateActualStartdateActualEndDate。我已经向上面的表中插入了示例数据,其中包含计划和实际的开始和结束日期。我们将使用此示例数据来生成我们的进度安排详细信息。

存储过程:在这个存储过程中,我已经应用了所有逻辑,使用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日:初始发布
© . All rights reserved.