Ö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.
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.
(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ç :
Umarım yardımı olur. Tekrar görüşmek üzere ! J


