先举个例子  Form里有10个DataGridview控件 每个只有一行数据,我想把这10个打印在一个页面上 怎么办? 我最先想到的是把这些数据合成一个table,但是合成table会耗费性能,而且 这10个表格的列数不一定相等
 
网上也找不到一页打印多个DataGridview的方法 做一就自己动手改写了一个 写出来后,我拿两个DataGridview测试,功能基本能实现 但是感觉写的代码很不专业  性能很差  希望大家帮忙优化一下  本帖纯技术讨论帖  禁水!谢谢!这是我调用这个类的代码private void button1_Click(object sender, EventArgs e)
        {
            DataGridView[] dgv = new DataGridView[2];
            dgv[0] = dataGridView2;
            dgv[1] = dataGridView1;
            DataGridViewPrint dgvp = new DataGridViewPrint(dgv);
            dgvp.Print();                
        }
这是功能类public class DataGridViewPrint
    {
        private DataGridView[] dataGridView;
        private PrintDocument printDocument;
        private PageSetupDialog pageSetupDialog;
        private PrintPreviewDialog printPreviewDialog;        private int dgvIndex=0;        private int rowCount = 0;
        private int colCount = 0;
        private int x = 0;
        private int y = 0;
        private int i = 0;
        private int j = 0;
        private int rowGap = 20;
        private int colGap = 5;
        private int leftMargin = 50;
        private Font font = new Font("Arial", 10);
        private Font headingFont = new Font("Arial", 11, FontStyle.Underline);
        private Font captionFont = new Font("Arial", 10, FontStyle.Bold);
        private Brush brush = new SolidBrush(Color.Black);
        private string cellValue = "";        public DataGridViewPrint(DataGridView[] dataGridView)
        {
            this.dataGridView = dataGridView;
            printDocument = new PrintDocument();
            printDocument.PrintPage += new PrintPageEventHandler(this.printDocument_PrintPage);
        }        private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {            
            for (; dgvIndex < dataGridView.Length;dgvIndex++ )
            {
                rowCount = dataGridView[dgvIndex].Rows.Count - 1;                colCount = dataGridView[dgvIndex].ColumnCount;                //print headings 
                y += rowGap;
                x = leftMargin;
                for (j = 0; j < colCount; j++)
                {
                    if (dataGridView[dgvIndex].Columns[j].Width > 0)
                    {
                        cellValue = dataGridView[dgvIndex].Columns[j].HeaderText;
                        e.Graphics.DrawString(cellValue, headingFont, brush, x, y);
                        x += dataGridView[dgvIndex].Columns[j].Width + colGap;
                    }
                }
                //print all rows 
                for (; i < rowCount; i++)
                {
                    y += rowGap;
                    x = leftMargin;
                    for (j = 0; j < colCount; j++)
                    {
                        if (dataGridView[dgvIndex].Columns[j].Width > 0)
                        {
                            cellValue = dataGridView[dgvIndex].Rows[i].Cells[j].Value.ToString();
                            e.Graphics.DrawString(cellValue, font, brush, x, y);
                            x += dataGridView[dgvIndex].Columns[j].Width + colGap;
                            y = y + rowGap * (cellValue.Split(new char[] { ' ', ' ' }).Length - 1);
                        }
                    }
                    if (y >= e.PageBounds.Height - 50)
                    {
                        //允許多頁打印
                        y = rowGap;
                        e.HasMorePages = true;
                        i++;                        /*
                         * PrintPageEventArgs類的HaeMorePages屬性為True時,通知控件器,必須再次調用OnPrintPage()方法,打印一個頁面。
                         * PrintLoopI()有一個用於每個要打印的頁面的序例。如果HasMorePages是False,PrintLoop()就會停止。
                         */
                        return;
                    }
                }               
            }
            e.HasMorePages = false;
            
        }
                public PrintDocument GetPrintDocument()
        {
            return printDocument;
        }        public void Print()
        {
            try
            {
                pageSetupDialog = new PageSetupDialog();
                pageSetupDialog.Document = printDocument;
                pageSetupDialog.ShowDialog();
                printPreviewDialog = new PrintPreviewDialog();
                printPreviewDialog.Document = printDocument;
                printPreviewDialog.Height = 600;
                printPreviewDialog.Width = 800;
                printPreviewDialog.ShowDialog();
            }
            catch (Exception e)
            {
                throw new Exception("Printer error." + e.Message);
            }        }
    }

解决方案 »

  1.   

    DataGridViewPrint类的成员变量太多了。
    肯定影响性能的。
    建议尽量少用类的成员,各个方法之间的数据传递用参数实现。
    这样就可以变全局变量为局部变量了。
    你的类的成员(全局变量)只有在对象被注销时释放空间。
    而局部变量在方法执行完了就可以释放空间了。
      

  2.   

    不要光说好不好?  你能给改下吗?  实现一页打印多个dgv 而且自动分页