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

DataGridView 甘特图样式图表(C# WinForm)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (41投票s)

2015 年 9 月 9 日

CPOL

6分钟阅读

viewsIcon

73878

downloadIcon

5993

在本文中,我们将学习如何使用 C# WinForm 实现 DataGridView 甘特图样式。

引言

在本文中,我们将学习如何在 DataGridView 中创建一个简单的甘特图样式图表来显示项目进度结果。在我之前的文章中,我为 ASP.NET GridView 以及使用 AngularJS 的 MVC 解释了相同的内容。

一些成员要求我为 Winform 使用 DataGridView 做同样的事情。我已经制作了一个功能与我的 Webform 示例相同 的简单程序。请参考这两篇文章以获取有关项目进度管理的更多详细信息。

所有显示结果的业务逻辑都在我的 SQL Server 存储过程中。

正如我在两篇文章中所解释的,所有显示项目管理结果的业务逻辑都在我的存储过程中完成。我已经在我的存储过程中使用了透视查询来显示最终结果。我们可以在代码部分看到有关我如何编写我的过程以显示结果的详细信息。

Using the Code

我们将在数据库 'projectDB' 下创建一个 SCHED_Master 表。以下是创建数据库、表和示例插入查询的脚本。在您的 SQL Server 中运行此脚本。我使用的是 SQL Server 2012。

-- =============================================                               
-- Author      : Shanu                                
-- Create date : 2015-07-13                                 
-- Description : To Create Database,Table and Sample Insert Query                            
-- Latest                               
-- Modifier    : Shanu                                
-- Modify date : 2015-07-13                           
-- =============================================
--Script to create DB,Table and sample Insert data
USE MASTER
GO

-- 1) Check if the Database Exists. If the database exists, then drop and create new DB
IF EXISTS (SELECT [name] FROM sys.databases WHERE [name] = 'projectDB' )
DROP DATABASE projectDB
GO

CREATE DATABASE projectDB
GO

USE projectDB
GO

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

--delete from SCHED_Master

INSERT INTO [dbo].SCHED_Master
           ([ID],[ProjectName],[ProjectType],[ProjectTypeName],_
            [SCHED_ST_DT],[SCHED_ED_DT],[ACT_ST_DT],[ACT_ED_DT],[status])
     VALUES
           (1001,'Project-1',1,'Urgent','2015-06-01 00:00:00.000','2015-09-02 00:00:00.000'
            ,'2015-06-22 00:00:00.000','2015-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,'Project-1',2,'Important','2015-06-12 00:00:00.000','2015-8-02 00:00:00.000'
            ,'2015-06-19 00:00:00.000','2015-8-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,'Project-1',3,'Normal','2015-06-28 00:00:00.000','2015-09-03 00:00:00.000'
            ,'2015-07-02 00:00:00.000','2015-08-24 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,'Project-2',1,'Urgent','2015-06-28 00:00:00.000','2015-08-02 00:00:00.000'
            ,'2015-07-02 00:00:00.000','2015-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,'Project-2',2,'Important','2015-07-09 00:00:00.000','2015-12-22 00:00:00.000'
            ,'2015-06-28 00:00:00.000','2015-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,'Project-2',3,'Normal','2015-06-01 00:00:00.000','2015-08-04 00:00:00.000'
            ,'2015-06-22 00:00:00.000','2015-08-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

创建表后,我们将创建一个存储过程,使用透视查询显示项目进度结果。

我将解释我的过程的每一步,以便您清楚地理解并根据您的表格式创建自己的过程。

步骤 1

使用参数创建过程,并在过程中声明要使用的变量。

请注意,我在这里将 FromDateToDate 设置为静态值。您可以将其更改为 SP 的参数,以根据您的日期范围获得动态结果。

CREATE PROCEDURE [dbo].[usp_ProjectSchedule_Select]
@projectId           VARCHAR(10)  = ''             
AS
BEGIN  
 -- 1. Declared for setting the Schedule Start and End date
 --1.Start /////////////
  Declare   @FromDate          VARCHAR(20)  = '2015-06-08'--DATEADD(mm,-12,getdate())
  Declare   @ToDate            VARCHAR(20)  = '2016-05-06'--DATEADD(mm, 1, getdate())  
  -- used for the pivot table result
  DECLARE @MyColumns AS NVARCHAR(MAX),
    @SQLquery  AS NVARCHAR(MAX)     

第二步

我们已经定义了我们的项目 FromDateEndDate。现在我们需要搜索给定日期的项目进度结果。项目进度图的主要目标是显示数据范围(如周、月、年或日)中的任何一种格式,并在范围内产生连续结果。为了获得连续结果,我将获取开始日期和结束日期的星期日。我将以周视图显示结果,因此我在这里使用了每周的星期日日期,并将所有日期存储到 temptable 中以显示结果。

此临时表用于获取开始日期和结束日期之间的所有天数,以显示为列标题。

-- 2.This Temp table is created to 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

我将上面的 temp 表与实际的 Schedule 表连接起来以比较日期并产生结果。首先,我将检查 Schedule 结果,并使用 union,我将结果与实际结果合并,并将最终结果插入另一个 temp 表以生成我们的透视结果。

注意:对于透视列表中的实际数据,我将结果显示为

  • “-1” – 用于计划和实际结果的结束日期。在我的程序中,我将检查结果值,如果它是“-1”,那么我将显示文本“END”并带有红色背景,以通知用户每个项目的结束日期。
  • “0” – 如果结果值为“0”,则表示该日期不在任何计划或实际日期中,因此应留空。
  • “1” – 如果结果是“1”,则表示计划的开始和结束日期。我将使用蓝色显示计划日期。
  • “2” - 如果结果是“1”,则表示实际的开始和结束日期。我将使用绿色显示计划日期。

这只是一个解释项目进度示例程序的示例过程,您可以根据自己的需求自定义此表、过程和程序,并设置自己的规则和状态来显示结果。

temp 表用于存储带有结果的进度详细信息,我在这里使用了 Union

第一个查询返回计划项目结果,第二个查询返回实际项目结果。这两个查询都将插入到 Temp 表中。

 -- 3. This temp table is created to Schedule details with result here I have used the Union,
 --the 1st query returns the Schedule Project result and the 2nd query 
 --returns the Actual Project result, both these queries 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 and etc 
                        ,  Case when   cast(DATEPART( wk, max(A.SCHED_ED_DT)) _
                                  as varchar(2)) =  _
                                  cast(DATEPART( wk, WkStartSundays) as varchar(2)) _
                                  then -1 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 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.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 -1 else
                            case when min(A.ACT_ST_DT)<= F.WkStartSundays _
                                           AND max(A.ACT_ED_DT) >= F.WkStartSundays
                           then 2 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.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

在这里,我将使用最终的 temp 表结果中的透视查询来显示最终结果。

--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 as Project,viewtype as ViewType,_
                ProjectType as PrpjectType,' + @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;

这是存储过程的完整代码。

-- =============================================  
-- Author      : Shanu                                                                      
-- Create date : 2015-09-07                                                                      
-- Description : To get all project Schedule details  
-- Latest                                                                      
-- Modifier    : Shanu                                                                      
-- Modify date : 2015-09-07                                                                     
-- =============================================   
--  usp_ProjectSchedule_Select 'Project1'               
--  usp_ProjectSchedule_Select ''
-- =============================================
CREATE PROCEDURE [dbo].[usp_ProjectSchedule_Select]
@projectId           VARCHAR(10)  = ''
                                                         
AS                                                                      
BEGIN                                                       
     
 -- 1. Declared for setting the Schedule Start and End date
 --1.Start /////////////
  Declare   @FromDate          VARCHAR(20)  = '2015-06-08'--DATEADD(mm,-12,getdate())
  Declare   @ToDate            VARCHAR(20)  = '2016-05-06'--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 created to 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 to schedule details 
   --    with result here I have used the Union,
   --    the 1st query returns the Schedule Project result and the 2nd query returns 
   --    the Actual Project result, both these queries 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 and etc. 
                        ,  Case when   cast(DATEPART( wk, max(A.SCHED_ED_DT)) _
                           as varchar(2)) =  _
                           cast(DATEPART( wk, WkStartSundays) as varchar(2))  then -1 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 -1 else
                            case when min(A.ACT_ST_DT)<= F.WkStartSundays AND _
                                      max(A.ACT_ED_DT) >= F.WkStartSundays
                           then 2 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.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 displayed 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 as Project,viewtype as ViewType,_
                      ProjectType as PrpjectType,' + @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

如果我们运行该过程,最终输出将如下所示。在这里,我们可以看到我将使用透视查询显示每周的结果。

在 Visual Studio 2015 中创建我们的 Windows 窗体应用程序

必备组件

Visual Studio 2015。您可以在此处下载。

安装 Visual Studio 2015 后,单击开始程序,然后选择Visual Studio 2015

单击新建项目,然后选择Visual C#,然后转到Windows,然后选择Windows Forms Application。选择您的项目位置并输入您的应用程序名称。

设计您的表单。在我的表单中,我添加了一个文本框用于按项目名称搜索详细信息,以及一个用于绑定结果的按钮。

注意:我使用了我的 DataGridView 辅助类来在运行时而不是设计时创建 DataGridView。请参阅我的文章,了解如何创建 DatagridView 辅助类。

窗体加载

在窗体加载时,初始化 DataGridView 并使用辅助类将 DataGridView 添加到 Panel 控件中。初始化 DateGridview 后,将数据绑定到 Grid。

private void shanuDatagridViewPaint_Load(object sender, EventArgs e)
 {
        MasterGrid_Initialize();
        bindData();
  }

初始化 Grid

使用我的辅助类,我将在运行时创建 DataGridView。传递所有参数,如 Grid 背景色、高度、宽度以及所有将在运行时创建的属性,如下所示。

public void MasterGrid_Initialize()
  {
        //First, generate the grid Layout Design
        Helper.ShanuDGVHelper.Layouts(Master_shanuDGV, Color.White, 
        Color.WhiteSmoke, Color.WhiteSmoke, false, Color.WhiteSmoke, 
        true, Color.FromArgb(112, 128, 144), false, false, false, 
        Color.White, 40, 20, "small");

    //Set Height, width and add panel to your selected control

    Helper.ShanuDGVHelper.Generategrid(Master_shanuDGV, pnlGrid, 1000, 600, 10, 10);
    Master_shanuDGV.CellFormatting += new DataGridViewCellFormattingEventHandler
                                      (MasterDGVs_CellFormatting);
     }

正如我们所见,在初始化 DataGridView 后,我使用了 CellFormatting DataGridView 事件。

CellFormatting DataGridView 事件

Cellformatting DataGridView 中,我将检查每个单元格的结果,并设置每个单元格的背景色,以便在 DataGridView 中显示我们的甘特图样式。我将检查项目类型,并为每个项目的实际和计划结果赋予唯一的颜色,以便以更图形化的方式查看结果。

void MasterDGVs_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            try
            {                
                    ProjectType = ds.Tables[0].Rows[e.RowIndex]
                    ["PrpjectType"].ToString(); //e.Value.ToString();
                if (e.ColumnIndex > 2)
                {
                    Color color1= Color.FromArgb(116, 176, 30);//Green
                    Color color2 = Color.FromArgb(0, 76, 153); //Blue

                    if (e.Value.ToString() == "0")
                    {
                        e.Value = "";
                    }
                    if(ProjectType=="1")
                    {
                        color1 = Color.FromArgb(116, 176, 30);  //Green
                        color2 = Color.FromArgb(0, 76, 153);    //Blue
                    }
                    else if (ProjectType == "2")
                    {
                        color1 = Color.FromArgb(218, 165, 32);  //golden rod
                        color2 = Color.FromArgb(255, 215, 0);   //GOLD 
                    }
                    else if (ProjectType == "3")
                    {
                        color1 = Color.FromArgb(147, 112, 219); //medium purple
                        color2 = Color.FromArgb(255, 105, 180); //hot pink
                    }

                    switch (e.Value.ToString())
                    {
                        case "-1":
                            e.CellStyle.BackColor = Color.FromArgb(255, 69, 0);  // Orange
                            e.CellStyle.SelectionBackColor = 
                                        Color.FromArgb(255, 69, 0); // Orange
                            e.CellStyle.ForeColor = Color.White;
                            e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                            e.Value = "END";
                            break;

                        case "2":
                            e.CellStyle.BackColor = color1;
                            e.CellStyle.SelectionBackColor = color1;

                            e.Value = "";
                            break;
                        case "1":
                            e.CellStyle.BackColor = color2;
                            e.CellStyle.SelectionBackColor = color2;
                            e.Value = "";
                            break;
                    }                 
                }
            }
            catch (Exception ex)
            { }
        }

搜索按钮点击

在按钮单击和窗体加载时,我将调用 bindData() 将数据绑定到 DataGridView

private void btnSearch_Click(object sender, EventArgs e)
        {
            bindData();
        }

bindData() 方法

在此方法中,我将存储过程名称和参数传递给业务逻辑类。从业务逻辑类,我将参数和 SP 名称传递给 DAL 类,该类将连接到数据库,获取结果并以 DataSet 的形式返回。BL 返回的最终 DataSet 结果将在 Form 中获取,并将结果绑定到 DatagridView

private void bindData()
        {
            try
            {
                // Bind data to DGV.
                SortedDictionary<string, string> sd = 
                                 new SortedDictionary<string, string>() { };
                sd.Add("@projectId", txtProjectID.Text.Trim());
                                
                ds = new ShanuProjectScheduleBizClass().SelectList(sd);
                Master_shanuDGV.DataSource = null;

                if (ds.Tables[0].Rows.Count > 0)
                {
                    Master_shanuDGV.DataSource = ds.Tables[0];
                }
            }
            catch (Exception ex)
            {
            }
        }

关注点

注意:您还可以通过使用 DatagridviewCell 绘制事件来扩展此程序,以更图形化的方式显示输出。您可以在 DatagridviewCell Painting 事件中绘制自己的自定义格式图表类型。

注意:连接字符串

您可以在 bin 文件夹中找到“DBConnection.txt”,将连接字符串更改为您的 SQL Server DB 设置。

在代码中更改连接字符串

您可以在 Helper/Biz 文件夹中找到“BizBase.cs”。将连接字符串更改为您本地 SQL Server 的连接字符串。

历史

  • 2015 年 9 月 9 日:初始版本
© . All rights reserved.