C# Resim Yükleme İşlemi – Windows Form Application

Merhaba, bugün sizlere C# Form Application’ da fotoğraf/resim yükleme ile ilgili temel seviyede bilgiler vereceğim.

Günümüz programlama ekolüne baktığımızda burada anlattıklarım çok eski gelebilir. Fakat burada odaklanmamız gereken nokta nasıl kodlama yaptığımız değil bu uygulamanın mantığını yani iş mantığı (Business Logic) olmalıdır. Kısa birgirişten sonra yapacağımız işlem hakkında ufak bir tanıtım yapmak gerekiyor.

Bu Yazı Sonrasında Edineceğiniz Bilgiler Neler?

  • Yol bağımsız veri tabanına resim yükleme
  • Formlar arası geçiş
  • DataGridView ile etkileşime geçme
  • Tarihi eser de olsa 🙂 veri tabanına veri ekleme/listeleme
  • Dosya kopyalama, üzerine yazma

Neler Yapacağız?

Basit 3 tane form nesnemiz olacak. Birisi menü diğeri Öğrenci Listele ve sonuncusu da Öğrenci Ekle. İlk açılan form Menü Formudur.

Menü Formu Ekran Görüntüsü ve Kodları

Forma ait kodlar basit olduğu için sadece ekliyorum.

Belki burada garip gelen nokta formun örneği oluşturulurken new den sonra yazılan yerde parametre olarak this kullanımı olmuş olabilir.

Bu şekilde yazmamızın sebebi yeni açılacak olan forma bu formun referansı vermektir. Referans konusu aklınızı karıştırdıysa öncelikle referans tip nedir? sorusunun cevabını öğrenmeniz gerekir?

Öğrenci Ekle Formu Ekran Görüntüsü ve Kodları

Tasarımımız basit 4 tane TextBox nesnemiz var. Bir tane PictureBox 2 var. 2 tane Button umuz var. Bir tane de FileDialog nesnemiz bulunmaktadır. Name verme işlemi benim için önemli olduğundan kodlardan bu nesnelerin isimlerinin ne olduğunu anlayabilirsiniz? Eğer sorun yaşarsanız yorumlar kısmına isteğinizi belirtebilirsiniz.

Kodlamaya geçelim mi? Ne dersiniz?

a) Uygulama genel ayarları

Öncelikle using kısmına isim alanları(namespace) leri ekleyelim.

using System.IO;
using System.Data.OleDb;

Data.OleDb isim alanını anlatmaya gerek yok diye düşünüyorum.

Yukarıdaki IO olan isim alanı dosya ve klasörlerle işlem yapmamız için ekliyoruz. Projemizde öğrenci resmini ekleyeceğimiz için buna ihtiyacımız var.

Fotoğraflar klasöründe öğrencilerin resimlerini depolayacağız. Ekle düğmesine basıldığında seçilen resim fotoğraflar klasörüne kopyalanacaktır. Data klasörü ise Access veri tabanı ( 🙂 ) yer almaktadır.

b) Sınıf Düzeyi alanların tanımlanması

string fotografYol;
string fotografIsim;
OleDbCommand cmd;
OleDbConnection con;
Form gidilecekForm;

fotografYol değişkeni seçilen resmin orjinal yolunu tutacaktır.
fotografIsim değişkeni seçilen resmin adı ve uzantısını tutmaktadır.
gidilecekForm bu değişken bu formu açan formun(Menu Form) referansını saklayacaktır.
con ve cmd yi anlatmaya gerek yok sanırım.

c) Kurucu Metot Düzenlemesi

public KayitEkle(Form gelinenForm)
         {
             gidilecekForm = gelinenForm;
             InitializeComponent();

            con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data  Source=Data\data.accdb");     cmd = new OleDbCommand("", con);

        } 

public KayitEkle(Form gelinenForm) => bu kısım kurucu metot tanımlamasının yapıldığı kısımdır. GelinenForm ise bu formu açan formun referansının gelmesi için tanımlanan parametredir.

gidilecekForm = gelinenForm;
Buradaki kod ise gelen referans değeri sınıf düzeyinde saklayabilmek içindir.

d) Göz at Düğmesinin kodları

private void btnFotografSec_Click(object sender, EventArgs e)     

{         

        ofdFotografSec.FileName = "";         

          ofdFotografSec.Title = "Öğrencinin Fotoğrafını Seçiniz";                          

          ofdFotografSec.Filter = "Resim Dosyaları(*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF)|*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF|All files (*.*)|*.*";         

          ofdFotografSec.ShowDialog();         

          fotografYol = ofdFotografSec.FileName;         

          fotografIsim = ofdFotografSec.SafeFileName;                            

          pbFotograf.ImageLocation = fotografYol;     

}

ofdFotografSec nesnesi FileOpenDialog nesnesinin ismidir. Title isim Diyalog penceresinin başlık kısmıdır.

Filter ile diyalog penceresinin hangi dosya/dosyaları göstereceğini belirtilir. yazım şekli ise; | den sonra sağ alta gösterilecek isim. sonra | karakteri ve sonrasında o isme ait format yazılır.

All files (*.*)|*.* => All Files yazıcı görünür. Buna uygun format ise *.* dır.

ShowDialog ile diyalog penceresi açılır. Kullanıcı resmi seçip aç düğmesine basınca bir sonraki kod çalışır.

FileName ile seçilen dosyanın tam yolu alınır.

SafeFileName ile seçilen resmin sadece adı ve uzantısı alınır.

e) Ekle Düğmesinin kodları

private void btnEkle_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(fotografYol))
{
MessageBox.Show("Bir fotoğraf Seçiniz.");
}
else
{
con.Open();

string kopyalanacakYer = Application.StartupPath + "/Fotograflar/" + fotografIsim;
File.Copy(fotografYol, kopyalanacakYer,true);
string sql = "Insert Into Ogrenciler(Ad,Soyad,Numara,Sinif,FotografYol) Values(@Ad,@Soyad,@Numara,@Sinif,@FotografYol);";
cmd.CommandText = sql;
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("Ad",txtAd.Text);
cmd.Parameters.AddWithValue("Soyad", txtSoyad.Text);
cmd.Parameters.AddWithValue("Numara", txtNo.Text);
cmd.Parameters.AddWithValue("Sinif",txtSinif.Text);
cmd.Parameters.AddWithValue("FotografYol", "Fotograflar/" + fotografIsim);
cmd.ExecuteNonQuery();
con.Close();
}
} 

İlk kısımda resim seçilip seçilmediğine bakılıyor. Bu kodu if(fotografyol==””) şeklinde de yazılabilirdi.

Eğer resim seçilmiş ise bağlantı açılır ve hedef yol oluşturulur.

string kopyalanacakYer = Application.StartupPath + “/Fotograflar/” + fotografIsim;

Burada Application.StartupPath uygulamanın çalıştığı yol alınmış alınır. exe dosyanın çalıştığı konum gelecektir. Örneğin: C:\\Program Files(x86)\\OgrenciOtomasyonu

daha sonra fotoğrafların ekleneceği klasör adı ve dosya ismi birleştirilir.

(Not: Performans için bu birleştirme işleminin + operatörü yerine StringBuilder sınıfı ile yapılmasını tavsiye ederim. Ama temel işlemleri yapmak için burada + ile yapmış oldum.)


File.Copy(fotografYol, kopyalanacakYer,true); ile dosya kopyalama işlemi yapılıyor. true parametresi ise aynı isimli veri kopyalanacak yerde varsa üzerine yazılır. true parametresi yazılmazsa ( File.Copy(fotografYol, kopyalanacakYer); ) aynı dosyadan varsa hata verecek ve programın akışı kesilir.
Resim Fotograflar klasörüne kopyalanmış.


Gerisi zaten veri tabanına ekleme kodları.

ExecuteNonQuery ile veri eklenmiş olur
        private void KayitEkle_FormClosed(object sender, FormClosedEventArgs e)
        {
            gidilecekForm.Show();
        }

Kayıt Ekleme formu kapatıldığında Menü Formu açılacaktır.

Öğrenci Listele Formu Ekran Görüntüsü ve Kodları

DataGridView nesnesinden kayıt seçilince aşağıdaki gibi olur.

Kodlarına bakalım

        OleDbCommand cmd;
         OleDbConnection con;
         OleDbDataAdapter da;
         DataTable dt;

         Form gidilecekForm;

Yukarıdaki tanımlamaları sınıf düzeyinde yapıyoruz.

public Listele(Form gelinenForm)     

{         

         gidilecekForm = gelinenForm;         

           con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Data\data.accdb");         

           cmd = new OleDbCommand("", con);         

           dt = new DataTable();         

           InitializeComponent();    

}

Yukarıdaki kısımlar Ekle Formu ile benzer olduğu için açıklama yapmayaca gerek yok diye düşünüyorum.

private void Listele_Load(object sender, EventArgs e)     

{         

      string sql = "select * from Ogrenciler";         

      cmd.CommandText = sql;         

      da = new OleDbDataAdapter(cmd);         

      da.Fill(dt);         

      dgvOgrenciListesi.DataSource = dt;         

      dgvOgrenciListesi.Columns["Id"].Visible = false;     

}

Veri tabanındaki tüm kayıtları Form yüklendiği anda DataGridView e yüklenir. Veri tabanından gelecek kayıtlarda Id alanı kullanıcı tarafından görüntülenmemesi gerekir. Bu sebeple Id kolunu gizlendi

private void dgvOgrenciListesi_CellClick(object sender, DataGridViewCellEventArgs e)     

{         

    if(e.RowIndex>=0 && e.ColumnIndex>=0)         

    {             

        txtAd.Text = dgvOgrenciListesi["Ad", e.RowIndex].Value.ToString();             

        txtSoyad.Text= dgvOgrenciListesi["Soyad", e.RowIndex].Value.ToString();             

        txtNo.Text = dgvOgrenciListesi["Numara", e.RowIndex].Value.ToString();             

        txtSinif.Text = dgvOgrenciListesi["Sinif", e.RowIndex].Value.ToString();             

        pbFotograf.ImageLocation = dgvOgrenciListesi["FotografYol", e.RowIndex].Value.ToString();         

    }         

    else         

    {             

        //başlıklara tıklamış. Şu an için bir işlem yapılmayacak.         

    }     

}

DataGridView da tıklama işlemleri CellClick olayı ile gerçekleşmektedir. Öncesinde DataGridView ın başlıklarına tıklamada tetikleneceği için oralarda gelen index değerleri -1 dir. e parametresinde tıklanan kolon ve satırların index verileri gelir. Bu yüzden gelen index değeri -1 den büyükse ilgili kısımlara tıklanmış demektir.

private void Listele_FormClosed(object sender, FormClosedEventArgs e)
{
gidilecekForm.Show();
}

Form kapatıldığında menü formunu göstermesi sağlanır.

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.