void ControlTreeDataLoader.LoadData() { CssClass = CssClass.ConcatenateWithSpace( CssElementCreator.CssClass ); var rand = new Random(); var actualColors = ( colors ?? getDefaultColors() ).Take( seriesCollection.Count() ) .Pad( seriesCollection.Count(), () => Color.FromArgb( rand.Next( 256 ), rand.Next( 256 ), rand.Next( 256 ) ) ); Func<DataSeries, Color, BaseDataset> datasetSelector; OptionsBase options; switch( setup.ChartType ) { case ChartType.Line: datasetSelector = ( series, color ) => new Dataset( color, series.Values.TakeLast( setup.MaxXValues ) ); options = new LineOptions { bezierCurve = false }; break; case ChartType.Bar: datasetSelector = ( series, color ) => new BaseDataset( color, series.Values.TakeLast( setup.MaxXValues ) ); // ReSharper disable once RedundantEmptyObjectOrCollectionInitializer options = new BarOptions { }; break; default: throw new UnexpectedValueException( setup.ChartType ); } var chartData = new ChartData( setup.Labels.TakeLast( setup.MaxXValues ), seriesCollection.Zip( actualColors, ( series, color ) => datasetSelector( series, color ) ).ToArray() ); var canvas = new HtmlGenericControl( "canvas" ); switch( setup.ChartType ) { case ChartType.Line: case ChartType.Bar: canvas.Attributes.Add( "height", "400" ); break; default: throw new UnexpectedValueException( setup.ChartType ); } Controls.Add( canvas ); if( seriesCollection.Count() > 1 ) { Controls.Add( new Box( "Key", new ControlLine( chartData.datasets.Select( ( dataset, i ) => new Literal { Text = @"<div style='display: inline-block; vertical-align: middle; width: 20px; height: 20px; background-color: {0}; border: 1px solid {1};'> </div> {2}" .FormatWith( dataset.fillColor, dataset.strokeColor, seriesCollection.ElementAt( i ).Name ) } as Control ).ToArray() ).ToSingleElementArray() ) ); } // Remove this when ColumnPrimaryTable supports Excel export. var headers = setup.XAxisTitle.ToSingleElementArray().Concat( seriesCollection.Select( v => v.Name ) ); var tableData = new List<IEnumerable<object>>( seriesCollection.First().Values.Count() ); for( var i = 0; i < tableData.Capacity; i++ ) { var i1 = i; tableData.Add( setup.Labels.ElementAt( i1 ).ToSingleElementArray().Concat( seriesCollection.Select( v => v.Values.ElementAt( i1 ).ToString() ) ) ); } Controls.Add( getExportButton( headers, tableData ) ); var table = new ColumnPrimaryTable( firstDataFieldIndex: 1, items: new EwfTableItem( from i in setup.XAxisTitle.ToSingleElementArray().Concat( setup.Labels ) select i.ToCell() ).ToSingleElementArray() .Concat( from series in seriesCollection select new EwfTableItem( series.Name.ToCell().ToSingleElementArray().Concat( from i in series.Values select i.ToString().ToCell() ) ) ) ); Controls.Add( table ); using( var writer = new StringWriter() ) { writer.WriteLine( "var canvas = document.getElementById( '{0}' );".FormatWith( canvas.ClientID ) ); writer.WriteLine( "canvas.width = $( canvas ).parent().width();" ); writer.WriteLine( "new Chart( canvas.getContext( '2d' ) ).{0}( {1}, {2} );".FormatWith( setup.ChartType, chartData.ToJson(), options.ToJson() ) ); jsInitStatements = writer.ToString(); } }