水如烟

                 顺其自然,水到渠成 LzmTW

文或代码皆是面向初学者.我是爱好者,也是初学者.那些"文章",只按自己理解写,我是不知术语名词的.所以只供参考,也仅供参考.

导航

发布日期: 19/1/2006

作者:水如烟 http://lzmtw.cnblogs.com

摘要:本文提供一种方法实现水晶报表自定义纸张格式进行预览和打印。

关键词:水晶报表 自定义纸张格式 打印

注意
:本文及其中的代码示例均基于 Microsoft Visual Studio 2005版本。

发现真要动手写成文时,需要做的事还真不少。关键的是手头活紧,不能系统的写。看来还是先贴出关键代码吧,然后看时间来重组。
我现在做出来的对话框如图:

关键代码:

Option Strict Off

        
Public Shared Function DrawingPapersizeToCryPapersize(ByVal PrinterName As StringByVal Papersize As Drawing.Printing.PaperSize) As Integer
            
Dim mPapersize As Integer = 0 'defaultPapersize in Crystal
            For Each p As Drawing.Printing.PaperSize In Printing.Papersizes(PrinterName)
                
If p.PaperName = Papersize.PaperName Then
                    mPapersize 
= p.RawKind
                    
Exit For
                
End If
            
Next
            
Return mPapersize
        
End Function

        Public Shared Function Papersizes(ByVal PrinterName As StringAs Drawing.Printing.PaperSize()
            
Dim mPageSetting As New Drawing.Printing.PageSettings
            mPageSetting.PrinterSettings.PrinterName 
= PrinterName
            
Dim mPapersizes(mPageSetting.PrinterSettings.PaperSizes.Count - 1As Drawing.Printing.PaperSize
            mPageSetting.PrinterSettings.PaperSizes.CopyTo(mPapersizes, 
0)
            
Return mPapersizes
        
End Function

        Public Shared Sub DocumentPrintOptionsToCryPrintOptions(ByVal printOptions As PrintOptions, ByVal cryPrintOptions As CrystalDecisions.CrystalReports.Engine.PrintOptions)
            
Try
                
With cryPrintOptions
                    .PrinterName 
= printOptions.PrinterName
                    
If printOptions.Papersize.IsLandscape Then
                        .PaperOrientation 
= CrystalDecisions.Shared.PaperOrientation.Landscape
                    
Else
                        .PaperOrientation 
= CrystalDecisions.Shared.PaperOrientation.Portrait
                    
End If
                    .PaperSize 
= DocumentPapersizeToCryPapersize(printOptions.Papersize) '注意这里,它是Drawing.Printing.Papersize的RawKind值.必须Option Strict Off
                    .ApplyPageMargins(DocumentMarginsToCryMargins(printOptions.Margins))
                
End With
            
Catch ex As Exception

            
End Try

        
End Sub

时间关系,暂贴代码至此,以后再补充,包括对话框里的所有功能。

效果图一



效果图二




呵,上头的横纵向颠倒了。

写文章的时间没有了,过两天我将这部分的项目打包供各位下载试用改进.
写得还是比较粗陋,一个人写赶进度的味道很是不好受,BUG肯定多多.希望有心人改进后将结果返馈出来,供我参考,也供各位参考.

其中的一些细节问题没办法深研.比如纸张的增加修改.我略看了Drawing.Printing.PrinterSettings
按道理应该通过它可以实现纸张增删功能的,可是我现在不会.所以,只能是参考别的仁兄的办法,用API.

谢谢各位.
注:对话框中的Margins是临时设定的边距参数,并非是打印服务器中相应纸张格式的Margins.

CSDN相应贴子:
http://community.csdn.net/Expert/topic/4530/4530505.xml?temp=.9733698
http://community.csdn.net/Expert/topic/4520/4520403.xml?temp=.9242823

因为这个问题目前为止我没看到类似的解决方案,虽惭愧,我也发到首页来了.

代码下载(粗粗的)

频频更新界面,很是不好.时间哪,没法了.
纸张格式增删方面的代码,请参考

博客园 - 虫子的一天
http://wormday.cnblogs.com/archive/2005/12/22/302635.html


1月23日代码更新

1月24日10时更新



1月24日13时