Herkese merhaba!

Önce kendimle ilgili bir haber vererek başlamak istiyorum. 11 Haziran 2007 tarihinden itibaren Bilge Adam’daki  görevimi  bırakarak, Proje Yöneticisi olarak başka bir firmada göreve başladım. Son zamanlarda blogu çok aksattım, telafi edeceğiz inşallah.

Bu yazımda değinmek istediğim konu, okurlarımdan birinden geliyor. Sevgili “Fatih”, diskimizdeki  herhangi bir dosyayı , uygulamamız üzerindeki ListView içine bıraktığında, dosyanın ikonunun otomatik olarak gösterilip gösterilemeyeceğini sormuş.

İşte cevabı :

1.       Öncelikle yeni bir proje oluşturuyoruz. C# ile hazırladım, vakit bulabilirsem VB.NET örneğini de göstereceğşm daha sonra. Ama zaten çevirmek kolay olur diye düşünüyorum.

      dfi_01.jpg

 

 

2.       Projeyi oluşturduktan sonra formun üzerine 1 adet ListView yerleştiriyoruz. Özellikleri aşağıdaki şekilde olmalı :

Name               lstDosyaListesi
Allow Drop      true
View                 Details
Columns           2 adet (özelliklerinin çok bir önemi yok)

3.       Bu düzenlemeyi yaptıktan sonra form üzerine bir ImageList ekliyoruz. Özellikleri aşağıdaki gibi olmalı :

Name               imgIkonlar

4.       Property Box kullanarak, lstDosyaListesi kontrolümüzün SmallImageList özelliğini imgIkonlar kontrolüne bağlıyoruz.

             dfi_02.jpg

             (Genel Görünüm)

 

Bilmemiz gereken 2 Event Handler var. Bunlardan ilki DragEnter, diğeri ise DragDrop

 

DragEnter
Bu event, sol klik basılı iken sürüklenen nesne, kontrolümüzün sınırları içerisine girdiği anda tetikleniyor.  Önemli olan nokta, drag işleminin tipini belirtmemiz gerekiyor olması (Effect) .NET bize bu konuda aşağıdaki opsiyonları sunuyor :

Copy   Sürüklenen nesnenin kopyalanmasını istemek.
Move  Sürüklenen nesnenin taşınmasını istemek.
Link     Sürüklenen nesnenin kısayoluna ulaşmak.
None   Sürüklenen nesneyi kontrol üzerinde bırakılsa bile işleme almamak.
Scroll   Scroll (?)
J Henüz inceleyemedim
All        Listedeki hareketlerden herhangi birinin oluşmasına izin vermek.

Bizim senaryomuz gereği copy, move tarzı hareketlere gerek yok. Bu tip hareketler aynı uygulama içindeki birden fazla ListView arasında item’ları kopyalamak veya taşımak için daha çok kullanılıyor. Bizim amacımız sürüklenen dosyanın path bilgisini ve dosyanın adı ile uzantısını elde etmek. (Ben yinede Effect.Copy tanımlasını kullandım)

DragDrop
Bu event, kontrol üzerine sürüklenen nesne bırakıldığında tetikleniyor. Ikonun ne olduğuna karar verip listeye ekleyeceğimiz yer burası.

 

1.       Önce DragEnter event handler’ını yazıyoruz:

       private void lstDosyaListesi_DragEnter(object sender, DragEventArgs e)
      
{
         
e.Effect = DragDropEffects.Copy;
      
}

2.       Daha sonra da DragDrop event handler’ını yazıyoruz

      private void lstDosyaListesi_DragDrop(object sender, DragEventArgs e)      
      
{
         string[] dragDropEdilenDosyalar =
             (string[])e.Data.GetData(DataFormats.FileDrop, false);
        
        
foreach (string strDosyaAdi in dragDropEdilenDosyalar)
         {
            // Dosya uzantısının Windows Registry’de kayıtlı ikonunu al
            System.Drawing.Icon insIkon = SystemIcons.WinLogo;
 
           insIkon = Icon.ExtractAssociatedIcon(strDosyaAdi);
            // Extract edilen ikonu ImageList içine kaydediyoruz.
            // Eğer önceden kayıtlıysa kaydetmeyeceğiz ama :)
 
           // Öncelikle elimizdeki dosya yolunu FileInfo
            // nesnesine bağlıyoruz.
 
           System.IO.FileInfo insFileInfo = new System.IO.FileInfo(strDosyaAdi);
            if (!imgIkonlar.Images.ContainsKey(insFileInfo.Extension))
            {
              //Bu ikon listede yok, ekle
              imgIkonlar.Images.Add(insFileInfo.Extension, insIkon);
            }
            // Son olarak, Drag & Drop edilen dosyanın adını ve ikonunu
 
           // Listview üzerinde göstermek kaldı
            ListViewItem insListViewItem = new ListViewItem();
            
           
insListViewItem.ImageIndex =
                 imgIkonlar.Images.IndexOfKey(insFileInfo.Extension);
           
            insListViewItem.SubItems.Add(insFileInfo.Name);
            lstDosyaListesi.Items.Add(insListViewItem);
         
}
      }

İşte sonuç :

               dfi_03.jpg

Umarım yardımı olur. Tekrar görüşmek üzere ! J

 

Leave a Reply