|Published (Last):||24 August 2005|
|PDF File Size:||4.77 Mb|
|ePub File Size:||10.48 Mb|
|Price:||Free* [*Free Regsitration Required]|
I love it. But I want to have all that information as a report. And I want to be able to fiddle with the columns in the report, move them around and resize them, any way I want. It has to be sortable, and groupable, just like we can see on the screen there. And of course, we have to be able to print preview it before we print it.
And can we have it finished by tomorrow? Management love reports. They often appear as an afterthought to the requirement. Yet producing nice looking reports is not a trivial task.
There is at least one reasonable open source reporting solution for. NET , but the ramp up time is still considerable. For a lazy and vain programmer like myself, what I really want is something that takes no effort to implement, yet produces wonderful results. I want to be able to go back to my CEO the same day, show him the nice looking reports that do exactly what he wanted, and then remind him about my overdue raise.
The ListViewPrinter is designed to be just such a solution. As normal, one major design goal of ListViewPrinter was that it should quick and easy to use. Then, it is put into action like this: this. PrintPreview ; And that is it! Within the IDE, you can say which list view it should print, as well as setting lots of formatting options. And with only that one line of code, you will produce something like this: This is not a screen shot of the list view.
This is a print preview of a report that handles paging and shrinking to fit — a report that you can print out and hand to your CEO and finally get that raise you deserve. These can be unrolled to allow the various aspects to be modified. This is good but has its limits. The best that can be done for a Brush is to expose a Color and convert that to a SolidBrush.
And the best that can be done for a Pen is a width and a color. If you want to use a fancier Brush or Pen which you really should to get the best looking reports , you will have to write some code. When choosing formatting, you should remember that the report is organised around blocks: the page header and footer, the group and list headers, and the list cells, are blocks. Within a single block, you can specify: the font to be used for the text the brush used to paint the text the brush used to fill in the area between the borders.
On each side of the block, you can specify: the padding how much whitespace should separate this block from its neighbour the pen used to draw the border. This includes the width of the pen and the brush to be used for drawing the border.
They can equally be set for the Left and Right sides of the block. Much of the flexibility of the formatting comes from the versatility of the Brush class. There are several flavours of Brushes: the SolidBrush as shown in the diagram where the area is painted a single color which can translucent. Time spent understanding the various Brush classes is worth the effort. Getting Down to Business Once the configuration is complete, the main programmatic interface to the ListViewPrinter is simple.
Print ; Interesting Bits of Code There are always lots of little interesting bits that come up when a project like this is written. MarginBounds are not reliable. They work fine during print preview, but when you print a real page, the printout always seems strangely off-center.
And the off-centered-ness is different from printer to printer. The problem is the unreachable areas of the page. There are almost always areas of the page that the printer cannot reach, and these areas are different for different printers.
NET 2. So, to calculate the effective margin for a printout, the code needs to look like this: if this. IsPreview this. MarginBounds; else this. HardMarginX, e. HardMarginY, e. Width, e. Height ; Stateful Execution One thing to keep in mind when printing is that each page is printed separately.
Your code is called to print the next page when the framework requires it, and then it exits again. This means that at the end of each page, the printing code has to store enough state information to be able to resume when the next page is required. If you are not used to programming with finite state machines, this statefulness can take a little getting used to. There are two parts to the watermark problem: how to rotate a string, and how to print the text translucently.
Rotating the text requires either a nice DrawRotatedString method or messing with matrix transformations. This is actually a good thing, since transformations are far more powerful. General transformations defines how to map points from one coordinate space into another coordinate space. NET does have a nice matrix class, with utility methods to create various transformation matrices. Once we have the transformation matrix we want, we simply give it to our Graphics object, and all drawing after that will be transformed.
RotateAt watermarkRotation, Utils. CalculateCenter this. FromArgb alpha, this. WatermarkColorOrDefault ; g. DrawString this. Watermark, this. WatermarkFontOrDefault, brush, this. You will have to dig out your checkbook and cancel your social life for a few weeks. But many applications do use ListViews and this class is designed to help.
If it is in any other view, the report will be blank. This is because, in virtual mode, you cannot use the Items collection. But see the Shameless Plug below for a way around this limitation.
The ListViewPrinter is not, and is not designed to be, a general purpose reporting solution. There is no provision for running totals, placing graphics, drawing triangles, or having vertical text. It just prints list views. For example, when used in conjunction with an ObjectListView, subitems can have images, all custom renderers work, and even virtual list views can be printed. For lazy and vain programmers, the ObjectListView is a big help.
See here for details about ObjectListView. Conclusion Hopefully this code will help you to print out your ListView based data, and to finally get the raise you deserve. History 29 November - Version 1. You can turn off this behaviour by CellFormat. Handle the case where a ListViewItem has less subitems than there are columns in the list view thanks to Bernd Melchert 11 November - Version 1.