Social Icons

miércoles, 15 de septiembre de 2010

Microsoft Charts Controls y MOSS2007

Hacía ya bastante tiempo que sabía de la existencia de estos controles, pero nunca se me había planteado la necesidad de usarlos. Las dos veces que he tenido que hacer graficas las he creado a mano poniendo puntos en un bmp (que es lo más simple)
Sin embargo ahora en Manigent tenemos que hacer un montón de gráficas complejas… pensé en usar Excel Services, pero no tenía sentido mandar datos del modelo de objetos a un libro de Excel y crear la gráfica desde ahí por lo que al final me decidí por usar los controles de .Net

Para ello seguí los pasos de este blog para instalar todo lo necesario en el entorno de desarrollo:
Por supuesto, no leí las instrucciones si no que directamente me puse a crear un webpart.
Lo primero que hice fue referenciar la librería System.Web.DataVisualization que estaba instalada en C:\Program Files\Microsoft Chart Controls\Assemblies\

Y con eso ya puedes crear el webpart en visual studio. El código que usé era una adaptación de un ejemplo que venía en las demos de la documentación:
public class ControlAssessmentChart : Microsoft.SharePoint.WebPartPages.WebPart
    {
        Chart Chart1 = new Chart();

        protected override void CreateChildControls()
        {
            Chart1.Width = 400;
            Chart1.Height = 300;
            Chart1.RenderType = RenderType.ImageTag;

            Chart1.Palette = ChartColorPalette.BrightPastel;
            Title t = new Title("StratEx Testing Chart", Docking.Top,
                new System.Drawing.Font("Trebuchet MS", 14, System.Drawing.FontStyle.Bold)
                , System.Drawing.Color.FromArgb(26, 59, 105));
            Chart1.Titles.Add(t);
            Chart1.ChartAreas.Add("Test 1");

            // create a couple of Test
            Chart1.Series.Add("Test 1");
            Chart1.Series.Add("Test 2");

            //ChartType can also be added to the series
            // add points to Test 1
            Chart1.Series["Test 1"].Points.AddY(5);
            Chart1.Series["Test 1"].Points.AddY(8);
            Chart1.Series["Test 1"].Points.AddY(12);
            Chart1.Series["Test 1"].Points.AddY(6);
            Chart1.Series["Test 1"].Points.AddY(9);
            Chart1.Series["Test 1"].Points.AddY(4);

            // add points to Test 2
            Chart1.Series["Test 2"].Points.AddY(2);
            Chart1.Series["Test 2"].Points.AddY(6);
            Chart1.Series["Test 2"].Points.AddY(18);
            Chart1.Series["Test 2"].Points.AddY(16);
            Chart1.Series["Test 2"].Points.AddY(21);
            Chart1.Series["Test 2"].Points.AddY(14);

            Chart1.BorderSkin.SkinStyle = BorderSkinStyle.Emboss;
            Chart1.BorderColor = System.Drawing.Color.FromArgb(26, 59, 105);
            Chart1.BorderlineDashStyle = ChartDashStyle.Solid;
            Chart1.BorderWidth = 2;

            Chart1.Legends.Add("Legend1");

            Chart1.Legends["Legend1"].Enabled = true;

            Controls.Add(Chart1);
        }
    }
Tras crear el webpart, intenté ejecutarlo en sharepoint y recibí el error:

[HttpException (0x80004005): Error executing child request for ChartImg.axd.]

Para solucionarlo seguí el consejo de este foro y añadí la línea:
<add path="ChartImg.axd" verb="GET,HEAD" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
En el web.config (dentro de <system.web><httpHandlers>)
Acto seguido volví a intentar ver el webpart, pero me encontré con que:

[DirectoryNotFoundException: Invalid temp directory in chart handler configuration [c:\TempImageFiles\].]

Para solucionar este tuve que hacer caso a este post y añadir:
<add key="ChartImageHandler" value="storage=file;timeout=20;" />
En el web.config dentro de <appSettings>

Finalmente lo conseguimos.
RadarStackedBarStackedColumn
Estas gráficas corresponden a un mismo set de datos (diferente al del ejemplo) solo cambiando el parámetro ChartType de las series.

Parece potente, a ver como rinde en producción…

No hay comentarios: