Bugün teslim ettiğimiz e-mail gönderme projesinde mesajlarla birlikte dosyaların da gönderilebiliyor olması gerekiyordu. Projede bu işlemi ToolStrip ve buton tıklayarak yaptık ancak bir çok programda kullanılan sürükle bırak(drag-drop) yönteminin de nasıl çalıştığını merak ediyordum. Aslında .NET ile bu işlem oldukça kolaylaşmış durumda.
Visual Studio’da yeni bir Windows Form projesi açtıktan sonra dizayn kısmından formumuza listbox ekliyoruz. Sürükle bırak yöntemini kullanılabilir hale getirmek için listbox’un özellikler kısmında “Allow Drop” özelliğinin değerini “True” yapmamız gerekiyor. Ardından ikinci resimde gözüktüğü gibi özellikler kısmındaki “Events” alanına giderek listbox ile kullanabileceğimiz özellikleri görebilirsiniz.
Herhangi bir dosyayı kontrol alanına sürükleyip vırakmak için aşağıda listelenen olayladan en az iki tanesine ihtiyaç duyacağız. Şu an için işimize yarayacak olanlar DragDrop ve DragEnter olduğu için burada da ikisiyle ilgili fonksiyonlara yer vereceğiz sadece.
- DragEnter: Bir dosyayı listbox’ın üzerine getirip fare imlecini bırakmayınca.
- DragOver: Dosyanın listbox’un üzerine kadar sürüklenmesi.
- DragDrop: Dosyayı listbox’un üzerine getirip fare imlecini bırakınca.
- DragLeave: Listbox’un üzerine getirilen dosya fare imleci çekilmeden tekrar listbox’ın dışına sürüklenince (Esc ile de yapılabilir).
DragEnter fonksiyonundaki “if” ifadesi sürüklenen içeriğin Windows’un sürükle-bırak işlemine izin verdiği tipte olup olmadığını kontrol eder (DataFormats.FileDrop). Eğer bu işlemin sonucu doğru dönerse dosya bırakma işlemine izin verecektir. Böylece DragDrop olayı GetData metodunu kullanarak bırakılan dosyayı bir string dizisine ekleyecektir. Bu dizi eklenen dosyaların bulundukları Windows dizininin tam yolunu içerecektir.
private void ListBox_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop, false) == true)
{
e.Effect = DragDropEffects.All;
}
}
private void ListBox_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files)
{
ListBox.Items.Add(file);
}
}