C# Dinamik Butonlarda Events Kullanımı ve Sürüklenebilir Buton
C# Dinamik Butonlarda Events Kullanımı ve Sürüklenebilir Buton
Daha fazla bilgi için : www.gorselprogramlama.com
Dinamik Buton: Form arayüzüne yerleştirilerek değil, Form classında tanımlanan kodlarla oluşturulan butonlara denir. Bütün Form elemanları dinamik olarak yazılabilir ve kullanılabilir.
Button Events: Buton olaylarına denir. Belli başlı Events kullanımlarını inceleyelim.
*Button_Click: Butona tıklandığında gerçekleşecek olayları derler.
*Button_Enter: Mouse butonun üstüne geldiği an gerçekleşecek olayları kontrol eder.
*Button_Leave: Mouse butonun üzerinden ayrıldığı an gerçekleşecek olayları kontrol eder.
*Button_Hover: Mouse butonun üzerinde durduğu an gerçekleşecek olayları kontrol eder.
*Button_Move: Mouse butonun üzerinde hareket ettikçe gerçekleşecek olayları kontrol eder.
*Button_MouseUp: Mouse’un herhangi bir tuşuna basıldıktan sonra o tuşun yukarı kalktığı an gerçekleşecek olayları kontrol eder.
*Button_MouseDown: Mouse’un herhangi bir tuşuna basılırken o tuşun aşağı indiği an gerçekleşecek olayları kontrol eder.
TextBox_Events: TextBox olaylarına denir. Biz burada sadece KeyPress olayını kullanacağız.
*TextBox_KeyPress: Textbox’a yazı yazılırken basılan herbir karakterden sonra gerçekleşecek olayları kontrol eder.
Örnek: Bir program yazalım. Yazdığımız programın içinde oluşturulacak Buton sayısını alalım. Ardından aldığımız sayıda Form içine random yerlerde butonlar ekleyelim ve bu butonlar sürüklenebilir olsun. Bu programı yazmamız için Form İçerisine bir adet GroupBox, bir adet “static” Button, bir adet TextBox ekleyelim. Kafamız karışmaması için de elemanlarımızın adını şu şekilde değiştirelim:
groupBox1=grpBtn ve grpBtn.BackColor=Color.LightYellow,
textbox1=txtSayi,
button1=btnEkle.
İlk olarak txtSayi metnine sadece rakam girilmesi için txtSayi elemanımızın KeyPress olayını aktif edelim ve gerekli kodu yazalım:
private void txtSayi_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);/*Eğer basılan tuş karakter ya da noktalama işareti ise bunların yazımını engellemesi i.in bu satırı yazdık */ }
Sayıyı girdikten sonra static butona tıklanınca, oluşacak dinamik butonları oluşturalım.
int[] ilkX;//Oluşturulacak Butonların X. kordinatlarını bu diziye atacağız. int[] ilkY;//Oluşturulacak Butonların Y. kordinatlarını bu diziye atacağız. bool suruklenmedurumu = false;/*İki duruma göre sürüklenip sürüklenmeyeceğini takip etmemiz için suruklenmedurumu'nu tanımladık.*/ Point ilkkonum;/*Tıklanan Butonun bir önceki konumunu kayfetmek için tanımladık.*/ private void btnEkle_Click(object sender, EventArgs e) { btnEkle.Enabled = false;/*İlk olarak butonumuzu pasif ettik.*/ int ekleneceksayi = Convert.ToInt32(txtSayi.Text);//Oluşturulacak Buton sayısını aldık. ilkX = new int[ekleneceksayi+1];//İlk elemanımız 0-0 olacağı için bir fazla yer ayırıyoruz. ilkY = new int[ekleneceksayi+1];//İlk elemanımız 0-0 olacağı için bir fazla yer ayırıyoruz. ilkX[0] = 0;//Değerini atadık. ilkY[0] = 0;//Değerini atadık. Random rnd = new Random(); //Random sınıfından rnd nesnesi oluşturduk. Random rnd2 = new Random();//Random sınıfından rnd2 nesnesini oluşturduk. for (int i = 0; i < ekleneceksayi; i++) { int sayiX = 0; int sayiY = 0; sayiX = rnd.Next(0, 150);//rnd yardımıyla random bir sayı ürettik. sayiY = rnd2.Next(0, 200);//rnd2 yardımıyla bir sayı ürettik. Button btn = new Button();//Buton sınıfından btn adlı bir nesne ürettik. btn.Click += new EventHandler(btn_Click);/*btn'a ait Click olayını tanımladık. Şuan altı çizili gösterecektir. Ancak otomatik düzenlemede metot üret dersek Click Olayının içini doldurabiliriz*/ btn.Location = new Point(sayiX,sayiY);//btn'un lokasyonunu atadık. btn.MouseMove += new MouseEventHandler(btn_move);/*btn'a ait _MouseMove olayını tanımladık. Şuan altı çizili gösterecektir. Ancak otomatik düzenlemede metot üret dersek btn_move Olayının içini doldurabiliriz*/ btn.MouseDown += new MouseEventHandler(btn_down);/*btn'a ait _MouseDown olayını tanımladık. Şuan altı çizili gösterecektir. Ancak otomatik düzenlemede metot üret dersek btn_down Olayının içini doldurabiliriz.*/ btn.MouseUp += new MouseEventHandler(btn_up);/*btn'a ait _MouseUp olayını tanımladık. Şuan altı çizili gösterecektir. Ancak otomatik düzenlemede metot üret dersek btn_up Olayının içini doldurabiliriz.*/ btn.MouseEnter += new EventHandler(btn_Enter);/*btn'a ait _MouseEnter olayını tanımladık. Şuan altı çizili gösterecektir. Ancak otomatik düzenlemede metot üret dersek btn_Enter Olayının içini doldurabiliriz.*/ btn.MouseLeave+= new EventHandler(btn_Leave);/*btn'a ait _MouseLeave olayını tanımladık. Şuan altı çizili gösterecektir. Ancak otomatik düzenlemede metot üret dersek btn_Leave Olayının içini doldurabiliriz.*/ btn.Name = "btn_" + (i + 1).ToString();//btn'a isim atadık. btn.BackColor = Color.PaleTurquoise;//btn arkaplanına renk verdik. btn.FlatStyle = FlatStyle.Flat;//btn düzlük şeklini belirledik. btn.Size = new System.Drawing.Size(50, 50);//btn'nin Boyutlarını atadık. btn.Text = (i + 1).ToString();//btn textlerini değiştirdik. grpBtn.Controls.Add(btn);//Oluşturduğumuz btn'yi grpBtn'a ekliyoruz ilkX[i+1] = btn.Location.X;//btn ilk X lokasyonunu atadık. ilkY[i+1] = btn.Location.Y;//btn ilk Y lokasyonunu atadık. } }
Şimdi hata aldığımız yerler olan
btn_Leave
btn_Enter
btn_up
btn_down
btn_Click
btn_move Events’larının içini sırayla dolduralım:
private void btn_Leave(object sender, EventArgs e) { Button gecici = (sender as Button);//üzerinden ayrilan butona simdilik olarak "gecici" ismini atadık. gecici.BackColor = Color.PaleTurquoise;//ve arkaplanını belirledik. } private void btn_Enter(object sender, EventArgs e) { Button gecici = (sender as Button);//üzerine gelinen butona simdilik olarak "gecici" ismini atadık. gecici.BackColor = Color.Crimson;//Arkaplanını crimson adlı rengini verdik. } private void btn_up(object sender, MouseEventArgs e) { Button gecici = (sender as Button);//üzerine tiklanan butona simdilik olarak "gecici" ismini atadık. suruklenmedurumu = false;/*Şuan sürükleme durumu false olmalı. Yani mouse'un tuşu yukarı kalkmaya başladığı anda sürükleme durur.*/ gecici.Cursor = Cursors.Default;//İmleç normal görünümüne gelir. } private void btn_down(object sender, MouseEventArgs e) { Button gecici = (sender as Button);/*üzerinde mousenin tuşunun basılmaya başlandığı btn adi simdilik gecici oluyor*/ suruklenmedurumu = true;//Sürüklenebilir diyoruz. gecici.Cursor = Cursors.SizeAll;//imleç sizeAll tipine dönüştürülür. ilkkonum = e.Location;//Şimdiki lokasyonunu ilkkonuma atıyoruz. } private void btn_move(object sender, MouseEventArgs e) { Button gecici = (sender as Button);/*Hareket eden btn adi simdilik 'gecici' diyoruz*/ if (suruklenmedurumu)//Sürüklenme durumu açıksa yeri belirtilen ölçeklerde değişecektir. { gecici.Left = e.X + gecici.Left - (ilkkonum.X); gecici.Top = e.Y + gecici.Top - (ilkkonum.Y); } } private void btn_Click(object sender, EventArgs e) { Button gecici = (sender as Button);//Tıklanan buton adi gecici olsun int x = gecici.Location.X; int y = gecici.Location.Y; if (gecici.Left >= 230 || gecici.Top >= 330) { MessageBox.Show("Panel İçinde yer seçiniz", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error); /*grpbtn dışına çıkılacaksa hata versin*/ gecici.Left = ilkX[Convert.ToInt32(gecici.Text)]; /*İlkX dizisindeki geciciye ait buton indexindeki X'i getirir.*/ gecici.Top = ilkY[Convert.ToInt32(gecici.Text)];&lt;/pre&gt; /*İlkY dizisindeki geciciye ait buton indexindeki Y'i getirir.*/ //Panel dışına çıkılırsa btn önceki lokasyonuna gidilsin. } if (gecici.Left <= -1 || gecici.Top <= -1) { MessageBox.Show("Panel İçinde yer seçiniz", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error); gecici.Left = ilkX[Convert.ToInt32(gecici.Text)]; gecici.Top = ilkY[Convert.ToInt32(gecici.Text)]; //Panel dışına çıkılırsa btn önceki lokasyonuna gidilsin. } }
Projenin Tamamı :
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int[] ilkX; int[] ilkY; bool suruklenmedurumu = false; Point ilkkonum; private void txtSayi_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar); } private void btnEkle_Click(object sender, EventArgs e) { btnEkle.Enabled = false; int ekleneceksayi = Convert.ToInt32(txtSayi.Text); ilkX = new int[ekleneceksayi+1]; ilkY = new int[ekleneceksayi+1]; ilkX[0] = 0; ilkY[0] = 0; Random rnd = new Random(); Random rnd2 = new Random(); for (int i = 0; i < ekleneceksayi; i++) { int sayiX = 0; int sayiY = 0; sayiX = rnd.Next(0, 150); sayiY = rnd2.Next(0, 200); Button btn = new Button(); btn.Click += new EventHandler(btn_Click); btn.Location = new Point(sayiX,sayiY); btn.MouseMove += new MouseEventHandler(btn_move); btn.MouseDown += new MouseEventHandler(btn_down); btn.MouseUp += new MouseEventHandler(btn_up); btn.MouseEnter += new EventHandler(btn_Enter); btn.MouseLeave+= new EventHandler(btn_Leave); btn.Name = "btn_" + (i + 1).ToString(); btn.BackColor = Color.PaleTurquoise; btn.FlatStyle = FlatStyle.Flat; btn.Size = new System.Drawing.Size(50, 50); btn.Text = (i + 1).ToString(); grpBtn.Controls.Add(btn); ilkX[i+1] = btn.Location.X; ilkY[i+1] = btn.Location.Y; } } private void btn_Leave(object sender, EventArgs e) { Button btn = (sender as Button); btn.BackColor = Color.PaleTurquoise; } private void btn_Enter(object sender, EventArgs e) { Button btn = (sender as Button); btn.BackColor = Color.Crimson; } private void btn_up(object sender, MouseEventArgs e) { Button btn = (sender as Button); suruklenmedurumu = false; btn.Cursor = Cursors.Default; } private void btn_down(object sender, MouseEventArgs e) { Button btn = (sender as Button); suruklenmedurumu = true; btn.Cursor = Cursors.SizeAll; ilkkonum = e.Location; } private void btn_move(object sender, MouseEventArgs e) { Button btn = (sender as Button); if (suruklenmedurumu) { btn.Left = e.X + btn.Left - (ilkkonum.X); btn.Top = e.Y + btn.Top - (ilkkonum.Y); } } private void btn_Click(object sender, EventArgs e) { Button btn = (sender as Button); int x = btn.Location.X; int y = btn.Location.Y; if (btn.Left >= 230 || btn.Top >= 330) { MessageBox.Show("Panel İçinde yer seçiniz", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error); btn.Left = ilkX[Convert.ToInt32(btn.Text)]; btn.Top = ilkY[Convert.ToInt32(btn.Text)]; } if (btn.Left <= -1 || btn.Top <= -1) { MessageBox.Show("Panel İçinde yer seçiniz", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error); btn.Left = ilkX[Convert.ToInt32(btn.Text)]; btn.Top = ilkY[Convert.ToInt32(btn.Text)]; } } private void btnEkle_MouseEnter(object sender, EventArgs e) { } private void Form1_Load(object sender, EventArgs e) { } } }