DataGridView da Bulunan Satırları Yazdırmak


12 Ağustos 2012 Hikmet Okumuş C#

Merhaba Arkadaşlar, Datagridview üzerinde bulunan satırların önizleme ve yazıcı çıktısı olarak nasıl alınabileceği ile ilgili bir işlemi aşağıdaki satırları takip ederek yapabilirsiniz.
1. İşlemimiz grid' in dolmasından sonra oluşacağı için kullanılan database türünün bir önemi bulunmamaktadır. Biz sql olarak devam edelim. Sql' den verilerilerimizi çektik ve datagridview' ın içerisine doldurduk.
2. Global olarak aşağıda bulunan değişkenleri tanımlamamız gerekmektedir.
        StringFormat strFormat;
        ArrayList arrColumnLefts = new ArrayList();
        ArrayList arrColumnWidths = new ArrayList();
        int iCellHeight = 0;
        int iTotalWidth = 0;
        int iRow = 0;
        bool bFirstPage = false;
        bool bNewPage = false;
        int iHeaderHeight = 0;
3. Formumuza bir tane printDocument nesnesi ekliyoruz. Öncelikle printDocument1_PrintPage eventına aşağıda bulunan kodu yazıyoruz.
            try
            {
                int iLeftMargin = e.MarginBounds.Left;
                int iTopMargin = e.MarginBounds.Top;
                bool bMorePagesToPrint = false;
                int iTmpWidth = 0;
                bFirstPage = true;
                
                if (bFirstPage)
                {
                    foreach (DataGridViewColumn GridCol in dataGridView1.Columns)
                    {
                        iTmpWidth = (int)(Math.Floor((double)((double)GridCol.Width /
                                       (double)iTotalWidth * (double)iTotalWidth *
                                       ((double)e.MarginBounds.Width / (double)iTotalWidth))));

                        iHeaderHeight = (int)(e.Graphics.MeasureString(GridCol.HeaderText,
                                    GridCol.InheritedStyle.Font, iTmpWidth).Height) + 11;

                        
                        arrColumnLefts.Add(iLeftMargin);
                        arrColumnWidths.Add(iTmpWidth);
                        iLeftMargin += iTmpWidth;
                    }
                }
                
                while (iRow <= dataGridView1.Rows.Count - 1)
                {
                    DataGridViewRow GridRow = dataGridView1.Rows[iRow];
                
                    iCellHeight = GridRow.Height + 5;
                    int iCount = 0;
                
                    if (iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top)
                    {
                        bNewPage = true;
                        bFirstPage = false;
                        bMorePagesToPrint = true;
                        break;
                    }
                    else
                    {
                        if (bNewPage)
                        {
                            
                            e.Graphics.DrawString("Çıktı Başlığı", new Font(dataGridView1.Font, FontStyle.Bold),
                                    Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top -
                                    e.Graphics.MeasureString("Çıktı Başlığı", new Font(dataGridView1.Font,
                                    FontStyle.Bold), e.MarginBounds.Width).Height - 13);

                            String strDate = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString();
                            
                            e.Graphics.DrawString(strDate, new Font(dataGridView1.Font, FontStyle.Bold),
                                    Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width -
                                    e.Graphics.MeasureString(strDate, new Font(dataGridView1.Font,
                                    FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top -
                                    e.Graphics.MeasureString("Çıktı Başlığı", new Font(new Font(dataGridView1.Font,
                                    FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13);

                            
                            iTopMargin = e.MarginBounds.Top;
                            foreach (DataGridViewColumn GridCol in dataGridView1.Columns)
                            {
                                e.Graphics.FillRectangle(new SolidBrush(Color.LightGray),
                                    new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                                    (int)arrColumnWidths[iCount], iHeaderHeight));

                                e.Graphics.DrawRectangle(Pens.Black,
                                    new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                                    (int)arrColumnWidths[iCount], iHeaderHeight));

                                e.Graphics.DrawString(GridCol.HeaderText, GridCol.InheritedStyle.Font,
                                    new SolidBrush(GridCol.InheritedStyle.ForeColor),
                                    new RectangleF((int)arrColumnLefts[iCount], iTopMargin,
                                    (int)arrColumnWidths[iCount], iHeaderHeight), strFormat);
                                iCount++;
                            }
                            bNewPage = false;
                            iTopMargin += iHeaderHeight;
                        }
                        iCount = 0;
                                   
                        foreach (DataGridViewCell Cel in GridRow.Cells)
                        {
                            if (Cel.Value != null)
                            {
                                e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font,
                                            new SolidBrush(Cel.InheritedStyle.ForeColor),
                                            new RectangleF((int)arrColumnLefts[iCount], (float)iTopMargin,
                                            (int)arrColumnWidths[iCount], (float)iCellHeight), strFormat);
                            }
                        
                            e.Graphics.DrawRectangle(Pens.Black, new Rectangle((int)arrColumnLefts[iCount],
                                    iTopMargin, (int)arrColumnWidths[iCount], iCellHeight));

                            iCount++;
                        }
                    }
                    iRow++;
                    iTopMargin += iCellHeight;
                }

                
                if (bMorePagesToPrint)
                    e.HasMorePages = true;
                else
                    e.HasMorePages = false;
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
4. Aynı şekilde printDocument1_BeginPrint eventına aşağıda bulunan kodu yazıyoruz.
            try
            {
                strFormat = new StringFormat();
                strFormat.Alignment = StringAlignment.Near;
                strFormat.LineAlignment = StringAlignment.Center;
                strFormat.Trimming = StringTrimming.EllipsisCharacter;

                arrColumnLefts.Clear();
                arrColumnWidths.Clear();
                iCellHeight = 0;
                iRow = 0;
                bFirstPage = true;
                bNewPage = true;

                iTotalWidth = 0;
                foreach (DataGridViewColumn dgvGridCol in dataGridView1.Columns)
                {
                    iTotalWidth += dgvGridCol.Width;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
5. Gelelim önizleme ile datagridview üzerinde bulunan satırların görüntülenmesine. Formumuza bir button ekliyoruz ve Click eventına aşağıda bulunan kodu ekliyoruz.
            PrintPreviewDialog onizleme = new PrintPreviewDialog();
            onizleme.Document = printDocument1;
            onizleme.ShowDialog();
6. Önizleme görüntüsünü bu şekilde elde etmiş olduk. Artık önizlemenin üzerinde bulunan menüden yazdır işlemini yapabilirsiniz. Fakat sizler direk yazıcıya çıktı göndermek isterseniz aşağıdaki kod ile bunu yapabilirsiniz.
            PrintDialog yazdir = new PrintDialog();
            yazdir.Document = printDocument1;
            yazdir.UseEXDialog = true;
            if (yazdir.ShowDialog() == DialogResult.OK)
            {
                printDocument1.Print();
            }
Bu işlemler sonucunda datagridview üzerinde bulunan kayıtların çıktısını alabilirsiniz. Dilerim faydalı bir anlatım olmuştur.

Başarılar dilerim.



Kullanıcı Yorumları

hikmet okumuş makale yorum
MURAT
5/7/2015 3:45:26 AM

ellerine sağlık kardes bi sorum olacak biz bu baskı ön izlemeyi nasıl büyütebilirim acılışta cok küçük

hikmet okumuş makale yorum
Hikmet Okumuş
5/7/2015 1:58:34 PM

Merhaba Murat,

PrintPreviewDialog onizleme = new PrintPreviewDialog();
onizleme.Document = printDocument1;
((Form)onizleme).WindowState = FormWindowState.Maximized; // Tam ekran olması için
onizleme.PrintPreviewControl.Zoom = 1.0; //Sayfanın %100 boyutunda olması için
onizleme.ShowDialog();

Yukarıdaki kod işini görecektir. Fakat dikkat edersen onizleme objesini "Form" nesnesine cast ederek WindowState özelliğine eriştim. Bunun sebebi şudur;

PrintPreviewDialog nesnesindeyken "Go To Definition" dersen, nesnenin "Form" nesnesinden türetildiğini ve nesnenin WindowState property' sine sahip olduğunu göreceksin. Fakat property "[EditorBrowsable(EditorBrowsableState.Never)]" ile gizlendiği için doğrudan erişilemez ve özelliği kullanabilmemiz için cast işlemi yapmamız gerekmektedir.

Başarılar dilerim.

hikmet okumuş makale yorum
mustafa ersoy
5/10/2015 8:36:09 PM

merhaba. ben bu şekilde yaptıgım zaman "onizleme.ShowDialog();" kısmında Yüklü Yazıcı Yok hatası alıyorum yardımcı olur musunuz ?

hikmet okumuş makale yorum
Hikmet Okumuş
5/11/2015 12:21:57 AM

Merhaba Mustafa Ersoy,

PrintPreviewDialog ile show işleminden önce sistemde tanımlı yazıcı olup olmadığını kontrol edebilirsin. Eğer tanımlı yazıcı varsa Showdialog ile ekran açarsın. Yüklü yazıcıları aşağıdaki şekilde elde edebilirsin.

System.Drawing.Printing.PrinterSettings.InstalledPrinters

hikmet okumuş makale yorum
Ozge TANIS
10/30/2015 4:26:23 AM

Merhaba Hikmet Bey,
Öncelikle kodu bu kadar anlaşılır ve uygulaması kolay yayımladığınız için teşekkür ederim. Kodu basit bir sipariş programında kullandım çıktı 80mm lik kağıda olacak, datagridview u bitmap şeklinde yazdırdığımda sayfaya tam uyduruyorum ancak görünenin dışında ki satırları yazmıyor, sizin kodunuzu kullandığımda ise istediğim iki sütun satırların hepsi yazıyor ama sütunların genişliği oldukça daralıyor, genişlik değerini uyarlayabileceğimiz yada kullandığım datagridviewden sütun genişlik değerini almasını sağlayacak bir öneriniz olabilir mi?
Saygılarımla

hikmet okumuş makale yorum
Hikmet Okumuş
10/30/2015 4:45:47 PM

Merhaba Ozge TANIS,

"BeginPrint" event' ı içerisinde yazdırılacak gridin toplam sütun genişliği hesaplanmaktadır. Hesaplanan toplam kolon genişlikleri "iTotalWidth" isimli değişkende tutulmaktadır.

Sonrasında "PrintPage" event' ında toplam kolon sayısına göre bir genişlik ortalaması alınıyor ve değer "iTmpWidth" değişkeninde tutuluyor. Yani ilgili kolon genişliği artık bu değer oluyor.

Tüm kolon genişlikleri de "arrColumnWidths" isimli dizide tutulmaktadır. Sonrasında her bir satır ve sutun oluşurken bu dizideki değere göre genişlikleri belirlenmektedir.

Yazdırma alanında bulunan kolon genişliklerini bu şekilde yönetebilirsin.

hikmet okumuş makale yorum
Ozge TANIS
11/1/2015 11:58:06 PM

Hikmet Bey,
Cevabınız için teşekkür ederim. Biraz uğraştıktan sonra sorunumun sütun genişliklerinde değil kağıt kenar boşluklarında olduğunu anladım, kağıt boyutu ne olursa olsun sağ ve soldan bırakılan kenar boşlukları sütun genişliklerini etkiledi, dediğiniz gibi sütun boyutları da formda belirttiğimiz orana göre genişleyip darabiliyor, bende aşağıdaki kodları printdocument in Begin_Print eventine ekleyerek sağ sol boşlukları sıfırladım ve çıktı tam istediğim gibi oldu, vermiş olduğunuz kodlar sayesinde de hücre içeriği gerekirse 2 satır olarak satırıma sığdı. Tekrar teşekkürler.

printDocument1.OriginAtMargins = true;
printDocument1.DefaultPageSettings.Margins.Left = 0;
printDocument1.DefaultPageSettings.Margins.Right = 0;
printDocument1.DefaultPageSettings.Margins.Top = 40;
printDocument1.DefaultPageSettings.Margins.Bottom = 0;

hikmet okumuş makale yorum
Hikmet Okumuş
11/2/2015 12:03:46 AM

Özge Hanım,

Sorununuzu çözmüş olmanıza sevindim. İlginiz için ben teşekkür ederim.

hikmet okumuş makale yorum
Ömer Faruk Dönmez
3/2/2016 12:11:11 AM

Hücre içeriğini gerektiği zaman 3 veya 4 satır olarak ayarlayabilirmiyiz.

hikmet okumuş makale yorum
fatih demir
1/6/2017 12:16:14 PM

Emeğinize sağlık işime yaradı tşkler

hikmet okumuş makale yorum
Deniz YAZAR
3/7/2017 2:24:58 PM

Hocam Merhaba,
Yaptığın uygulamada datagridview in sutunlarından bir tanesini gizlemek istiyorum, hangi satırda oynama yapmam gerekli? Birde yazdırdığım her bir belge üzerine sayfa numarasını yazdırmak istiyorum. Sayfa [1 / 10] gibi... bunu nasıl sağlayabilirim, yardımcı olursan çok sevinirim.

hikmet okumuş makale yorum
Hikmet OKUMUŞ
3/8/2017 2:04:31 AM

Merhaba Deniz YAZAR,

Öncelikle sayfa numarasını yazdırma soruna cevap vereyim. String olarak "Çıktı Başlığı" yazan bir bölüm bulunmaktadır. (1. sıradaki kod) Kendine global bir değişken tanımlayarak buraya string.format ile istediğin şekilde sayfa numarasını yazdırabilirsin. pageCount yukarıdaki örnekte olmayan yeni tanımladığım global bir int türünde değişken, sayfa sayısını bu değişken tutmaktadır.

e.Graphics.DrawString("Çıktı Başlığı - Sayfa " + pageCount, new Font(dataGridView1.Font, FontStyle.Bold),
Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top -
e.Graphics.MeasureString("Çıktı Başlığı", new Font(dataGridView1.Font,
FontStyle.Bold), e.MarginBounds.Width).Height - 13);

Kolonları gizlemek bu örnek kod üzerinden gideceksen biraz zahmetli olabilir. Yukarıdaki kod içinde yapmak istersen şöyle bir tavsiyede bulunabilirim.

Gizlemek istediğin kolon ya da kolonları bir koleksiyon içerisinde tutarsın. Ardından aşağıdaki gibi kolonları dikkate almazsın.

if (hideColumns.Any(x => x.Equals(GridCol.Name)))
continue;

Sayfa üzerinde kolonların genişliklerini dinamik ayarladığı için, böyle bir işlem sonrasında kolon ayarlamasını da senin yeniden hesaplatman gerekecektir. 3 yerde döngü ile kolonları dolaşıyor. Bu şekilde deneyebilirsin.

hikmet okumuş makale yorum
Mustafa AKBAL
4/6/2017 11:41:37 PM

Teşekkürler. Çok iyi oldu bu kodlar. Ama arrayList ilk eklendiğinde hata veriyor onun için using System.Collections; isim uzayını eklemeyi unutmayın.

hikmet okumuş makale yorum
Doğancan ULUTş
4/10/2017 12:43:14 PM

Hocam Öncelikle merhaba; ben kodu yazdım dediğiniz gibi ancak global olarak tanımladığımız kısımda array list de hata verdi bide o kısımda en altta int iHeaderHeight = 0 da 0 hata veriyor çok baktım ama sebebini bulamadım nedir sorun acaba ?

hikmet okumuş makale yorum
Yiğit Çevik
4/22/2017 3:26:53 PM

Merhabalar hocam, dataGridView'in çıktı aldıktan sonra nasıl kenarlığı kaldıracağız mümkün müdür acaba?
Bu arada yazı için teşekkürler çok işime yaradı :) Allah razı olsun

hikmet okumuş makale yorum
Hikmet Okumuş
4/23/2017 12:53:02 AM

Merhaba Yiğit Çevik, foreach (DataGridViewCell Cel in GridRow.Cells) ile başlayan döngünün içerisinde e.Graphics.DrawRectangle(Pens.Black, new Rectangle((int)arrColumnLefts[iCount], iTopMargin, (int)arrColumnWidths[iCount], iCellHeight)); satırında "Pens.Black" kısmını "Pens.Transparent" şeklinde değiştirirsen border gözükmeyecektir. Başlık kısmını da aynı şekilde yok edebilirsin. Başlıkta hem border hem de background olarak 2 yerde geçer. Aynı şekilde Transparent olarak o kısımları da set edebilirsin.

hikmet okumuş makale yorum
Yunus Emre
5/17/2017 1:51:53 PM

Hikmet Bey merhabalar.
Anlatımınız ve paylaşımınız için çok teşekkür ederim. Emeğinize sağlık.
Projeme gösterdiğiniz şekilde ekleyerek yaptım hiç hata almıyorum ama çıktı da alamıyorum. Yani sayfa boş geliyor. DatagridView de kayıtlarım mevcut ama yine de boş geliyor. Gözden kaçırdığım bir püf noktası var mı acaba? Yani kodlarda bizim değiştirmemiz gereken bir yer varmı?

hikmet okumuş makale yorum
Hikmet Okumuş
5/17/2017 2:13:30 PM

Merhaba Yunus Emre,

Öncelikle Datagrid kontrolünün DataSource özelliğine değerin set edilmiş olması gerekmektedir. Kodda aşağıdaki satıra breakpoint ekleyerek debug edebilir misin ?

"while (iRow <= dataGridView1.Rows.Count - 1) "

Burada grid içerisinde satır varsa sana çıktı görselini çizecektir. Tekrar sorun yaşarsan kod bloğunu bana iletişim kısmından gönder, yardımcı olmaya çalışırım.

hikmet okumuş makale yorum
Yunus Emre
5/17/2017 2:35:49 PM

Maalesef sonuç alamadım Hikmet bey. Projemin kodlarını iletişim kısmından yolladım. Yardımcı olabilirseniz çok sevinirim. Geri dönüş için teşekkür ederim.

hikmet okumuş makale yorum
Hikmet Okumuş
5/17/2017 3:10:53 PM

Merhaba Yunus Emre,

Muhtemelen boş gelmesinin nedeni "printDocument" kontrolünün BeginPrint ve PrintPage eventlarının boş olmasından kaynaklanıyor. Makalede 3. ve 4. aşamada printDocument nesnesine hangi eventları ekleyeceğini ve içerisine hangi kodları ekleyeceğin yazıyor.

Kontrolü seç properties panelinden event kısmına geç ve orada ilgili eventların seçili / tanımlı olduklarından emin ol. Bunu yaptığında ekrana çıktıyı getirebilirsin.

hikmet okumuş makale yorum
Yunus Emre
5/17/2017 3:28:01 PM

Şimdi oldu işte. Çok çok teşekkür ederim Hikmet bey. Allah razı olsun.

hikmet okumuş makale yorum
Hikmet Okumuş
5/17/2017 3:39:06 PM

Rica ederim.

hikmet okumuş makale yorum
Salih Gündoğdu
7/2/2017 8:52:13 PM

Merhan kodlar için teşekkür ederim. Sayfa yapısı dikey olunca satırlar sığmıyor. Sayfa yapısını nasıl yatay olarak ayarlayabilirim. Birde benim formumda 2 Adet datagridview var ikisinide alt alta nasıl yazdırırım

hikmet okumuş makale yorum
Hikmet Okumuş
7/2/2017 11:51:22 PM

Merhaba Salih Gündoğdu,

1. sorunu google da doğrudan aratabilir ve bununla ilgili bir çok sonuç bulabilirsin. Bu senin çok fazla arge yapmanı gerektirecek bir konu değil. Türkçe bile bir çok cevap bulabilirsin. Önce araştır, bulamazsan yardımcı olurum.

2. sorunda ise tek bir belgede yazdırmak için, örnekte dataGridView1 nesnesi kullanılmış ve bu nesnenin Rows, Columns koleksiyonlarında işlemler yapılmıştır. Tek bir belge için bu yapıyı 2 grid içinde kapsayacak şekilde ayarlaman gerekiyor. Yani kodda değişiklik yapman gerekecektir.

hikmet okumuş makale yorum
taner soysüren
7/5/2017 3:05:38 PM

Merhaba Hikmet hocam

Elinize saglik. Cok guzel bir proje paylasmissiniz. Benim takildigim bir nokta oldu. Yardimci olursaniz sevinirim. C# da yeniyim. Eger basit gelirse yanlis anlamayin. Yaziciya gonderirken sag ust tarafta tarih yaziyor. Ben bu tarihin altina degerini texboxtan alan bir tarih daha eklemek istiyorum. Boyle birsey mumkunmu acaba?

hikmet okumuş makale yorum
Hikmet Okumuş
7/6/2017 1:10:56 AM

Merhaba Taner Soysüren,

Evet yapabilirsin. "String strDate" ile başlayan kısmın hemen altında "e.Graphics.DrawString" ile ekrana tarihi basan bir kod bulunmaktadır. Bu kodu kopyala ve altına yapıştır, strDate alanını textbox tan alacak şekilde revize et. Sonra üst üste çakışmaması için location için Height bilgisini düzenle. Bu şekilde istediğin gibi bir işlemi yapabilirsin.

hikmet okumuş makale yorum
taner soysüren
7/6/2017 11:51:04 PM

cok tesekkur ederim hikmet hocam. elinize bilginize saglik. basarilarin devamini dilerim.

hikmet okumuş makale yorum
Özkan
8/10/2017 12:17:53 PM

Hocam paylaşımınız için teşekkür ederim çok işime yaradı.. Ama benim bir sorum olacak yazdır dediğimiz de gridwiewdeki bütün kolanları yazdırıyor ben sadece belirli kolanları yazdırmak istiyorum çıktısını almak istiyorum bunu yapmak mümkünmü

hikmet okumuş makale yorum
Hikmet Okumuş
8/11/2017 1:49:10 AM

Merhaba Özkan,

Yukarıda benzer bir soru daha önce sorulmuştu. Tavsiye bir yöntem önermiştim. İncelersen sana yapmak istediğin çalışma için fikir verebilir.

hikmet okumuş makale yorum
veysel gül
9/6/2017 12:34:35 PM

Hikmet bey merhaba.Ben datagridview de click yaptığım tek satırın çıktısını almak istiyorum.Hepsini istemiyorum.Bunu nasıl yapabiliriz peki?Yardımcı olursanız çok sevinirim..

hikmet okumuş makale yorum
Hikmet Okumuş
9/7/2017 1:41:54 AM

Merhaba Veysel Gül,

Kodu aşağıdaki gibi revize edersen ve print preview işlemini grid' in doubleclick eventlarından birisine atarsan tek satıra ait bir çıktı elde edebilirsin.

//while (iRow <= dataGridView1.Rows.Count - 1)
while(iRow <= dataGridView1.SelectedRows.Count -1)
{
//DataGridViewRow GridRow = dataGridView1.Rows[iRow];
DataGridViewRow GridRow = dataGridView1.SelectedRows[iRow];

hikmet okumuş makale yorum
Şeyma Nurcan Doruk
9/22/2017 5:22:01 PM

Merhaba;
iTmpWidth = (int)(Math.Floor((double)((double)GridCol.Width /
(double)iTotalWidth * (double)iTotalWidth *
((double)e.MarginBounds.Width / (double)iTotalWidth))));
projede başlangıçta çalışıyodu daha sonra double tanımlamalarını silik gösterip önizleme dediğimde tablo gelmedi sorun nedir?

hikmet okumuş makale yorum
taner soysüren
10/7/2017 2:59:44 AM

Hocam tekrar merhaba. Bir sorum daha olacakti. Datagridviewi istedigimiz locationda nasil yazdiririz? mesela (0,80) gibi koordinattan baslatip yazdirmak istiyorum. Su andaki hali ortada yazdiriyor. Kagidin sol tarafina sifirlayip 80 ninci satirdan itibaren bastirmak istiyorum. Mumkunmu boyle birsey?

hikmet okumuş makale yorum
Ahmet Turan
10/17/2017 2:17:44 PM

Merhaba Hikmet bey,

Öncellikle sunduğunuz doküman için teşekkürler. Sorunum ise ön izleme ekranında bulunan yazdır alanının click olayına erişmek istiyorum. Yapmak istediğim yazdır kısmına bastığımda Windows yazıcı seçme ekranı ile yazıcıyı seçip öyle yazdırmak.

Şimdiden teşekkürler.

hikmet okumuş makale yorum
Hikmet Okumuş
10/22/2017 9:59:12 PM

Merhaba Ahmet Turan

PrintPreviewDialog nesnesini oluştururken aşağıdaki gibi custom bir button oluşturun ve toolbox içerisine ekleyin.

PrintPreviewDialog onizleme = new PrintPreviewDialog();
onizleme.Document = printDocument1;

ToolStripButton btnYazdir = new ToolStripButton("Yazdır");
btnYazdir.Click += btnYazdir_Click;
((ToolStrip)onizleme.Controls[1]).Items.Insert(0, btnYazdir);

onizleme.ShowDialog();

Yukarıdaki kod ile çalışma anında Yazdır butonunun toolbox üzerine eklendiğini göreceksiniz. btnYazdir_Click eventına aşağıdaki kodu ekleyin.

void btnYazdir_Click(object sender, EventArgs e)
{
if(printDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
printDocument1.PrinterSettings.PrinterName = printDialog1.PrinterSettings.PrinterName;
printDocument1.Print();
}
}

Son olarak ToolBox üzerinde bulunan PrintDialog kontrolünü forma ekleyin. Yazıcı seçimi için kullanılacaktır.
Bu adımları izleyerek yazdırma öncesinde yazıcı seçimini yapabilirsiniz.

hikmet okumuş makale yorum
Hasan aykul
10/31/2017 9:54:50 PM

Yatay olrak nasıl yazdırabilirim

hikmet okumuş makale yorum
onurayaz
11/6/2017 8:42:56 PM

hocam elinize sağlık size bir sorum olucak benim access programında raporum var ve ben bu raporu c# yazdır butonuna tıkladığımda o raporu yazdırmasını istiyorum yardımcı olurmusunuz ?

hikmet okumuş makale yorum
Galip Tiryaki
11/9/2017 11:47:52 AM

Merhaba Hikmet Hocam,
makalenizi okudum ve kullandım,
Çok işime yaradı açıkçası, çok teşekkür ederim.

Bununla ilgili iki sorum olacak size yardımcı olabilirseniz sevinirim.
1. İlgili datagridview verilerini 80mmX247mm formatındaki bir printer'a göndermem gerekiyor, bu sebeple gönderilecek alanı nasıl düzenlerim?
2. yine İlgili datagridview verilerini 80mmX247mm formatındaki bir printera gönderirken, Bazı kolonlarında total verisini sayfa sonu olarak nasıl ekleyebilirim?

datagridview
Tarih Fatura No Ürün Adı Fiyat Miktar Tutar Ödeme Yöntemi
09/11/2017 20171109001 abc - elbise 15.00 TRL 2 30.00 TRL Nakit
09/11/2017 20171109001 ac - elbise 17.00 TRL 2 34.00 TRL Nakit
09/11/2017 20171109001 ab - elbise 19.00 TRL 2 38.00 TRL Kredi
09/11/2017 20171109001 bc - elbise 21.00 TRL 2 42.00 TRL Kredi

AKTARMAK İSTEDİĞİM GÖRÜNTÜ
<<< 80 mm >>>
max 247mm ABC LTD. ŞTİ
Fatura No 20171109001
Tarih 09/11/2017



Ürün Adı Fiyat Miktar Tutar
abc - elbise 15.00 TRL 2 30.00 TRL
ac - elbise 17.00 TRL 2 34.00 TRL
ab - elbise 19.00 TRL 2 38.00 TRL
bc - elbise 21.00 TRL 2 42.00 TRL



Nakit 4 64.00 TRL
Kredi 4 80.00 TRL
Toplamlar 8 144.00 TRL

İlginiz için şimdiden teşekkür ederim.

hikmet okumuş makale yorum
Hikmet Okumuş
11/9/2017 10:39:41 PM

Merhaba Galip Tiryaki,

Örnkete DataGrid üzerindeki değerleri print etmek için graphic sınıfı kullanılıyor. Yukarıda benzer sorular mevcut, mesela sayfa numarası ekleme, sağa sola kaydırma gibi. Sende formu width - height değerleri ile oynayarak küçük ölçekte çizebilirsin. Gene benzer şekilde sayfa sonunda hesaplama yaptığın değeri sayfa numarası yazdırma gibi bir location da yazdırabilirsin. Ama bu senin için biraz yorucu olabilir. Anladığım kadarıyla bir fatura rapor çıktısına ihtiyacın var. Bunun için rapor kullanman daha doğru olacaktır. Örnek olarak aşağıdaki linkleri inceleyebilirsin, senin yapmak istediğin çıktı ile benzer özellikler taşımaktadır.

https://www.youtube.com/watch?v=b-pklSyx75M
https://code.msdn.microsoft.com/windowsdesktop/RDLC-Report-in-C-b106fc20
http://help.infragistics.com/Help/Doc/Reporting/2012.1/CLR4.0/html/Creating%20an%20Invoice%20Report.html

hikmet okumuş makale yorum
Mehmet süng0
12/2/2017 11:39:21 PM

kodlarınız işime yardı paylaşım için teşekkür ederim ben çıktı başlığında label de yazan yazıyı ve datargidview sonunda toplam lblfiyat lblfiyat1 lblfiyat2 değerlerini de yazdırmak istiyorum. yardımcı olur musunuz ?

hikmet okumuş makale yorum
Hikmet Okumuş
12/3/2017 5:21:16 PM

Merhaba Mehmet,

Text olarak "Çıktı Başlığı" yazan yerlere bir control ya da değişken set edersen, o içeriğin rapor çıktısında yazdırılmasını sağlayabilirsin. Bu kısmı basit bir şekilde halledebilirsin.

Alt toplam kısmını yapmak bu metod ile biraz zahmetli olabilir. Eğer yazdıracağın sayfa sayısı 1 ise PrintPage eventinin sonunda bir x, y koordinatına diğer örneklerde olduğu gibi "e.Graphics.DrawString" metodu ile değer yazabilirsin.

Eğer birden fazla sayfa yazdıracaksan bu kısım patlıyor. Çünkü PrintPage eventi her sayfa için çalışmaktadır. Bu da her sayfanın altında aynı bilginin yazılması anlamına geliyor. Bunu kontrol etmen bu yapıda biraz zor olabilir. Bunu daha profesyonel yapmak için rapor tasarımını araştırabilirsin. Aşağıdaki linkler sana fikir verecektir.

https://www.youtube.com/watch?v=b-pklSyx75M
https://code.msdn.microsoft.com/windowsdesktop/RDLC-Report-in-C-b106fc20
http://help.infragistics.com/Help/Doc/Reporting/2012.1/CLR4.0/html/Creating%20an%20Invoice%20Report.html

hikmet okumuş makale yorum
Mehmet CABA
12/31/2017 6:24:58 PM

Merhaba çalışmanız çok işime yaradı öncelikle teşekkür ederim elinize sağlık. Kodlarınız üzerinde küçük oynamalar yaptım konuyu daha iyi anlamak adına. Ancak bir sorun yaşıyorum şuanda. Preview ekranında tüm sayfaları görebiliyorum ancak yazdır butonuna bastığımda yazıcı sadece son sayfayı çıkartıyor. Yardımcı olabilirseniz sevinirim. İyi çalışmalar

hikmet okumuş makale yorum
Ufuk ŞAHİN
1/1/2018 1:30:24 PM

Merhabalar Hikmet Bey,

Çalışamanız işime yaradı teşekkür ediyorum. Sayfa numarası bastıırken global olarak değişkeni atayıp pageCount u  sayfa bağlığının yanına ekledim. pageCount a sayfa sayısını içinde tutacak ne apamm gerekiyor. Teşekkürler

hikmet okumuş makale yorum
Ufuk ŞAHİN
1/1/2018 2:32:08 PM

Mrhabalar,

Biraz araştırma yaparak Sayfa numarası koymayı buldum.

global değişken olarak int sayi =1; yapın

printDocument1_PrintPage en alta sayi++; değişkenini her seferinde arttırın.

ve e.Graphics.DrawString("Araç Sogusu - Sayfa" + sayfa, new Font(dataGridView1.Font, FontStyle.Bold), satırında düzenlemesi yapın Sayfa numarası atayacaktır.

Hocam birde 4/1  toplam sayfa numarası/ yazılan sayfa numarsı olacak şekile nasıl yapabiliriz. Toplam sayfa sayısı neyin içinde acaba ?

hikmet okumuş makale yorum
Hikmet Okumuş
1/3/2018 9:49:29 PM

Merhaba Mehmet Caba,

Örnek kodlar üzerinden çıktı işlemini denediğimde tüm sayfaların çıktısını vermektedir. Kodu tekrar gözden geçirmenizi tavsiye ederim. Sorun devam ederse kod bloğunu paylaşırsanız yardımcı olmaya çalışırım.

hikmet okumuş makale yorum
Hikmet Okumuş
1/3/2018 10:42:50 PM

Merhaba Ufuk Şahin,

Sayfa numarası ile ilgili daha önce bir soru sorulmuştu, orada çalışan bir yöntem paylaştım. Yukarıda Deniz YAZAR isimli kullanıcının soru ve cevabını okuyabilirsin.

Toplam sayfa sayısını yazdırmak için oluşacak toplam çıktı adetini biliyor olman gerekiyor. Ufak bir hesaplama ile bunu halledebilirsin. Sayfa numarasını yazar gibi bir property işini görecektir.

 

        public double TotalPage
        {
            get
            {
                double pageRowCount = 22;
                double pageAverage = (double)(dataGridView1.Rows.Count / pageRowCount);
                return Math.Ceiling(pageAverage);
            }
        }

 

Bir sayfada olabilecek max. satır sayısını belirle ve gridin satır sayısına böl. Bu sana toplam sayfa sayısını verecektir. Sayfa numarasının yanına TotalPage değişkenini yazdığında 4/1 gibi bir sonuç elde edebilirsin.

hikmet okumuş makale yorum
Oktay Karakaya
7/3/2018 4:19:54 PM

Merhaba hocam, ben 2 adet dataGridView'i bir word sayfasına bastırmak istiyorum. Ne yapmam gerekir? Bir de tablonun üst kısmından yer alan başlıkları ortalamak mümkün mü?

hikmet okumuş makale yorum
Behlül
8/22/2018 10:07:03 PM

Merhaba Hikmet Bey benim şöyle bir Sorum olacaktı ben datagriddeki satırları yazdırıyorum fakat satır sayım fazla olunca tek sayfaya sığmıyor taşma oluyor bu sorunun nasıl bi çözümü olabilir.



Yorum Ekle