// 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; }