好库网 好库网首页 | 我的好库
好饱的专栏

C#合并多个PrintDocument

发布者:好饱
发布日期:2012/6/7 13:36:41   更新日期:2012/6/7 13:37:22
阅读次数:4250
评分:4.80
介绍:例子展示了如何合并多个PrintDocument到单个PrintDocument
正文:

 

例子展示了如何合并多个PrintDocument到单个PrintDocument. 我创建了一个类MultiPrintDocument,从PrintDocument派生。

在构造函数中,需要传递PrintDocument实例数组作为参数。

 

下面是MultiPrintDocument类的使用方法:

[C#]

// 假设我们需要加入3个 PrintDocument的实例 doc1, doc2 and doc3
MultiPrintDocument multiDoc;
multiDoc = new MultiPrintDocument(new PrintDocument[] { doc1, doc2, doc3 });
MultiPrintDocument重载了protected方法: OnBeginPrint, OnQueryPageSettings和OnPrintPage。
重载的方法中调用子文档的相应方法,请注意,必须使用反射调用子文档保护的方法。
OnBeginPrint方法在打印文档的第一页前被调用。重写OnBeginPrint方法重置当前的文档索引。
OnQueryPageSettings方法在打印每一页前被调用,可以取得打印页的PageSettings信息。(如:页面方向是横向或纵向)。重载的方法调用当前子文档的OnQueryPageSettings。
OnPrintPage用于打印页面。重载的方法调用当前子文档的OnPrintPage。如果它是文件的最后一页,增量当前文档的索引,并返回一个值,该值指示,仍然有其他的打印页。
以下是MultiPrintDocument类的代码。
[C#]
using System.Drawing.Printing;
using System.Reflection;

public class MultiPrintDocument : PrintDocument
{
  private PrintDocument[] _documents;
  private int _docIndex;
  private PrintEventArgs _args;

  // 构造函数
  public MultiPrintDocument(PrintDocument document1, PrintDocument document2)
  {
    _documents = new PrintDocument[] { document1, document2 };
  }

  public MultiPrintDocument(PrintDocument[] documents)
  {
    _documents = documents;
  }

  // 重载的方法
  protected override void OnBeginPrint(PrintEventArgs e)
  {
    base.OnBeginPrint(e);
    if (_documents.Length == 0)
      e.Cancel = true;

    if (e.Cancel) return;

    _args = e;
    _docIndex = 0;  // 重置当前文档的索引
    CallMethod(_documents[_docIndex], "OnBeginPrint", e);
  }

  protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e)
  {
    e.PageSettings = _documents[_docIndex].DefaultPageSettings;
    CallMethod(_documents[_docIndex], "OnQueryPageSettings", e);
    base.OnQueryPageSettings(e);
  }

  protected override void OnPrintPage(PrintPageEventArgs e)
  {
    CallMethod(_documents[_docIndex], "OnPrintPage", e);
    base.OnPrintPage(e);
    if (e.Cancel) return;
    if (!e.HasMorePages)
    {
      CallMethod(_documents[_docIndex], "OnEndPrint", _args);
      if (_args.Cancel) return;
      _docIndex++;  // increments the current document index

      if (_docIndex < _documents.Length)
      {
        // says that it has more pages (in others documents)
        e.HasMorePages = true;
        CallMethod(_documents[_docIndex], "OnBeginPrint", _args);
      }
    }
  }

  // 使用反射来调用的子文档保护的方法
  private void CallMethod(PrintDocument document, string methodName, object args)
  {
    typeof(PrintDocument).InvokeMember(methodName,
      BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
      null, document, new object[] { args });
  }
}

 

 


评论 [发表评论]
账号 密码 还没帐号呢,现在注册一个?

免责声明:好库网所展示的信息由买卖双方自行提供,其真实性、准确性和合法性由信息发布人负责。好库网不提供任何保证,并不承担任何法律责任。