نمودار Gantt در DataGridView با استفاده از C# WinForm
یکشنبه 5 مهر 1394در این مقاله قصد داریم چگونگی ایجاد یک نمودار گانت ساده به DataGridView را بررسی کنیم که توسط آن نتایج زمانبندی یک پروژه را نشان دهیم.تمام منطق کسب و کار برای نمایش نتایج، در Stored Procedureهای بانک اطلاعاتی ما وجود دارد.ما از Pivot query در Stored Procedureهای خود استفاده کردیم تا بتوانیم نتایج نهایی را به خوبی نشان دهیم.
در این مقاله از روشی مشابه آنچه که در 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 محلی خود تغییر دهید.
- C#.net
- 3k بازدید
- 2 تشکر