在VB6中,如果要自定义纸张很方便:
Rpt.PaperSize = crPaperUser
Rpt.SetUserPaperSize lZZG, lZZK
但在C#中却不行了,没有发现 SetUserPaperSize。现在同事的问题是预览时很正常显示中一刀,但点击自带的工具栏打印时,就是 Letter 纸。
本想用 Reflector 跟踪出是否有哪个地方可以利用的,没有结果。
再找网络上的说法,终于在
http://www.cnblogs.com/zeroone/p/3306172.html
中看到关键一行
rptDoc.PrintToPrinter(1, true, 0, 0);
它有一行:PrinterSettings printerSettings = document.PrinterSettings;
而系统自带的工具栏打印时,则是
PrinterSettings settings = new PrinterSettings();
CrystalDecisions.Windows.Forms.CrystalReportViewer
public virtual void PrintReport()
{
this.pageView.PrintReport();
}
CrystalDecisions.Windows.Forms.PageView
public virtual void PrintReport()
{
ReportDocumentBase activeDocument = this.GetActiveDocument();
if (activeDocument != null)
{
activeDocument.Print();
}
}
CrystalDecisions.Windows.Forms.ReportDocumentBase
public void Print()
{
}
想代替,但里面的代码引用了较多私有方法(如:GetLastPageNumber)
如果能重写 PrinterSettings 将是无比兴奋。
但是,没有成功
namespace CrystalDecisions.Windows.Forms
{
class PrinterSettings : System.Drawing.Printing.PrinterSettings
{
public PrinterSettings()
: base()
{
// 它是只读的,另一个对应变量又是私有的
this.DefaultPageSettings = new PageSettings(this);
}
}
class PageSettings:System.Drawing.Printing.PageSettings
{
public PageSettings(System.Drawing.Printing.PrinterSettings printerSettings):base(printerSettings)
{
base.PaperSize = new System.Drawing.Printing.PaperSize("Temp", 100, 100);
}
}
}