نمودار Gantt در DataGridView با استفاده از C# WinForm

یکشنبه 5 مهر 1394

در این مقاله قصد داریم چگونگی ایجاد یک نمودار گانت ساده به DataGridView را بررسی کنیم که توسط آن نتایج زمانبندی یک پروژه را نشان دهیم.تمام منطق کسب و کار برای نمایش نتایج، در Stored Procedureهای بانک اطلاعاتی ما وجود دارد.ما از Pivot query در Stored Procedureهای خود استفاده کردیم تا بتوانیم نتایج نهایی را به خوبی نشان دهیم.

 نمودار Gantt در DataGridView با استفاده از C# WinForm

در این مقاله از روشی مشابه آنچه که در WebForm پیاده سازی می شود. در ادامه یک نمونه برنامه ساده را مورد بررسی قرار می دهیم. جزییات را در بخش کد نویسی مشاهده کنید.

بخش کد نویسی

در ابتدا بانک اطلاعاتی با نام ProjectDB را ایجاد کرده و سپس جدولی با نام SCHED_Master  را می سازیم. در زیر اسکریپتی برای ایجاد پایگاه داده، جدول و نمونه query وارد شده، مطرح کرده ایم. این اسکریپت را در SQL Server  خود اجرا کنید(ما از SQL Server 2012استفاده کرده ایم).

کد ایجاد بانک اطلاعاتی و جدول مربوطه

    USE MASTER GO Check for the Database Exists.If the database is exist 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]

کد وارد کردن Query

delet 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  
    )

انتخاب Query

بعد از ایجاد جدول، از یک Stored Procedure  برای نمایش نتایج زمانبندی پروژه استفاده می کنیم که در آن Pivot query بکار رفته است.

ما در ادامه تمام مراحل را به صورت قدم به قدم توضیح می دهیم :

مرحله 1: یک پروسیجر با متغیرها و پارامترهایی تعریف می شود که در SP استفاده می گردد.

(دقت کنید که در اینجا ما FormDat و ToDat  را به صورت استاتیک تعیین کرده ایم و شما می توانید آنها را به صورت پارامترهایی از SP برای دریافت نتایج پویا در هر محدوده زمانی تغییر دهید.)

Alter 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)

مرحله 2:

در این مرحله از پروژه، FormDate و EndDate  را تعریف می کنیم و اکنون نیاز داریم که نتایج برنامه زمانبندی را از یک تاریخ مشخص جستجو کنیم. هدف اصلی از نمودار زمانبندی، نمایش طیفی از داده ها در هفته می باشد. برای دریافت پیوسته نتایج، روز دوشنبه را به عنوان تاریخ شروع و پایان در نظر می گیریم. بنابراین نتایج هر هفته، از تاریخ روز دوشنبه نشان داده می شود و تمام تاریخ های دیگر برای نمایش نتیجه در یک جدول موقت ذخیره می شود.

جدول موقت برای دریافت تمام روزهای بین تاریخ شروع و تاریخ پایان ایجاد شده تا به عنوان سرتیتر یک ستون نمایش داده شود.

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: در اینجا جدول موقت فوق را به جدول زمانبندی واقعی پیوند میزنیم تا تاریخ ها را برای تولید نتایج مقایسه کند.

در ابتدا جهت دستیابی به نتایج زمانبندی، نتایج در طول هفته را با نتایج واقعی ترکیب می کنیم و آن را در یک جدول موقت دیگر ذخیره می کنیم تا Pivot result ما تولید شود.

توجه: برای داده های واقعی در Pivot list نتایج را به صورت زیر نشان می دهیم:

"1-" برای هردو نتایج واقعی و زمانبندی در نظر گرفته می شود. در برنامه ما مقدار برایند مورد بررسی قرار می گیرد. اگر مقدار برابر " 1-" باشد آنگاه متنی با عنوان " اتمام" با پس زمینه قرمز نشان داده می شود تا تاریخ پایان هر پروژه را به کاربر اطلاع دهد.

"0" _ اگر مقادیر نتیجه "0" باشد آنگاه به این معناست که روزها در تاریخ های واقعی و زمانبندی نیست بنابراین باید آن را به صورت خالی گذاشت.

"1" _اگر مقدار نتیجه "1" باشد به عنوان روزهای شروع و پایان برنامه زمانبندی در نظر گرفته می شود. در اینجا روزهای زمانبندی را با رنگ آبی نمایش می دهیم.

"2"_ اگر نتیجه "2"باشد به عنوان روزهای ابتدا و انتهای واقعی در نظر گرفته می شود . در اینجا نیز رنگ روزهای زمانبندی با سبز نشان داده می شود.

این تنها یک نمونه است که توضیح پروژه فوق را نشان می دهد و شما می توانید آن را با توجه به نیاز های خود تغییر دهید.

اولین Query نتیجه پروژه زمانبندی و دومین Query نتیجه پروژه واقعی را نشان می دهد. هردو کوئری ها در جدول موقت ذخیره می شود.

    --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: در اینجا ما نتایج نهایی را با استفاده از Pivot query  نشان می دهیم که از نتایج جدول موقت بدست می آید.

    --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 disoplay 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;

در زیرکد کامل Stored Procedure آورده شده است.

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 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 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 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 disoplay 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

اگر برنامه را اجرا کنید خروجی به صورت زیر خواهد بود . در اینجا می توانیم نتایج هر هفته را با استفاده از Pivot Query نشان دهیم.

ایجاد Windows Form Application در Visual Studio 2015

پس از نصبVisual Studio 2015 بر روی گزینهstart->program کلیک کرده و #Visual Cرا انتخاب کنید سپس به قسمت Windowsرفته و گزینه Windows Forms Application را انتخاب کنید. از محل ذخیره سازی پروژه نام برنامه خود را وارد و آن را اجرا کنید. مراحل گفته شده به صورت شکل زیر می باشد.

فرم خود را طراحی کنید. در فرم ما یک Textbox برای جستجوی نتایج توسط نام پروژه اضافه شده و یک button برای محدود کردن اطلاعات نتایج وجود دارد.

توجه: ما از کلاس های DataGridView helper های خود برای ایجاد DataGridView در زمان اجرا استفاده کرده ایم به جای اینکه در زمان طراحی ایجاد شود.

Form Load

در مقدار دهی اولیه Form Load، ایجاد  Data GridView و اضافه کردن DataGridView به پنل کنترلی با استفاده از کلاس های Helper انجام می پذیرد. بعد از مقدار دهی اولیه DataGridView ، داده ها به Grid متصل می شوند.

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

مقدار دهی اولیه Grid

با استفاده از کلاس های helper  استفاده شده در این برنامه ما یک 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

در CellFormatting  ما نتیجه هر سلول را کنترل می کنیم و رنگ پس زمینه مناسب را برای هر کدام از سلول ها تنظیم کرده ایم تا نمودار گانت را به طور مناسب نشان دهد.

ما در هر نوع پروژه کنترل می کنیم که برای هرکدام از نتایج واقعی و زمانبندی شده، رنگ واحد برای خروجی گرافیکی در نظر گرفته شود.

    void MasterDGVs_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
    {  
        try {  
            ProjectType = ds.Tables[0].Rows[e.RowIndex]["PrpjectType"].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) {}  
    }

دکمه جستجو

برای Buttonو FormLoad متد bindData() را برای اتصال داده به DataGridView فراخوانی می کنیم.

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

متد bindData()

در این متد نام stored procedure و پارامترها را به کلاس Business Logic منتقل می ­کنیم.  با استفاده از کلاس  Business Logic پارامترها  و نام sp  را به کلاس DAL منتقل می­ کنیم که به بانک اطلاعاتی متصل خواهد شد، نتایج را می­ گیرد و آن را به عنوان مجموعه داده به بانک اطلاعاتی بر­می گرداند.

نتایج نهایی DataSet از Bl ، در فرم دریافت خواهد شد و نتیجه را به 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 painting  انجام می پذیرد. شما می­ توانید قالب و فرمت های سفارشی خود را در رویداد DatagridviewCell painting  بکشید.

توجه:Connection String

شما می­ توانید" DBConnection.txt" را در پوشه bin پیدا کرده و تنظیمات Connection String را به دیتا بیس SQL Server  خود تغییر دهید.

کد تغییر Connection String در زیر وجود دارد.

شما می­توانید "BizBase.cs"  را در پوشه Helper/Biz  پیدا کنید. Connection String را به کانکشن SQL Server محلی خود تغییر دهید.

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 2 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید