单击打印按钮时系统崩溃

时间:2011-08-05 08:29:16

标签: c# winforms pdf exception-handling system

我这样做是为了在运行时生成pdf,当我点击打印按钮时 当我点击打印按钮时,这个过程是这样的,pdf是用文件夹生成的。

为此,我这样做了:

private void btnPrint_Click(object sender, EventArgs e)
{

    private const string PAYMENT_PATH = @"c:\xxxxx\xxxxx\paymentType_{0}";

    btnPrint.Visible = true;
    btnPrint.Enabled = true;

    string pay = cbpaymenttype.Text;
    string dds = cbddprovider.Text;

    string path = String.Format(PAYMENT_PATH, DateTime.Now.ToString("ddMMyyyyHHmm"));

    //List<paymenttypeprint> paymenttype = new List<paymenttypeprint>();

    List<printfunctions> printfunction = new List<printfunctions>();
    foreach (ListViewItem item in lstviewcashmembers.Items)
    {

        printfunctions allpayments = new printfunctions();
        allpayments.member_Lastname = item.SubItems[1].Text;
        allpayments.member_Firstname = item.SubItems[2].Text;
        allpayments.Postcode = item.SubItems[3].Text;
        allpayments.ddReference = item.SubItems[4].Text;
        allpayments.ddprovider = item.SubItems[5].Text;
        allpayments.Monthlyamount = Convert.ToDecimal(item.SubItems[6].Text);
        allpayments.MembershipType = item.SubItems[7].Text;
        allpayments.Status = item.SubItems[8].Text;
        allpayments.Enddate = Convert.ToDateTime(item.SubItems[9].Text);
        allpayments.paymentmethods = item.SubItems[10].Text;
        printfunction.Add(allpayments);
    }

    new printFunction(printfunction, new Company(mf.gBaseUrl).GetSingleLineCompanyDetails(), path, pay, dds);

    System.Diagnostics.Process.Start("explorer.exe", path);
}

我已经创建了这样的类printfunctions

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using PdfSharp;
using PdfSharp.Drawing;
using PdfSharp.Pdf;
using PdfSharp.Drawing.Layout;
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using MigraDoc.DocumentObjectModel.Shapes;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.DocumentObjectModel.Fields;
using System.IO;

namespace classes
{
    public class printfunctions
    {
        public string member_Lastname;
        public string member_Firstname;
        public string Postcode;
        public string ddReference;
        public string ddprovider;
        public decimal Monthlyamount;
        public string MembershipType;
        public string Status;
        public DateTime Enddate;
        public string paymentmethods;
    }

    public class printFunction
    {
        private Document _document;
        private Table _table;
        private List<printfunctions> _array;
        private string _address;
        private string _paymethod;
        private string _ddproviders;

        public printFunction(List<printfunctions> array, string address, string exportpath, string paymentmethod, string ddproviders)
        {
            _array = array;
            _address = address;
            _paymethod = paymentmethod;
            _ddproviders = ddproviders;

            Document ddreportdoc = CreateDocument();
            PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true);

            pdfRenderer.Document = ddreportdoc;

            if (!Directory.Exists(exportpath))
                Directory.CreateDirectory(exportpath);

            pdfRenderer.RenderDocument();

            if (paymentmethod != "All")
            {
                pdfRenderer.Save(String.Format(@"{0}\{1}  MEMBERS REPORT.pdf", exportpath, _paymethod));
            }
            else if (ddproviders != "")
            {
                pdfRenderer.Save(String.Format(@"{0}\{1} MEMBERS REPORT.pdf", exportpath, _ddproviders));
            }
        }

        public Document CreateDocument()
        {

            _document = new Document();

            if (_ddproviders != "")
            {
                _document.Info.Title = string.Format("{0}", _ddproviders);
            }
            else if (_paymethod != "All")
            {

                _document.Info.Title = string.Format("{0}", _paymethod);
            }
            _document.Info.Author = "xxxxxxx";

            DefineStyles();
            CreatePage();
            FillContent();

            return _document;
        }

        private void DefineStyles()
        {
            Style style = _document.Styles["Normal"];
            style.Font.Name = "Verdana";

            style = _document.Styles[StyleNames.Header];
            style.ParagraphFormat.AddTabStop("8cm", TabAlignment.Right);

            style = _document.Styles[StyleNames.Footer];
            style.ParagraphFormat.AddTabStop("7cm", TabAlignment.Center);

            // Create a new style called Table based on style Normal
            style = _document.Styles.AddStyle("Table", "Normal");
            style.Font.Name = "Verdana";
            style.Font.Size = 6;

            // Create a new style called Reference based on style Normal
            style = _document.Styles.AddStyle("Reference", "Normal");
            style.ParagraphFormat.SpaceBefore = "6mm";
            style.ParagraphFormat.SpaceAfter = "6mm";
            style.ParagraphFormat.TabStops.AddTabStop("6cm", TabAlignment.Right);

        }

        private void CreatePage()
        {
            Section section = _document.AddSection();

            // Create footer
            Paragraph paragraph = section.Footers.Primary.AddParagraph();
            paragraph.AddText(_address);
            paragraph.Format.Font.Size = 8;
            paragraph.Format.Alignment = ParagraphAlignment.Center;

            paragraph = section.AddParagraph();
            paragraph.Format.SpaceBefore = "1.3cm";
            paragraph.Style = "Reference";
            if (_paymethod == "All")
            {
                paragraph.AddFormattedText(string.Format("{0} MEMBERS MONTHLY REPORT", _paymethod), TextFormat.Bold);
            }
            else if (_ddproviders == "All providers")
            {

                paragraph.AddFormattedText(string.Format("{0} MEMBERS MONTHLY REPORT", _ddproviders), TextFormat.Bold);
            }
            paragraph.AddTab();
            paragraph.AddDateField("dd MMM yyyy");

            _table = section.AddTable();
            _table.Style = "Table";
            _table.Borders.Color = new Color(0, 0, 0);

            //Defining the columns

            Column column = _table.AddColumn("1.7cm"); //Lastname
            column.Format.Alignment = ParagraphAlignment.Center;

            column = _table.AddColumn("1.7cm"); // first name
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // postcode
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // DD ref
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); //DD provider Name
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // Monthly Amount
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // mship type
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // status
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // Expiry date
            column.Format.Alignment = ParagraphAlignment.Left;

            column = _table.AddColumn("1.7cm"); // payment type
            column.Format.Alignment = ParagraphAlignment.Right;

            // Create the header of the _table
            Row row = _table.AddRow();
            row.HeadingFormat = row.Format.Font.Bold = true;
            row.Format.Alignment = ParagraphAlignment.Center;

            row.Cells[0].AddParagraph("Last Name");
            row.Cells[0].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[1].AddParagraph("First Name");
            row.Cells[1].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[2].AddParagraph("Post Code");
            row.Cells[2].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[3].AddParagraph("DD Reference");
            row.Cells[3].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[4].AddParagraph("DDProvider Name");
            row.Cells[4].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[5].AddParagraph("Monthly Amount");
            row.Cells[5].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[6].AddParagraph("Memebrship Type");
            row.Cells[6].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[7].AddParagraph("Status");
            row.Cells[7].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[8].AddParagraph("ExpiryDate");
            row.Cells[8].Format.Alignment = ParagraphAlignment.Left;

            row.Cells[9].AddParagraph("payment type");
            row.Cells[9].Format.Alignment = ParagraphAlignment.Left;
        }

        private void FillContent()
        {
            foreach (var item in _array)
            {
                // Each item fills two rows
                Row row1 = _table.AddRow();
                row1.TopPadding = 1.0;
                Paragraph paragraph;

                row1.Cells[0].VerticalAlignment = VerticalAlignment.Center;
                row1.Cells[0].Format.Alignment = ParagraphAlignment.Left;
                row1.Cells[0].AddParagraph(item.member_Lastname);

                row1.Cells[1].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[1].AddParagraph(item.member_Firstname);

                row1.Cells[2].Format.Alignment = ParagraphAlignment.Left;
                paragraph = row1.Cells[2].AddParagraph(item.Postcode);

                row1.Cells[3].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[3].AddParagraph(item.ddReference);

                row1.Cells[4].Format.Alignment = ParagraphAlignment.Left;
                paragraph = row1.Cells[4].AddParagraph(item.ddprovider);

                row1.Cells[5].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[5].AddParagraph(item.Monthlyamount.ToString("F2"));

                row1.Cells[6].Format.Alignment = ParagraphAlignment.Left;
                paragraph = row1.Cells[6].AddParagraph(item.MembershipType);

                row1.Cells[7].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[7].AddParagraph(item.Status);

                row1.Cells[8].Format.Alignment = ParagraphAlignment.Left;
                paragraph = row1.Cells[8].AddParagraph(item.Enddate.ToString("dd MMM yyyy"));

                row1.Cells[9].Format.Alignment = ParagraphAlignment.Right;
                paragraph = row1.Cells[9].AddParagraph(item.paymentmethods);
            }
        }
    }
}

ListView lstviewcashmembers的行数达到100或300时,它的工作正常,但当ListView lstviewcashmembers有1600行时它不起作用。

系统在此行崩溃:

pdfRenderer.RenderDocument();

执行没有进入下一行,它也没有显示任何异常,当我点击打印按钮并且ListView有1600行时系统崩溃了。

我的代码在运行时使用MigraDoc和PDFsharp库生成PDF有什么问题吗?

有人请帮忙吗.....

非常感谢........

 MODIFIED :  It will take four minutes  for generating pdf so how should I reduce this time 

对此有任何帮助

非常感谢

2 个答案:

答案 0 :(得分:0)

在VS中启用异常处理,例如here,您将获得确切的异常描述。查看您的问题描述听起来像这可能是行数限制。顺便提一下,查看链接。

问候。

答案 1 :(得分:0)

摘自http://pdfsharp.codeplex.com/releases/view/37054

  

如果您喜欢速度:请继续使用PDFsharp 1.30。如果你喜欢小PDF   文件:使用PDFsharp 1.31。 PDFsharp的未来版本将支持   两种模式(赞成速度和青睐大小)。

也许这有帮助。