// In the aspx file:
In the code-behind:
protected void loadGanttChart( int projectNumber, string companyRecId )
{
var start = ( getGanttChartStartDate( projectNumber, companyRecId ) ?? DateTime.Today ).Date;
start = new DateTime( start.Year, start.Month, start.Day ).AddDays( -7 );
var end = ( getGanttChartEndDate( projectNumber, companyRecId ) ?? DateTime.Today.AddDays( 1 ) ).Date;
end = new DateTime( end.Year, end.Month, 1 ).AddDays( 7 );
const string SQL_SELECT = "SELECT [RecId], [Owner], [Status], [Subject], COALESCE( [ProjectStartDate], [AssignedDateTime] ) AS StartDate, [TargetDateTime], [ResolvedDateTime], COALESCE( [ResolvedDateTime], [TargetDateTime], DATEADD( day, CAST( CEILING( CASE COALESCE( [ActualEffort], 0 ) WHEN 0 THEN EstimatedEffort ELSE [ActualEffort] END / 8.0 ) AS INT ), COALESCE( [ProjectStartDate], [AssignedDateTime] ) ) ) AS EndDate, CAST( CEILING( CASE COALESCE( [ActualEffort], 0 ) WHEN 0 THEN EstimatedEffort ELSE [ActualEffort] END / 8.0 ) AS INT ) AS Effort, [ProjectNumber], [ProjectName], [ProjectPercentComplete], CASE COALESCE( [ProjectPhase], '' ) WHEN '' THEN '999 - Phase Not Specified' ELSE [ProjectPhase] END AS ProjectPhase, CASE COALESCE( [ProjectMilestone], '' ) WHEN '' THEN '999 - Milestone Not Specified' ELSE [ProjectMilestone] END AS ProjectMilestone FROM [dbo].[Task] WHERE ProjectNumber = @ProjectNumber AND ParentLink_Category = 'Project' AND IncidentCompanyRecID = @CompanyRecId ORDER BY ProjectNumber, ProjectPhase, ProjectMilestone, StartDate";
using ( SqlConnection conn = new SqlConnection( Definitions.ConnString ) )
{
try
{
conn.Open( );
SqlCommand cmd = new SqlCommand( SQL_SELECT, conn );
cmd.Parameters.AddWithValue( "@ProjectNumber", projectNumber );
cmd.Parameters.AddWithValue( "@CompanyRecID", companyRecId );
SqlDataReader dr = cmd.ExecuteReader( );
DayPilotScheduler1.Resources.Clear( );
DataTable dt = new DataTable( );
dt.Columns.Add( "RecID", typeof( string ) );
dt.Columns.Add( "Owner", typeof( string ) );
dt.Columns.Add( "Status", typeof( string ) );
dt.Columns.Add( "Subject", typeof( string ) );
dt.Columns.Add( "StartDate", typeof( DateTime ) );
dt.Columns.Add( "TargetDateTime", typeof( DateTime ) );
dt.Columns.Add( "ResolvedDateTime", typeof( DateTime ) );
dt.Columns.Add( "EndDate", typeof( DateTime ) );
dt.Columns.Add( "Effort", typeof( int ) );
dt.Columns.Add( "ProjectNumber", typeof( decimal ) );
dt.Columns.Add( "ProjectName", typeof( string ) );
dt.Columns.Add( "ProjectPercentComplete", typeof( short ) );
dt.Columns.Add( "ProjectPhase", typeof( string ) );
dt.Columns.Add( "ProjectMilestone", typeof( string ) );
dt.Columns.Add( "isOverage", typeof( bool ) );
while ( dr.Read( ) )
{
DataRow dRow = dt.NewRow( );
bool hasSlipped = false;
DayPilotScheduler1.Resources.Add( dr[ "Subject" ].ToString( ), dr[ "RecId" ].ToString( ) );
dRow[ "RecID" ] = dr[ "RecID" ].ToString( );
dRow[ "Owner" ] = dr[ "Owner" ].ToString( );
dRow[ "Status" ] = dr[ "Status" ].ToString( );
dRow[ "Subject" ] = dr[ "Subject" ].ToString( );
dRow[ "StartDate" ] = dr[ "StartDate" ];
dRow[ "TargetDateTime" ] = dr[ "TargetDateTime" ];
dRow[ "ResolvedDateTime" ] = dr[ "ResolvedDateTime" ];
dRow[ "Effort" ] = dr[ "Effort" ];
if ( ( ( DateTime )dr[ "EndDate" ] ) > ( ( DateTime )( dr[ "StartDate" ] ) ).Date.AddDays( Convert.ToDouble( ( int )( dr[ "Effort" ] ) ) ) )
{
hasSlipped = true;
dRow[ "endDate" ] = ( ( DateTime )( dRow[ "StartDate" ] ) ).Date.AddDays( Convert.ToDouble( ( int )( dr[ "Effort" ] ) ) );
}
else
{
dRow[ "EndDate" ] = dr[ "EndDate" ];
}
dRow[ "ProjectNumber" ] = dr[ "ProjectNumber" ];
dRow[ "ProjectName" ] = dr[ "ProjectName" ].ToString( );
dRow[ "ProjectPercentComplete" ] = dr[ "ProjectPercentComplete" ];
dRow[ "ProjectPhase" ] = dr[ "ProjectPhase" ].ToString( );
dRow[ "ProjectMilestone" ] = dr[ "ProjectMilestone" ].ToString( );
dRow[ "isOverage" ] = false;
dt.Rows.Add( dRow );
if ( hasSlipped )
{
DataRow dRow2 = dt.NewRow( );
dRow2[ "RecID" ] = dr[ "RecID" ].ToString( );
dRow2[ "Owner" ] = dr[ "Owner" ].ToString( );
dRow2[ "Status" ] = dr[ "Status" ].ToString( );
dRow2[ "Subject" ] = dr[ "Subject" ].ToString( );
dRow2[ "StartDate" ] = ( ( DateTime )( dr[ "StartDate" ] ) ).Date.AddDays( Convert.ToDouble( ( ( int )( dr[ "Effort" ] ) ) ) );
dRow2[ "TargetDateTime" ] = dr[ "TargetDateTime" ];
dRow2[ "ResolvedDateTime" ] = dr[ "ResolvedDateTime" ];
dRow2[ "Effort" ] = dr[ "Effort" ];
dRow2[ "EndDate" ] = dr[ "EndDate" ];
dRow2[ "ProjectNumber" ] = dr[ "ProjectNumber" ];
dRow2[ "ProjectName" ] = dr[ "ProjectName" ].ToString( );
dRow2[ "ProjectPercentComplete" ] = dr[ "ProjectPercentComplete" ];
dRow2[ "ProjectPhase" ] = dr[ "ProjectPhase" ].ToString( );
dRow2[ "ProjectMilestone" ] = dr[ "ProjectMilestone" ].ToString( );
dRow2[ "isOverage" ] = true;
dt.Rows.Add( dRow2 );
}
}
DayPilotScheduler1.StartDate = start;
DayPilotScheduler1.Days = ( int )Math.Ceiling( ( end - start ).TotalDays );
DayPilotScheduler1.DataSource = dt;
DayPilotScheduler1.DataBind( );
DayPilotScheduler1.Update( );
}
catch ( Exception ex )
{
string sPath = System.Web.HttpContext.Current.Request.Url.AbsolutePath;
System.IO.FileInfo oInfo = new System.IO.FileInfo( sPath );
string sCurrentPageName = oInfo.Name;
Response.Write( sCurrentPageName + " : " + ex.Message.ToString( ) );
}
}
}
protected void DayPilotCalendar1_BeforeEventRender( object sender, BeforeEventRenderEventArgs e )
{
DataTable dt = ( DataTable )DayPilotScheduler1.DataSource;
var results = from row in dt.AsEnumerable( )
where row.Field( "RecId" ) == e.Value.ToString( )
select row.Field( "ProjectPercentComplete" );
foreach ( short pctComplete in results )
{
e.PercentComplete = pctComplete;
}
var results2 = from row in dt.AsEnumerable( )
where row.Field( "RecId" ) == e.Value.ToString( )
select row.Field( "isOverage" );
foreach ( bool isOverage in results2 )
{
if ( isOverage )
{
e.BackgroundColor = "red";
e.CssClass = "status_red";
}
else
{
e.BackgroundColor = "lightgreen";
e.CssClass = "status_green";
}
}
e.InnerHTML = Server.HtmlEncode( e.PercentComplete + "%" );
e.EventMoveVerticalEnabled = false;
e.StaticBubbleHTML = String.Format( "{0}
Start: {1}
End: {2}
Percent Complete: {3}%", e.Text, e.Start.ToShortDateString( ), e.End.ToShortDateString( ), e.PercentComplete );
}
protected void DayPilotScheduler1_BeforeTimeHeaderRender( object sender, BeforeTimeHeaderRenderEventArgs e )
{
if ( e.Level == 1 )
{
e.InnerHTML = String.Format( "Week {0}", Week.WeekNrISO8601( e.Start ) );
}
}
protected void DayPilotCalendar1_BeforeResHeaderRender( object sender, BeforeHeaderRenderEventArgs e )
{
if ( !e.IsCorner )
{
e.ToolTip = e.Name;
e.InnerHTML = Util.AbbreviateFileName( e.Name, 20, Util.TruncationEllipsisPlacement.MID );
}
}
protected DateTime? getGanttChartStartDate( int projectNumber, string companyRecId )
{
return ( getGanttChartDate( projectNumber, companyRecId, MinOrMax.MIN ) );
}
protected DateTime? getGanttChartEndDate( int projectNumber, string companyRecId )
{
return ( getGanttChartDate( projectNumber, companyRecId, MinOrMax.MAX ) );
}
protected DateTime? getGanttChartDate( int projectNumber, string companyRecId, MinOrMax minOrMax )
{
DateTime? ret = null;
const string SQL_SELECT = "SELECT TOP 1 COALESCE( [ProjectStartDate], [AssignedDateTime] ) AS OuterDate FROM [dbo].[Task] WHERE ProjectNumber = @ProjectNumber AND ParentLink_Category = 'Project' AND IncidentCompanyRecID = @CompanyRecID ORDER BY OuterDate";
using ( SqlConnection conn = new SqlConnection( Definitions.ConnString ) )
{
try
{
conn.Open( );
SqlDataAdapter da = new SqlDataAdapter( SQL_SELECT + ( minOrMax == MinOrMax.MAX ? " DESC" : "" ), conn );
da.SelectCommand.Parameters.AddWithValue( "@ProjectNumber", projectNumber );
da.SelectCommand.Parameters.AddWithValue( "@CompanyRecID", companyRecId );
DataSet ds = new DataSet( );
da.Fill( ds );
DataTable maxDate = ds.Tables[ 0 ];
DataTable locations = ( DataTable )DayPilotScheduler1.DataSource;
DayPilotScheduler1.Resources.Clear( );
if ( maxDate.Rows.Count > 0 )
{
ret = Convert.ToDateTime( maxDate.Rows[ 0 ][ "OuterDate" ] );
}
}
catch ( Exception ex )
{
string sPath = System.Web.HttpContext.Current.Request.Url.AbsolutePath;
System.IO.FileInfo oInfo = new System.IO.FileInfo( sPath );
string sCurrentPageName = oInfo.Name;
Response.Write( sCurrentPageName + " : " + ex.Message.ToString( ) );
}
return ( ret );
}
}
// The DayPilot css:
/*
DayPilot Scheduler Theme
http://themes.daypilot.org/scheduler/theme/zjd5ue
Compatibility:
DayPilot Pro for ASP.NET WebForms 7.2
http://www.daypilot.org/
DayPilot Pro for ASP.NET MVC 7.2
http://mvc.daypilot.org/
DayPilot Pro for Java 7.2
http://java.daypilot.org/
*/
.hunterblue_main
{
border: 1px solid #0000ff;
}
.hunterblue_main, .hunterblue_main td
{
font-family: Tahoma, Arial, Helvetica, sans-serif;
font-size: 10px;
}
.hunterblue_event {
}
.hunterblue_event_inner {
position: absolute;
margin: 0px;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
padding: 3px;
border: 1px solid #0000ff;
left: 0px;
right: 2px;
top: 0px;
bottom: 3px;
-moz-box-shadow:
inset 0px 0px 2px rgba(255,255,255,0.8),
1px 2px 3px rgba(000,000,000,0.3);
-webkit-box-shadow:
inset 0px 0px 2px rgba(255,255,255,0.8),
1px 2px 3px rgba(000,000,000,0.3);
box-shadow:
inset 0px 0px 2px rgba(255,255,255,0.8),
1px 2px 3px rgba(000,000,000,0.3);
}
.hunterblue_event_bar
{
top: 3px;
left: 4px;
right: 4px;
height: 2px;
background-color: blue;
}
.hunterblue_event_bar_inner
{
position: absolute;
height: 2px;
background-color: orange;
}
.status_red .hunterblue_event_inner
{
background-color: red;
color: #0000ff;
background: -moz-linear-gradient(
top,
#ffffff 0%,
red);
background: -webkit-gradient(
linear, left top, left bottom,
from(#ffffff),
to(red));
filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr="#ffffff", endColorStr="red");
}
.status_green .hunterblue_event_bar_inner
{
background-color: lightgreen;
color: #0000ff;
background: -moz-linear-gradient(
top,
#ffffff 0%,
lightgreen);
background: -webkit-gradient(
linear, left top, left bottom,
from(#ffffff),
to(lightgreen));
filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr="#ffffff", endColorStr="lightgreen");
}
.status_complete .hunterblue_event_bar_inner
{
background-color: #ebf6ff;
color: #0000ff;
background: -moz-linear-gradient(
top,
#ffffff 0%,
#58b4ff);
background: -webkit-gradient(
linear, left top, left bottom,
from(#ffffff),
to(#58b4ff));
filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr="#ffffff", endColorStr="#58b4ff");
}
.hunterblue_timeheadergroup,
.hunterblue_timeheadercol
{
color: #eeeeee;
background: #799fce;
background: -moz-linear-gradient(
top,
#a9c1e0 0%,
#497dbc);
background: -webkit-gradient(
linear, left top, left bottom,
from(#a9c1e0),
to(#497dbc));
filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr="#a9c1e0", endColorStr="#497dbc");
}
.hunterblue_rowheader,
.hunterblue_corner
{
color: #eeeeee;
background: #799fce;
background: -moz-linear-gradient(
left,
#a9c1e0 0%,
#497dbc);
background: -webkit-gradient(
linear, left top, right top,
from(#a9c1e0),
to(#497dbc));
filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr="#a9c1e0", endColorStr="#497dbc", GradientType=1);
}
.hunterblue_rowheader_inner {
padding: 3px;
}
.hunterblue_timeheadergroup_inner,
.hunterblue_timeheadercol_inner
{
position: absolute;
left: 0px;
right: 0px;
top: 0px;
bottom: 0px;
border-right: 1px solid #0000ff;
text-align: center;
padding: 2px;
}
.hunterblue_timeheadergroup_inner {
border-bottom: 1px solid #0000ff;
}
.hunterblue_divider,
.hunterblue_divider_horizontal,
.hunterblue_resourcedivider
{
background-color: #0000ff;
}
.hunterblue_matrix_vertical_line,
.hunterblue_matrix_horizontal_line
{
background-color: #cbc4f5;
}
.hunterblue_cellcolumn
{
background: #ffffff;
}
.hunterblue_message
{
padding: 10px;
opacity: 0.9;
filter: alpha(opacity=90);
color: #ffffff;
background: #0000ff;
background: -moz-linear-gradient(
top,
#1a1aff 0%,
#0000e6);
background: -webkit-gradient(
linear, left top, left bottom,
from(#1a1aff),
to(#0000e6));
filter: progid:DXImageTransform.Microsoft.Gradient(startColorStr="#1a1aff", endColorStr="#0000e6");
}
.hunterblue_shadow_inner
{
background-color: #666666;
opacity: 0.5;
filter: alpha(opacity=50);
height: 100%;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
}