Anasayfa / Yazılım / C# / OpenFileDialog Kontrolü

OpenFileDialog Kontrolü

Bu yazımdaki uygulamada OpenFileDialog kontrolünün kullanılması ile alakalı bir örnek yapacağım. Bu örneğimde bilgisayarımda mevcut olan bir text dökümanından veriyi okuyup bunu yazdırmaya değinmek istiyorum. Yapacağım işlem özet olarak şu, OpenFileDialog kullanarak dosyamı seçeceğim. System IO sınıfını kullanarak bu dosyayı okuyacağım. Daha sonra da baskı önizleme ile dosyamı göreceğim.

Öncelikle yeni bir windows projesi açalım. ToolBox?dan formuma bir adet menustrip kontrolü ekliyorum. Menu strip kontrolümü aşağıdaki şekilde doldurdum :

Daha sonra toolbox?dan OpenFileDialog kontrolümü formuma bıraktım. Bu kontrolümü menu strip alanımdan Dosya Aç kısmını seçtiğimde kullanacağım.

Sonraki adım toolbox?dan PrintPreviewDialog, PrintDocument, PrintDialog ve PageSetupDialog kontrollerini formuma ekliyorum.

Formuma dönüyorum Dosya menüsünde Sayfa Ayarı kısmında çift tıklıyorum ve Click eventi oluşmasını sağlıyorum. Daha sonra aşağıdaki kodları yazıyorum :

private void sayfaAyarıToolStripMenuItem_Click(object sender, EventArgs e)
        {
            printPreviewDialog1.ShowDialog();
        }

Daha sonra formumda design kısmına geri dönüyorum ve PageSetupDialog, PrintDialog ve PrintPreviewDialog kontrollerimi sıra ile seçip bu kontrollerin Document özelliklerini PrintDocument1 yapıyorum.

Sonraki adımda menu stripte dosya menüsünde Dosya Aç kısmında çift tıklıyorum ve Click eventinin oluşmasını sağlıyorum.

string a;
        string[] dizi;
        private void dosyaAçToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult dosyaAcDialogResult;
            dosyaAcDialogResult = openFileDialog1.ShowDialog();
            if (dosyaAcDialogResult == DialogResult.OK)
            {
                //FileSystem üzerinde bulunan bir dosyayı okumak için kullanılan bir reader nesnesidir. OpenFileDialog ile belirtilen yoldaki dosyayı oku diyoruz.
                StreamReader sr = new StreamReader(openFileDialog1.FileName);
                //StreamReader ile başından sonuna kadar okduğum dosyayı bir global olarak tanımladığım string değişkenim içine alıyorum
                a = sr.ReadToEnd();
                //StreamReader nesnemi işim bittiği için kapatıyorum. Yönetilemeyen objeler olduğu için kapatılması gerekir, hafızada gereksiz yere bellek işgalini önlemek istiyorum çünkü.
                sr.Close();
                dizi = a.Split('\n');
            }
        }

Sonraki adım, menu strip’te Yazdır seçeneği üzerinde çift tıklıyoruz ve Click eventinin oluşmasını sağlıyoruz. Buraya aşağıdaki kodları yazıyorum :

private void yazdırToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult yazdirResult = printDialog1.ShowDialog();
            if (yazdirResult == DialogResult.OK)
            {
                diziSayac = 0;
                printDocument1.Print();
            }
        }

Sonraki adım yine menustrip üstünde dosya dan baskı önizleme üzerinde çift tıklayarak Click eventinin oluşmasını sağlıyorum. Buraya aşağıdaki kodları yazıyorum :

 private void baskıÖnizlemeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            diziSayac = 0;
            printPreviewDialog1.ShowDialog();
        }

Sonraki adımda formumda design bölümüne dönüyorum ve PrintDocument kontrolümü seçiyorum. Sağda yer alan events kısmında PrintPage eventine çift tıklıyorum ve bu eventin oluşmasını sağlıyorum. Bu event altında aşağıdaki kodları yazıyorum.

 int diziSayac = 0;
        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            float solmarjin = e.MarginBounds.Left;
            float ustmarjin = e.MarginBounds.Top;
            float lines = 0;
            float yposizyon = 0;
            int sayac = 0;
            string currentLine;
            lines = e.MarginBounds.Height /this.Font.GetHeight(e.Graphics);

            while (sayac < lines && diziSayac <= dizi.Length - 1)
            {
                currentLine = dizi[diziSayac];
                yposizyon = ustmarjin + sayac * this.Font.GetHeight(e.Graphics);
                e.Graphics.DrawString(currentLine,this.Font,Brushes.Black,solmarjin,yposizyon, new StringFormat());
                sayac++;
                diziSayac++;                
            }

            if (!(diziSayac >= dizi.GetLength(0)-1)
            {
                e.HasMorePages = true;
            }
            else
            {
                e.HasMorePages = false;
            }
        }

Böylelikle uygulamam bitiyor, uygulamamı çalıştırıyorum ve Dosya menüsünden Dosya Aç diyorum bir TXT dosyasını göstermemiz gerekiyor burada, çünkü biz text dosyası okuma işlemi yaptık. Bu text dökümanının yerini gösterdikten sonra, yine dosyadan baskı önizleme dediğimde dosyamın baskı önizlemesini görebilirim.

Uygulamanın tüm kodları aşağıda :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace OpenFileDialogOrnek
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void sayfaAyarıToolStripMenuItem_Click(object sender, EventArgs e)
        {
            printPreviewDialog1.ShowDialog();
        }
        string a;
        string[] dizi;
        private void dosyaAçToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult dosyaAcDialogResult;
            dosyaAcDialogResult = openFileDialog1.ShowDialog();
            if (dosyaAcDialogResult == DialogResult.OK)
            {
                //FileSystem üzerinde bulunan bir dosyayı okumak için kullanılan bir reader nesnesidir. OpenFileDialog ile belirtilen yoldaki dosyayı oku diyoruz.
                StreamReader sr = new StreamReader(openFileDialog1.FileName);
                //StreamReader ile başından sonuna kadar okduğum dosyayı bir global olarak tanımladığım string değişkenim içine alıyorum
                a = sr.ReadToEnd();
                //StreamReader nesnemi işim bittiği için kapatıyorum. Yönetilemeyen objeler olduğu için kapatılması gerekir, hafızada gereksiz yere bellek işgalini önlemek istiyorum çünkü.
                sr.Close();
                //Her bir satır sonu için
                dizi = a.Split('\n');
            }
        }

        private void yazdırToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult yazdirResult = printDialog1.ShowDialog();
            if (yazdirResult == DialogResult.OK)
            {
                diziSayac = 0;
                printDocument1.Print();
            }
        }

        private void baskıÖnizlemeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            diziSayac = 0;
            printPreviewDialog1.ShowDialog();
        }

        int diziSayac = 0;
        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            float solmarjin = e.MarginBounds.Left;
            float ustmarjin = e.MarginBounds.Top;
            float lines = 0;
            float yposizyon = 0;
            int sayac = 0;
            string currentLine;
            lines = e.MarginBounds.Height /this.Font.GetHeight(e.Graphics);

            while (sayac < lines && diziSayac <= dizi.Length - 1)
            {
                currentLine = dizi[diziSayac];
                yposizyon = ustmarjin + sayac * this.Font.GetHeight(e.Graphics);
                e.Graphics.DrawString(currentLine,this.Font,Brushes.Black,solmarjin,yposizyon, new StringFormat());
                sayac++;
                diziSayac++;                
            }

            if (!(diziSayac >= dizi.GetLength(0)-1))
            {
                e.HasMorePages = true;
            }
            else
            {
                e.HasMorePages = false;
            }
        }
    }
}

Uygulamayı aşağıdaki linkten indirebilirsiniz :

Bir yorum

  1. Güzel anlatımlar olmuş teşekkürler, peki bu kontrollerle exceldeki verileri de yazdırma işlemini yapabilir miyiz ? Ve bunu özel boyutlardaki etikete yazdırabilir miyiz ? Yöntem nasıl olmalıdır ?
    Teşekkürler

Bir cevap yazın

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