ReportViewer Palette

4 posts, 2 answers
  1. Christine
    Christine avatar
    8 posts
    Member since:
    Jul 2016

    Posted 08 Dec 2016 Link to this post

    I'm not sure exactly which forum/discussion to ask this in. If I'm in the wrong place, I'm sorry.

    I've built a WinForms app that I want to display some reports using the ReportViewer. What I want to do is set the palette for these reports using a custom palette class I've added to the WinForms project.

    I have the reports in their own project so that if users decide they want a web app I can easily reuse the reports (hopefully).

    I don't know how to set the palette on the report and i can't find anything online about how to do this. I know I can go into each report and set the colors individually but that is not efficient or scalable.

    My code in the Winforms app to set the report in the ReportViewer is like this...

    var reportSource = new ReportsLibrary.MyReport();
    reportSource.ReportParameters["MyParam"].Value = value;
    myReportViewer.ReportSource = reportSource;
    myReportViewer.RefreshReport();

     

    I figured out how to use the custom palette with charts within the winforms app like this...

    myChart.Area.View.Palette = new CustomPalette();

     

    I want to be able to do something similar in the Winforms app. I don't want to have to copy my CustomPalette class over to my ReportsLibrary project.

    Is this possible?

    I want to be able to do something like...

    reportSource.Palette = new CustomPalette();

     

    VS2013

    Version R3 2016 (2016.3.914.1)

  2. Answer
    Stef
    Admin
    Stef avatar
    3610 posts

    Posted 09 Dec 2016 Link to this post

    Hello Christine,

    Your question is forwarded to Telerik Reporting.

    You can modify the report instance at run-time e.g.:
    //create an instance of the VS Report
    var reporInstance = new ReportsLibrary.MyReport();
     
    //get the nested Graph item
    var graphItem = reportInstance.Items.Find("Graph1",true)[0] as Telerik.Reporting.Graph;
    //create color palette
    Telerik.Reporting.Drawing.ColorPalette col = new Telerik.Reporting.Drawing.ColorPalette();
     col.Colors.Add(System.Drawing.Color.DodgerBlue);
     col.Colors.Add(System.Drawing.Color.Red);
     col.Colors.Add(System.Drawing.Color.Purple);
     
    //use the color palette
     graphItem.ColorPalette = col;
     
    //create a Report Source object
    var reportSource = new InstanceReportSource { ReportDocument = reportInstance};
    //will be mapped to the report's ReportParameters collection
    reportSource.Parameters.Add("MyParam", value);
     
    myReportViewer.ReportSource = reportSource;
    myReportViewer.RefreshReport();

    The code snippet uses the Find method to get the Graph item used in the report. The modified report instance is wrapped in an InstanceReportSource object that can be used as viewer's ReportSource.

    Regards,
    Stef
    Telerik by Progress
    Telerik UI for WinForms is ready for Visual Studio 2017 RC! Learn more.
  3. Christine
    Christine avatar
    8 posts
    Member since:
    Jul 2016

    Posted 09 Dec 2016 in reply to Stef Link to this post

    Thank you. That got me closer. I'm able to set the custom palette. However, I have 2 on the same screen and for some reason the order of colors are mixed. See attached image.

    I have sorting on both set to TableNumber ASC. I even added ORDER BY TableNumber to the queries. But for some reason it seems the palette gets mixed up.

    code for graphs...

    var reportSource1 = new ReportsLibrary.MyChart1();
    var graphItem1 = reportSource1.Items.Find("graph1", true)[0] as Graph;
    graphItem1.ColorPalette = new CustomReportPalette();
    reportSource1.ReportParameters["MyParam"].Value = value;
    rptCurrentMonth.ReportSource = reportSource1;
    rptCurrentMonth.RefreshReport();
     
    var reportSource2 = new ReportsLibrary.MyChart2();
    var graphItem2 = reportSource1.Items.Find("graph1", true)[0] as Graph;
    graphItem2.ColorPalette = new CustomReportPalette();
    reportSource2.ReportParameters["MyParam"].Value = value;
    rptCurrentYear.ReportSource = reportSource2;
    rptCurrentYear.RefreshReport();

     

    here is the code for the palette...

    public class CustomReportPalette : Telerik.Reporting.Drawing.ColorPalette
    {
        public CustomReportPalette()
        {
            var colorPalette = new CustomColorPalette();
            foreach(Color color in colorPalette.Colors){
                this.Colors.Add(color);
            }
        }
    }
     
    public class CustomColorPalette
    {
        public List<Color> Colors { get; set; }
        public CustomColorPalette()
        {
            Colors = new List<Color>();
            this.Colors.Add(Color.FromArgb(239, 117, 19));
            this.Colors.Add(Color.FromArgb(173, 161, 126));
            this.Colors.Add(Color.FromArgb(239, 209, 89));
            this.Colors.Add(Color.FromArgb(151, 160, 49));
            this.Colors.Add(Color.FromArgb(139, 198, 249));
            this.Colors.Add(Color.FromArgb(122, 108, 122));
            this.Colors.Add(Color.FromArgb(206, 66, 38));
            this.Colors.Add(Color.FromArgb(193, 202, 95));
            this.Colors.Add(Color.FromArgb(23, 69, 117));
            this.Colors.Add(Color.FromArgb(164, 193, 232));
            this.Colors.Add(Color.FromArgb(146, 72, 97));
            this.Colors.Add(Color.FromArgb(231, 182, 249));
            this.Colors.Add(Color.FromArgb(107, 67, 70));
            this.Colors.Add(Color.FromArgb(237, 238, 220));
            this.Colors.Add(Color.FromArgb(152, 176, 135));
            this.Colors.Add(Color.FromArgb(151, 107, 92));
            this.Colors.Add(Color.FromArgb(240, 161, 63));
            this.Colors.Add(Color.FromArgb(192, 72, 48));
            this.Colors.Add(Color.FromArgb(139, 71, 249));
            this.Colors.Add(Color.FromArgb(95, 79, 102));
            this.Colors.Add(Color.FromArgb(212, 114, 103));
            this.Colors.Add(Color.FromArgb(109, 209, 204));
            this.Colors.Add(Color.FromArgb(238, 232, 206));
            this.Colors.Add(Color.FromArgb(145, 126, 121));
            this.Colors.Add(Color.FromArgb(201, 44, 44));
            this.Colors.Add(Color.FromArgb(170, 136, 34));
            this.Colors.Add(Color.FromArgb(38, 61, 20));
            this.Colors.Add(Color.FromArgb(255, 231, 145));
            this.Colors.Add(Color.FromArgb(93, 122, 133));
            this.Colors.Add(Color.FromArgb(197, 86, 102));
            this.Colors.Add(Color.FromArgb(226, 192, 131));
            this.Colors.Add(Color.FromArgb(167, 252, 248));
            this.Colors.Add(Color.FromArgb(146, 161, 221));
            this.Colors.Add(Color.FromArgb(180, 163, 135));
            this.Colors.Add(Color.FromArgb(189, 201, 64));
            this.Colors.Add(Color.FromArgb(77, 75, 23));
            this.Colors.Add(Color.FromArgb(204, 102, 34));
            this.Colors.Add(Color.FromArgb(32, 198, 125));
            this.Colors.Add(Color.FromArgb(136, 133, 54));
            this.Colors.Add(Color.FromArgb(204, 136, 68));
        }
    }

     

     

     

  4. Answer
    Christine
    Christine avatar
    8 posts
    Member since:
    Jul 2016

    Posted 09 Dec 2016 in reply to Christine Link to this post

    Nevermind. I see the typo now. Copy/paste graphItem2 was looking at reportSource1 when should be reportSource2.

     

    Thanks

Back to Top