Merhaba arkadaşlar. Bu dersimde projelerinizde ihtiyaç duyabileceğiniz C# listboxlar arası drag drop yani sürükle bırak konusuna değinmek istiyorum. Bu yazıyı daha önce bir yerde görmüştüm oradan fikir alarak yaptım. Ayrıca zaten gördüğüm yazıdaki işlemler hem çalışmıyor hemde eksikti. Bende hem çalıştırayım dedim hemde daha da geliştireyim dedim. Gördüğüm derste iki listbox kullanılmıştı ve sadece birinden diğerine item atabiliyordunuz. Yani geri alma yoktu. Ben ise formuma 8 tane listbox ekledim ve herhangi birinden herhangi birine item taşıyabiliyorsunuz.
C# Listboxlar Arası Drag Drop – Sürükle Bırak
Evet arkadaşlar. Giriş kısmında belirttiğim gibi formuma 8 tane listbox ekledim. Bu listboxların her birinden herhangi birine item taşıması yapabileceksiniz. Ayrıca bu listboxları bir panel içerisinde aldım ki hepsini tek seferde temizleyebileyim yani sıfırlayabileyim. Bu işlem içinde bir buton ekledim. Butona tıklayınca tüm listboxlar sıfırlanacak.
İşlem size çok uçuk gelebilir ama aslında o kadar zor bir işlem değil. Öncelikle form tasarımızı vereyim.
Ben burada örnek olsun diye 8 tane koydum ama siz isterseniz 100 tane bile koyabilirsiniz. Hiç sorun değil. Çünkü vereceğim kodlar nesnelere özel değil. Kodlarımız genellenmiş olduğundan 100 değil 500 tane listbox olsa bile sadece o 500 listbox‘u forma eklemek için uğraşacaksınız. Kodları bir kere yazacaksınız bir daha da dokunmanıza gerek kalmayacak. İşte böyle güzel kodlar vereceğim sizlere. :)
Hatta sadece ekran görüntüsü ile yetinmeyelim. Bu derse özel bir video hazırladım. Normalda 8 listbox eklemiştim ama işi abarttım ve 48 tane yaptım. Videoda ki versiyonda 48 tane listbox var ve hepsinin kendi aralarında rastgele sürükle bırak yaptım. Elbette o videoda kodları göstermedim. Kodlar sadece burada yer alıyor. Videoyu aşağıda görebilirsiniz.
Video’da görüyorsunuz. Tam 48 tane listbox‘un aralarında rastgele item değişimi yapıyoruz. Bu formun arkasında kodların tamamı ise sadece 74 satır.
C# Listboxlar Arası Drag Drop
İlk olarak bir listbox‘u dolduracağız. Oradan itemleri alıp videodaki gibi diğerlerine atacağız.
void Doldur() { for (int i = 0; i < 40; i++) { listBox1.Items.Add("List" + (i + 1).ToString() + " - " + (i + 1).ToString()); } }
Basit bir şekilde listbox‘u doldurduk. Şimdide formun en üstündeki sıfırlamayı yaptığımız kodları görelim. C# For Döngüsü Kullanımı ve İç İçe For Döngüleri hakkındaki dersimi görmek isterseniz bağlantıya tıklayabilirsiniz. bu metodumuzu formumuzun Load eventine de ekliyoruz ki form açıldığında listbox1 dolu gelsin.
private void btn_sifirla_Click(object sender, EventArgs e) { foreach (ListBox item in panel1.Controls) { item.Items.Clear(); } Doldur(); }
C# Foreach Döngüsü Kullanımı yazıma giderek ForEach döngüsü hakkında ayrıntılı bilgi alabilirsiniz.
Yukarıda bahsetmiştim. Tüm listboxlarımızı panel içerisine almıştık. İşte bu panelin amacı yukarıdaki kodları kullanabilmekti. Tek tek
listBox1.Items.Clear(); ... ... ... ... ...
yazmak mantıklı değil. Burada dikkat edilmesi gereken nokta panel’de listbox‘tan başka nesne olmaması gerekiyor. Aksi takdirde CastException hatası alırız. Yani atıyorum bir button koydunuz bu panele, o zaman “Button nesnesi ListBox nesnesine dönüştürülemedi” hatası yani CastException hatası alırsınız. Bunu çözmenin de yolu var ama en mantıklısı o panele başka nesne koyamamak.
Bu kodlarımızı verdikten sonra yapmamız gereken şey tüm listbox‘ları seçip, Properties ekranından AllowDrop özelliklerini True yapıyoruz. Aksi halde Drag Drop işlemleri çalışmayacaktır.
Şimdi formumuza istediğimiz sayıda listbox’u ekledik. C# listboxlar arası drag drop yani sürükle bırak işlemini yapabilmek için dört tane event kullanacağız. Listbox DragEnter Event, Listbox DragOver Event, Listbox MouseDown Event ve Listbox DragDrop Event ‘lerini kullanacağız. Şimdi kodlarımızı görelim.
Önce kodlarımızı yazacağız sonra eventlerin atamasını yapacağız.
C# Event Kavramları bu dersimde bu konudan etraflıca bahsetmiştim. Göz atmanızı tavsiye ederim.
Listbox DragEnter Eventi
private void listBox_DragEnter(object sender, DragEventArgs e) { if (e.KeyState == 1) e.Effect = DragDropEffects.Move; }
Burada Keystate == 1 şartı farenin sol tuşuna denk geliyor. Eğer farenin sol tuşuna tıklanmış ise Sürükle Bırak efektini Move yani hareket ettir olarak belirlemiş olduk.
Listbox DragOver Eventi
private void listBox_DragOver(object sender, DragEventArgs e) { if (e.KeyState == 1) e.Effect = DragDropEffects.All; }
Burada da aynı şekilde Keystate == 1 şartı farenin sol tuşuna denk geliyor. Eğer farenin sol tuşuna tıklanmış ise Sürükle Bırak efektini Herşey olarak belirledik.
Listbox MouseDown Eventi
Bu event, fare ile bir listbox‘a tıkladığımız anda tetikleniyor.
ListBox listbox_Item_Alinan; ListBox lstbox_Item_Birakilan; int Listbox_Index = 0; private void listBox_MouseDown(object sender, MouseEventArgs e) { listbox_Item_Alinan = sender as ListBox; Point kor_nokta = new Point(e.X, e.Y); Listbox_Index = listbox_Item_Alinan.IndexFromPoint(kor_nokta); if (Listbox_Index == -1) return; if (e.Button == MouseButtons.Left) listbox_Item_Alinan.DoDragDrop(listbox_Item_Alinan.Items[Listbox_Index].ToString(), DragDropEffects.All); }
Burada, en üstte gördüğünüz gibi kod ile iki ListBox tanımlaması yaptık. Birini, adından da anlayacağınız gibi içinden item alınan listbox’u tanımlamak, diğerini de yine adından anlayabileceğiniz gibi aldığımız itemi bırakacağımız listbox‘u tanımlamak için kullanacağız.
İnt değişkenimizi de aldığımız itemin index’i için kullanacağız.
Eventin içine geldiğimizde listbox_Item_Alinan ‘e sender sayesinde, fare ile tıkladığımız ListBox’u yüklemiş / atamış olduk. Bunu object sender sayesinde yapabiliyoruz.
Listbox üzerindeki itemlerden hangisine tıkladığımızın bilgisini (index’ini) ListBox IndexFromPoint metodu sayesinde farenin koordinatlarını kullanarak elde ediyoruz. Belirlediğimiz int değişkenine bu index’i atıyoruz.
Eğer index belirlenmemiş ise yani listbox üzerinde bir iteme değilde boş bir alan tıklanmış ise programın kırılmaması için return veriyoruz. Yani bir işlem yapmasını engelliyoruz. Eğer bir iteme tıklanmış ise ve bu tıklama farenin sol tuşu ise işleme devam edip listbox_Item_Alinan ‘a yüklediğimiz listbox’un DoDragDrop() metodunu çalıştırıyoruz.. Bu metod listbox item’i ve dragdropeffect sınıfında iki parametre istiyor. Aldığımız index bilgi ile yer değiştirmesini istediğimiz itemi gönderiyoruz.
DragDrop Eventi
Bu eventimiz, itemi bir listbox‘a bıraktığımız anda tetikleniyor.
private void listBox_DragDrop(object sender, DragEventArgs e) { lstbox_Item_Birakilan = sender as ListBox; lstbox_Item_Birakilan.Items.Add(listbox_Item_Alinan.Items[Listbox_Index]); listbox_Item_Alinan.Items.Remove(listbox_Item_Alinan.Items[Listbox_Index]); }
lstbox_Item_Birakilan listbox‘una itemi bıraktığımız listbox‘u yüklüyoruz / atıyoruz. Bu atamyı yaptıktan sonra itemin yerini değiştiriyoruz.
Tıkladığımız listbox lstbox_Item_Birakilan sayesinde zaten elimizde. listbox_Item_Alinan ‘dan aldığımız itemi Add metodu ile lstbox_Item_Birakilan listbox‘una, ekliyoruz. Amacımız taşıma olduğundan listbox_Item_Alinan ‘dan aldığımız itemi de Remove metodu ile siliyoruz.
Tüm kodlarımız bu kadar. Şimdi bu kodlarn iş görmesi için dizayn sayfasını açıyoruz ve tüm listbox‘ları seçtikten sonra Properties kısmından Events bölümüne geçiyoruz. Events kısmında yukarıda yazdığımız eventleri ilgili eventlere atamasını yapıyoruz. Aşağıdaki görseldeki gibi olacak.
Tüm listbox‘lara tek bir eventi atmış oluyoruz.
Projemizi çalıştıralım ve testimizi yapalım. Benim yaptığım testi videosu yukarıdadır.
Her zaman derim az kod çok iş diye. Kaldı ki bu kodları her listbox için yazsanız bile bu şekilde çalışmayacaktır. Her eventte eklenen tüm listboxlar için özellikle kodlar yazmanız gerekecektir. Üstelik %90 ihtimalle istediğiniz gibi yapamayacaksınız ve vazgeçecek ya da farklı bir çözüm yoluna gitmeye çalışacaksınız.
C# Listboxlar Arası Drag Drop – Sürükle Bırak dersi de bu kadar arkadaşlar.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.
Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz… Bu dersimde github projemde yerini almıştır.
Hiçbir yerde bulamayacağınız kaliteli dersler için Takipte ve Sağlıcakla kalın.
DragEventArgs.KeyState özelliğinin değerini 6 olarak belirlemek için hangi tuşları seçmemiz gerek?
Merhaba,
https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.drageventargs.keystate?view=netcore-3.1
Bu link sana yardımcı olabilir.
Kolay gelsin.
Merhaba,
birden fazla Flowlayoutpanel arası taşıma nasıl yapabilirim?
Merhaba,
Direk şöyle yapabilirsin diyemem maalesef. Benimde denemem gerekiyor.
Ancak bu yazıdaki yöntemleri deneyebilirsin. Direk çalışacağından emin olamasam da buna yakın olacağını düşünüyorum. Eğer vaktim olursa deneyecek fırsatım olursa yorumunu tekrar cevaplarım yada yazı olarak eklerim.