Печать документа из DataGridView

Небольшой пример, как можно выполнить печать с данными из DataGridView на языке C#. Есть маленькие недостатки, печатает только одну страницу. Код взят из интернета.

Обработчик события печати:

 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            Graphics g = e.Graphics;
            int x = 0;
            int y = 20;
            int cell_height = 0;
 
            int colCount = dataGridView1.ColumnCount;
            int rowCount = dataGridView1.RowCount - 1;
 
            Font font = new Font("Tahoma", 9, FontStyle.Bold, GraphicsUnit.Point);
 
            int[] widthC = new int[colCount];
 
            int current_col = 0;
            int current_row = 0;
 
            while (current_col < colCount)             {                 if (g.MeasureString(dataGridView1.Columns[current_col].HeaderText.ToString(), font).Width > widthC[current_col])
                    {
                        widthC[current_col] = (int)g.MeasureString(dataGridView1.Columns[current_col].HeaderText.ToString(), font).Width;
                    }
                current_col++;
            }
 
            while (current_row < rowCount)
            {
                while (current_col < colCount)                 {                     if (g.MeasureString(dataGridView1[current_col, current_row].Value.ToString(), font).Width > widthC[current_col])
                    {
                        widthC[current_col] = (int)g.MeasureString(dataGridView1[current_col, current_row].Value.ToString(), font).Width;
                    }
                    current_col++;
                }
                current_col = 0;
                current_row++;
            }
 
            current_col = 0;
            current_row = 0;
 
            string value = "";
 
            int width = widthC[current_col];
            int height = dataGridView1[current_col, current_row].Size.Height;
 
            Rectangle cell_border;
            SolidBrush brush = new SolidBrush(Color.Black);
 
 
            while (current_col < colCount)
            {
                width = widthC[current_col];
                cell_height = dataGridView1[current_col, current_row].Size.Height;
                cell_border = new Rectangle(x, y, width, height);
                value = dataGridView1.Columns[current_col].HeaderText.ToString();
                g.DrawRectangle(new Pen(Color.Black), cell_border);
                g.DrawString(value, font, brush, x, y);
                x += widthC[current_col];
                current_col++;
            }
            while (current_row < rowCount)
            {
                while (current_col < colCount)
                {
                    width = widthC[current_col];
                    cell_height = dataGridView1[current_col, current_row].Size.Height;
                    cell_border = new Rectangle(x, y, width, height);
                    value = dataGridView1[current_col, current_row].Value.ToString();
                    g.DrawRectangle(new Pen(Color.Black), cell_border);
                    g.DrawString(value, font, brush, x, y);
                    x += widthC[current_col];
                    current_col++;
                }
                current_col = 0;
                current_row++;
                x = 0;
                y += cell_height;
            }
        }

Пример вызова:

private void button2_Click(object sender, EventArgs e)
{
PrintDocument Document = new PrintDocument();
Document.PrintPage += new PrintPageEventHandler(print_dgv_PrintPage);
PrintPreviewDialog dlg = new PrintPreviewDialog();
dlg.Document = Document;

dlg.ShowDialog();
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *