"Enter"a basıp içeriğe geçin

C# PrintDocument Sınıfı İle Verileri Yazdırma (Raporlama) İşlemi

Merhaba arkadaşlar bu yazımda PrintDocument sınıfı ile datagridview içerisindeki verileri nasıl yazdırırız bundan bahsediyor olacağım.

Raporlama işlemi için XtraRapor, reportviewer gibi çeşitli araçlar olmasına rağmen, dinamik bir yapıya sahip olmadığı için, printdocument sınıfı bizim işimizi görecektir.
Öncelikle Rapor adında bir sınıf oluşturalım ve aşağıdaki gibi sınıfı düzenleyelim.
using System;
using System.Collections;
using System.Drawing;
using System.Drawing.Printing;
using System.Linq;
using System.Windows.Forms;

namespace Project.WinFormUI.Classes
{
    public class Rapor
    {
        #region Degiskenler

        private int _hucreYukseklik = 0;
        private int _toplamGenislik = 0;
        private int _satirSayac = 0;
        private int _baslikYukseklik = 0;
        private bool _ilkSayfayiYazdir = false;
        private bool _yeniSayfayaYazdir = false;
        private StringFormat _strFormat; // Satırları biçimlendirme
        private readonly ArrayList _arrSutununSolKordinati;
        private readonly ArrayList _arrSutunGenislik;
        private readonly PrintDocument _printDocument;
        private readonly DataGridView _dgv;
        private readonly string _raporBaslik;

        #endregion

        public Rapor(DataGridView dataGridView, string raporBaslik)
        {
            _printDocument = new PrintDocument();
            _arrSutununSolKordinati = new ArrayList();
            _arrSutunGenislik = new ArrayList();
            _dgv = new DataGridView();

            _printDocument.PrintPage += new PrintPageEventHandler(PrintDocument_PrintPage);
            _printDocument.BeginPrint += new PrintEventHandler(PrintDocument_BeginPrint);
            _dgv = dataGridView;
            _raporBaslik = raporBaslik;
        }

        public void Goster()
        {
            var printPreviewDialog = new PrintPreviewDialog
            {
                Document = _printDocument
            };
            printPreviewDialog.ShowDialog();
        }

        private void PrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            int solKenarBosluk = e.MarginBounds.Left;
            int ustKenarBosluk = e.MarginBounds.Top;

            bool dahaFazlaSayfaYazdir = false;

            // Yazdırılacak ilk sayfanın hücre genişliğini ve başlık yüksekliğini ayarlayın
            if (_ilkSayfayiYazdir)
            {
                foreach (DataGridViewColumn dgvSutun in _dgv.Columns)
                {
                    int hucreGenislik = (int)(Math.Floor((double)((double)dgvSutun.Width /
        (double)_toplamGenislik * (double)_toplamGenislik *
        ((double)e.MarginBounds.Width / (double)_toplamGenislik))));

                    _baslikYukseklik = (int)(e.Graphics.MeasureString(dgvSutun.HeaderText,
                        dgvSutun.InheritedStyle.Font, hucreGenislik).Height) + 11;

                    // Başlıkların genişliğini ve yüksekliğini kaydet
                    _arrSutununSolKordinati.Add(solKenarBosluk);
                    _arrSutunGenislik.Add(hucreGenislik);
                    solKenarBosluk += hucreGenislik;
                }
            }

            // Tüm ızgara satırları yazdırılıncaya kadar döngüyü devam ettir
            while (_satirSayac <= _dgv.Rows.Count - 1) { DataGridViewRow dgvSatir = _dgv.Rows[_satirSayac]; // Hücre yüksekliğini ayarlama _hucreYukseklik = dgvSatir.Height + 20; int sutunSayac = 0; // Geçerli sayfa ayarlarının daha fazla satır yazdırmasına izin verip vermediğini kontrol etme if (ustKenarBosluk + _hucreYukseklik >= e.MarginBounds.Height + e.MarginBounds.Top)
                {
                    _yeniSayfayaYazdir = true;
                    _ilkSayfayiYazdir = false;
                    dahaFazlaSayfaYazdir = true;
                    break;
                }
                else
                {
                    if (_yeniSayfayaYazdir)
                    {
                        //Başlığı çiz
                        e.Graphics.DrawString(_raporBaslik,
                            new Font(_dgv.Font, FontStyle.Bold),
                            Brushes.Black, e.MarginBounds.Left,
                            e.MarginBounds.Top - e.Graphics.MeasureString(_raporBaslik,
                            new Font(_dgv.Font, FontStyle.Bold),
                            e.MarginBounds.Width).Height - 13);

                        String tarihFormat = DateTime.Now.ToString("dd MMMM yyyy HH:mm");

                        //Tarih çiz
                        e.Graphics.DrawString(tarihFormat,
                            new Font(_dgv.Font, FontStyle.Bold), Brushes.Black,
                            e.MarginBounds.Left +
                            (e.MarginBounds.Width - e.Graphics.MeasureString(tarihFormat,
                            new Font(_dgv.Font, FontStyle.Bold),
                            e.MarginBounds.Width).Width),
                            e.MarginBounds.Top - e.Graphics.MeasureString(_raporBaslik,
                            new Font(new Font(_dgv.Font, FontStyle.Bold),
                            FontStyle.Bold), e.MarginBounds.Width).Height - 13);

                        //Sutunları çiz           
                        ustKenarBosluk = e.MarginBounds.Top;
                        DataGridViewColumn[] dgvSutun = new DataGridViewColumn[_dgv.Columns.Count];

                        //Sutunları tersinden sırala
                        int sutunSayisi = _dgv.Columns.Count - 1;
                        foreach (DataGridViewColumn sutun in _dgv.Columns)
                        {
                            dgvSutun[sutunSayisi--] = sutun;
                        }

                        for (int i = (dgvSutun.Count() - 1); i >= 0; i--)
                        {
                            e.Graphics.FillRectangle(new SolidBrush(Color.LightGray),
                                new Rectangle((int)_arrSutununSolKordinati[sutunSayac], ustKenarBosluk,
                                (int)_arrSutunGenislik[sutunSayac], _baslikYukseklik));

                            e.Graphics.DrawRectangle(Pens.Black,
                                new Rectangle((int)_arrSutununSolKordinati[sutunSayac], ustKenarBosluk,
                                (int)_arrSutunGenislik[sutunSayac], _baslikYukseklik));

                            e.Graphics.DrawString(dgvSutun[i].HeaderText,
                                dgvSutun[i].InheritedStyle.Font,
                                new SolidBrush(dgvSutun[i].InheritedStyle.ForeColor),
                                new RectangleF((int)_arrSutununSolKordinati[sutunSayac], ustKenarBosluk,
                                (int)_arrSutunGenislik[sutunSayac], _baslikYukseklik), _strFormat);
                            sutunSayac++;
                        }

                        _yeniSayfayaYazdir = false;
                        ustKenarBosluk += _baslikYukseklik;
                    }

                    sutunSayac = 0;
                    DataGridViewCell[] _GridCell = new DataGridViewCell[dgvSatir.Cells.Count];

                    //Hücreleri tersinden sırala
                    int hucreSayisi = dgvSatir.Cells.Count - 1;
                    foreach (DataGridViewCell hucre in dgvSatir.Cells)
                    {
                        _GridCell[hucreSayisi--] = hucre;
                    }

                    // Çizim Sütunları İçindekiler              
                    for (int i = (_GridCell.Count() - 1); i >= 0; i--)
                    {
                        if (_GridCell[i].Value != null)
                        {
                            e.Graphics.DrawString(_GridCell[i].FormattedValue.ToString(),
                                _GridCell[i].InheritedStyle.Font,
                                new SolidBrush(Color.Black/*_GridCell[i].InheritedStyle.ForeColor*/),
                                new RectangleF((int)_arrSutununSolKordinati[sutunSayac],
                                (float)ustKenarBosluk,
                                (int)_arrSutunGenislik[sutunSayac], (float)_hucreYukseklik),
                                _strFormat);
                        }

                        // Hücre Kenarlıkları Çizme
                        e.Graphics.DrawRectangle(Pens.Black,
                            new Rectangle((int)_arrSutununSolKordinati[sutunSayac], ustKenarBosluk,
                            (int)_arrSutunGenislik[sutunSayac], _hucreYukseklik));
                        sutunSayac++;
                    }
                }
                _satirSayac++;
                ustKenarBosluk += _hucreYukseklik;
            }

            if (dahaFazlaSayfaYazdir) e.HasMorePages = true;
            else e.HasMorePages = false;
        }

        private void PrintDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
        {
            try
            {
                _strFormat = new StringFormat
                {
                    Alignment = StringAlignment.Center,
                    LineAlignment = StringAlignment.Center,
                    Trimming = StringTrimming.EllipsisCharacter
                };

                _arrSutununSolKordinati.Clear();
                _arrSutunGenislik.Clear();
                _hucreYukseklik = 0;
                _satirSayac = 0;
                _ilkSayfayiYazdir = true;
                _yeniSayfayaYazdir = true;

                // Toplam Genişliklerin Hesaplanması
                _toplamGenislik = 0;
                foreach (DataGridViewColumn dgvSutun in _dgv.Columns)
                    _toplamGenislik += dgvSutun.Width;
            }
            catch {  }
        }
    }
}

Sınıf hazırlandıktan sonra, forma gelip “Yazdır” adında bir buton oluşturalım ve gerekli kodları içine yazalım.


private void BtnYazdir_Click(object sender, EventArgs e)
{
    var rapor = new Rapor(dgvListe, "Rapor Başlık");
    rapor.Goster();
}
Evettt, artık programı çalıştırıp yazdır butonuna tıklandığında datagridview içerisindeki veriler yazdırılabilir. Fakat burada şöyle bir durum var. Eğer siz DataGridView içindeki tüm sütunların görünmesini istemiyorsanız, yazdır butonun içinde, yeni bir DataGridView oluşturup gerekli sütunları belirtip(oluşturup), daha sonra DataGridView içindeki verileri yeni oluşturulan DataGridView içerisine aktararak, sadece istediğiniz sutunların bulunduğu yeni DataGridView’i rapor sınıfına gönderebilirsiniz.
PrintDocument sınıfı ile anlatacaklarım bu kadar arkadaşlar umarım işinize yarar. Diğer yazılarımda görüşmek dileğiyle, iyi kodlamalar dilerim.
Yazıyı Paylaşmak İster misin?
Share on Facebook
Facebook
Pin on Pinterest
Pinterest
Tweet about this on Twitter
Twitter
Share on LinkedIn
Linkedin
Share on Tumblr
Tumblr
Share on Reddit
Reddit
    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir