Пример #1
0
        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};'>&nbsp;</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();
            }
        }