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






4.91/5 (41投票s)
在本文中,我们将学习如何使用 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
使用参数创建过程,并在过程中声明要使用的变量。
请注意,我在这里将 FromDate
和 ToDate
设置为静态值。您可以将其更改为 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)
第二步
我们已经定义了我们的项目 FromDate
和 EndDate
。现在我们需要搜索给定日期的项目进度结果。项目进度图的主要目标是显示数据范围(如周、月、年或日)中的任何一种格式,并在范围内产生连续结果。为了获得连续结果,我将获取开始日期和结束日期的星期日。我将以周视图显示结果,因此我在这里使用了每周的星期日日期,并将所有日期存储到 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 日:初始版本