none
C#第二次打印和先预览后打印没数据 RRS feed

  • 问题

  • #region  //打印需要的成员
            public String printName = String.Empty;
            public System.Drawing.Font prtTextFont = new System.Drawing.Font("Verdana", 10);
            public System.Drawing.Font prtTitleFont = new System.Drawing.Font("宋体", 10);
            private String[] titles = new String[0];
            public String[] Titles
            {
                set
                {
                    titles = value as String[];
                    if (null == titles)
                    {
                        titles = new String[0];
                    }
                }
                get
                {
                    return titles;
                }
            }
            private Int32 left = 20;
            private Int32 top = 20;
            public new Int32 Top
            {
                set
                {
                    top = value;
                }
                get
                {
                    return top;
                }
            }
            public new Int32 Left
            {
                set
                {
                    left = value;
                }
                get
                {
                    return left;
                }
            }
            private DataTable printedTable;
            private Int32 pheight;
            private Int32 pWidth;
            private Int32 pindex;
            private Int32 curdgi;
            private Int32[] width;
            private Int32 rowOfDownDistance = 3;
            private Int32 rowOfUpDistance = 2;
            #endregion

    #region //打印
            private void btnDY_Click(object sender, EventArgs e)
            {
                DataTable dt = new DataTable();
                dt = (DataTable)dataGridView1.DataSource;             
                PrintDataTable(dt);
            }
            #endregion

    #region//打印预览
            private void button1_Click(object sender, EventArgs e)
            {          
                DataTable dt = new DataTable();
                dt = (DataTable)dataGridView1.DataSource;
                //string strsql = "select * from  dbo.statementInfo";
                //dt = sqlHelper.GetDataTable(strsql);
                PrintPreviewDataTable(dt);         
            }
            #endregion
    #region //创建打印文件
            public Boolean PrintDataTable(DataTable table)
            {
                PrintDocument prtDocument = new PrintDocument();
                try
                {
                    if (printName != String.Empty)
                    {
                        prtDocument.PrinterSettings.PrinterName = printName;
                    }
                    prtDocument.DefaultPageSettings.Landscape = true;
                    prtDocument.OriginAtMargins = false;
                    PrintDialog prtDialog = new PrintDialog();
                    prtDialog.AllowSomePages = true;

                    prtDialog.ShowHelp = false;
                    prtDialog.Document = prtDocument;

                    if (DialogResult.OK != prtDialog.ShowDialog())
                    {
                        return false;
                    }

                    printedTable = table;
                    pindex = 0;
                    curdgi = 0;
                    width = new Int32[printedTable.Columns.Count];
                    pheight = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Bottom;
                    pWidth = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Right;                         
                    prtDocument.PrintPage += new PrintPageEventHandler(Document_PrintPage);

                    prtDocument.Print();

                }
                catch (InvalidPrinterException ex)
                {
                    MessageBox.Show("没有安装打印机");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("打印错误");
                }
                prtDocument.Dispose();
                return true;
            }
            #endregion
            Int32 startColumnControls = 0;
            Int32 endColumnControls = 0;
            #region//向打印机发送对象
            private void Document_PrintPage(object sender, PrintPageEventArgs ev)
            {
                Int32 x = left;
                Int32 y = top;
                Int32 rowOfTop = top;
                Int32 i;
                Pen pen = new Pen(Brushes.Black, 1);
                if (0 == pindex)
                {
                    for (i = 0; i < titles.Length; i++)
                    {
                        ev.Graphics.DrawString(titles[i], prtTitleFont, Brushes.Black, left, y + rowOfUpDistance);
                        y += prtTextFont.Height + rowOfDownDistance;
                    }
                    rowOfTop = y;
                    foreach (DataRow dr in printedTable.Rows)
                    {
                        for (i = 0; i < printedTable.Columns.Count; i++)
                        {
                            Int32 colwidth = Convert.ToInt16(ev.Graphics.MeasureString(dr[i].ToString().Trim(), prtTextFont).Width);
                            if (colwidth > width[i])
                            {
                                width[i] = colwidth;
                            }
                        }
                    }
                }
                for (i = endColumnControls; i < printedTable.Columns.Count; i++)
                {
                    String headtext = printedTable.Columns[i].ColumnName.Trim();
                    if (pindex == 0)
                    {
                        int colwidth = Convert.ToInt16(ev.Graphics.MeasureString(headtext, prtTextFont).Width);
                        if (colwidth > width[i])
                        {
                            width[i] = colwidth;
                        }
                    }
                    if (x + width[i] > pheight)
                    {
                        break;
                    }
                    ev.Graphics.DrawString(headtext, prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                    x += width[i];
                }
                startColumnControls = endColumnControls;
                if (i < printedTable.Columns.Count)
                {
                    endColumnControls = i;
                    ev.HasMorePages = true;
                }
                else
                {
                    endColumnControls = printedTable.Columns.Count;
                }
                ev.Graphics.DrawLine(pen, left, rowOfTop, x, rowOfTop);
                y += rowOfUpDistance + prtTextFont.Height + rowOfDownDistance;
                ev.Graphics.DrawLine(pen, left, y, x, y);
                for (i = curdgi; i < printedTable.Rows.Count; i++)
                {
                    x = left;
                    for (Int32 j = startColumnControls; j < endColumnControls; j++)
                    {
                        ev.Graphics.DrawString(printedTable.Rows[i][j].ToString().Trim(), prtTextFont, Brushes.Black, x, y + rowOfUpDistance);
                        x += width[j];
                    }
                    y += rowOfUpDistance + prtTextFont.Height + rowOfDownDistance;
                    ev.Graphics.DrawLine(pen, left, y, x, y);
                    if (y > pWidth - prtTextFont.Height - 30)
                    {
                        break;
                    }
                }
                ev.Graphics.DrawLine(pen, left, rowOfTop, left, y);
                x = left;
                for (Int32 k = startColumnControls; k < endColumnControls; k++)
                {
                    x += width[k];
                    ev.Graphics.DrawLine(pen, x, rowOfTop, x, y);
                }
                if (y > pWidth - prtTextFont.Height - 30)
                {
                    pindex++;
                    if (0 != startColumnControls)
                    {
                        curdgi = i + 1;
                    }
                    if (!ev.HasMorePages)
                    {
                        endColumnControls = 0;
                    }
                    ev.HasMorePages = true;
                }


                lineReader = new StringReader("qw");


            }
            #endregion
            #region //打印预览方法
            public void PrintPreviewDataTable(DataTable prtTable)
            {         
                PrintDocument prtDocument = new PrintDocument();
                try
                {
                    if (printName != String.Empty)
                    {
                        prtDocument.PrinterSettings.PrinterName = printName;
                    }
                    prtDocument.DefaultPageSettings.Landscape = true;
                    prtDocument.OriginAtMargins = false;
                    printedTable = prtTable;
                    pindex = 0;
                    curdgi = 0;
                    width = new int[printedTable.Columns.Count];
                    pheight = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Bottom;
                    pWidth = prtDocument.PrinterSettings.DefaultPageSettings.Bounds.Right;
                    prtDocument.PrintPage += new PrintPageEventHandler(Document_PrintPage);
                    PrintPreviewDialog prtPreviewDialog = new PrintPreviewDialog();
                    prtPreviewDialog.Document = prtDocument;
                    prtPreviewDialog.ShowIcon = false;
                    prtPreviewDialog.WindowState = FormWindowState.Maximized;
                    prtPreviewDialog.ShowDialog();

                }
                catch (InvalidPrinterException ex)
                {
                    MessageBox.Show("没有安装打印机");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("打印预览失败");
                }
              
            }
            #endregion
    2018年6月11日 8:18

全部回复

  • 你好,

    你可以在打印方法里面打个断点,检查一下看看Datatable 变量里面是否有内容, 如果没有的话,检查传参的时候是否传了一个空的Datatable.

    另外如果问题还存在的话,你最好能上传一个小的,完整的,可以重现问题的项目代码,以方便我们重现问题。你可以把代码上传到OneDrive, 然后把分享链接贴在回复上。

    Best regards,

    Zhanglong


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年6月12日 2:04
    版主
  • 好的,谢谢
    2018年6月12日 2:58
  • 你好,

    如果在Debug 中碰到什么问题,可以跟帖,如果问题已经解决,请把你的解决方案跟帖在这里,并且 标记为答复, 这样对如果其他的论坛成员,有相似问题,会提供一些帮助。

    Best regards,

    Zhanglong


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年6月12日 5:43
    版主
  • 可以用虚拟打印机联调,看第二次数据为什么没有取出来。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2018年6月13日 0:28