Crystal Reports woes

This took me an hour to figure out so I thought I'd write it down in case it helps anyone else.

If you have a form that's going to display a Crystal Report and you want to zoom it by default, the "normal" way would be to do this in form_Shown:

    private void ReportViewer_Shown(object sender, EventArgs e)
    {
        viewer.Zoom(2); // 1 = page width, 2 = whole page, 25..400 = zoom factor
    }

(Where viewer is the CrystalReportViewer component.)

Unfortunately, it takes CR a while to compute and display the actual report; by the time that happens, the .Zoom() call has already been executed (and ignored).

I have tried a number of workarounds (including launching a thread, waiting for two seconds and then calling the Zoom method - it worked but it was a horrible hack) before I discovered that CR has a "hidden" PageChanged event (it has a [Browsable(false)] attribute). Use that event by assigning a handler in the constructor:

    viewer.PageChanged += Viewer_PageChanged;

and then add the Viewer_PageChanged method:

    private void Viewer_PageChanged(object sender, EventArgs e)
    {
        viewer.Zoom(2);

        viewer.PageChanged -= Viewer_PageChanged;
    }

(Note that, in order to avoid leaking references, I have removed the PageChanged handler immediately after calling the Zoom method.)

Comments

Ben said…
Thanks for sharing. This was killing me trying to do exactly the same thing, now working thanks to your solution. ✌
Marcel said…
Hey, I'm glad to hear that it helped someone!

Popular posts from this blog

Posting dynamic Master / Detail forms with Knockout

Comparing Excel files, take two

EF Code First: seeding with foreign keys