Dinamik buton oluşturup kontrol etme

Runtime zamanında bazen dinamik buton oluşturmak istemişizdir. Yada kod ile buton oluşturmak…  Buna, kullanıcının ihtiyacına karşı olarak projelerimizde kullanmaktayız.

dinamik-coklu-buton

Örneği anlamak için form ekranıına bir adet label, textbox ve buton resimdeki gibi oluşturup kodlamaya geçebiliriz. Kullanıcıdan alınan buton sayısı doğrultusunda form ekranın büyüklüğüne göre oluşturulan butonları boyutlandıra biliriz.

Boyutlandırmadaki amaç birden fazla buton eklendiği için normal şartlarda yan yana veya alt alta standart boyutta buton oluşturmakta. Hem bunları bir sıraya sokup hemde formun genişliğine ve yüksekliğini referans alarak butonları düzgün bir şekilde göstere biliriz.

 private void button1_Click(object sender, EventArgs e)
        {
            int butonSayisi = Convert.ToInt32(textBox1.Text);
            int sol = 1; //formun sol tarafından atanan değer
            int alt = 50; // formun üst tarafından atanan değer
            int bol; // bolme işlemindeki amaç formun boyutuna göre butonları sıralı bir şekilde görebilmek için
            bol = Convert.ToInt32(Math.Ceiling(Math.Sqrt(butonSayisi)));

            for (int i = 1; i <= butonSayisi; i++)  // girilen buton sayısına göre döngü şartı sağlanana kadar oluşturmakta
            {
                Button btn = new Button();
                btn.Name = i.ToString();

                btn.AutoSize = false;

                btn.Size = new Size(this.Width / bol, this.Height / (bol * 2));
                btn.Text = "Buton " + i.ToString();
                btn.Font = new Font(btn.Font.FontFamily.Name, 18);
                btn.Location = new Point(sol, alt);
                this.Controls.Add(btn);
                sol += btn.Width + 5;

                if (sol + this.Width / bol > this.Width) // bunu yapmasaydık butonlar yan yana dizilir alt satıra geçmedi
                {
                    sol = 1;
                    alt += this.Height / (bol * 2) + 5;
                }

                btn.Click += new EventHandler(dinamikMetod); // dinamik olarak oluşturulan butonu kontrol etmek için her oluşturulan butonun clik olayına atıyoruz.

            }
        }

Kod içinde yeterli açıklama mevcut.  Genel olarak anlatırsak; form içinde butonları düzgün bir şekilde görünebilmesi için girilen buton sayısı değerinin Math.Sqrt ile kare kökünü alıp sonucun doğru bir şekilde çıkması için Math.Ceiling ile yuvarladık.  Bunu yapmamızın nedeni, kullanıcının girdiği buton sayısına göre butonların büyüklüğünü ayarlayabilmek. Bunu yapmasak kullanıcı 100 tane buton istese, buton büyüklüğünü önceden girdiğimiz için butonları çoğu taşacak veya üst üste gelerek kötü bir görüntü elde edeceğiz. Örneği uygulayarak konuyu anlayacağınızı umuyorum.

Dinamik olarak oluşturulan butonu nasıl yakalayabiliriz derseniz üst tarafta oluşturduğumuz butonlar içine atanan clik olayını metod yardımı ile yakalayıp, runtime da oluşturulan butona tıklanıldığında o butona ait isim, vs özelliklerine ulaşabiliriz. Bunun için alttaki kodları örneğimize dahil ederek konuyu öğrenebilirsiniz.

 protected void dinamikMetod(object sender, EventArgs e)
        {
            Button dinamikButon = (sender as Button);
            MessageBox.Show(dinamikButon.Text + " isimli butona tıkladınız");
        }

Burada tıklatılan butonun textini mesaj kutusunda gösterdik.

Aynı şekilde diğer kontrolleri de(label, combobox gibi) oluşturabiliriz.  Bu örnek uygulamayı nerede kullanabiliriz derseniz; adisyon programında işletme sahibinden girilen masa sayısını form ekranına gösterip, herhangi masa hesabını açmak ve kapatmak için kullanabiliriz.

Textboxa sadece harf veya rakam girme

Windows form projelerinde, web formundaki gibi kullanıcı kontrolleri gibi hazır bileşenler bulunmuyor. Haliyle yazılımcı kendi kontrol mekanizmasını kendisi yazmak zorunda kalıyor. Bunlardan bir tanesi de textbox metin kutusu kontrolü.

Windows formdaki textbox aracılığı ile kullanıcıdan kısıtlı veri isteyebiliriz. Örneğin telefon numarası girdisi veya yalnızca harflerden oluşan bir metin girdisi… Bu kısıtlamayı yapmak için kullanılan textbox ın KeyPress olayına aşağıdaki kodları kullanabilirsiniz.

Sadece harf girilmesini istiyorsanız ;

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsLetter(e.KeyChar) && !char.IsControl(e.KeyChar) &amp;&amp; !char.IsSeparator(e.KeyChar);
}

Sadece sayı yani rakam girilmesini istiyorsanız;

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
}

 

Ado.Net veri kayıt et güncelle sil

Microsoft’un veriye erişmek için geliştirdiği teknoloji Ado.net ile veritabanımızdaki verilere ulaşarak veri alış verişi yaptırabiliyoruz.(Bu ilk cümleyi kurmak için harcadığım zamanı yazının devamı için harcamıyorum 🙂 ) Sık sık kullandığımız bu teknolojiyi bazen unutabiliyoruz. Arayüz aracılığı ile basit bir kayıt nasıl yapılır yada güncelleme, silme… Hatırlatma ve öğrenme babında bu yazıyı yazmak istedim.

ado-net-kayit-guncelle-sil

Resimdeki gibi basit bir form hazırlayıp Ado.net teknolojisi sayesinde veritabanına nasıl kayıt girme, güncelleme, silme gibi işlemleri beraber yapalım. Formdan önce Management Studio da bir veritabanı oluşturup içerisine tblKullanıcılar(farklı bir isim verebilirsiniz) adında tablo oluşturarak devam edebiliriz.

ado-net-veritabani

Resimdeki gibi formu oluştururken kafanız karışmasın, öğrenme maksadı ile yaptığım için ayrı ayrı butonlar ile olayları uyguladım. Burada kayıdı göstermek için listview kontrolünü kullandım. Aynı zamanda kayıt edildikten sonra listview e kayıt edilen veriyi çektim.

Listview’e veritabanındaki veriyi göstermek için, kod içinde tekrar tekrar yazmamak için listview doldurma metodunu hazırladım.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void listviewDoldur()
{
listView1.Items.Clear();
SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");

SqlCommand doldur = new SqlCommand("select * from tblKullanicilar", sql);
sql.Open();
SqlDataReader rdr = doldur.ExecuteReader();
while (rdr.Read())
{
ListViewItem li = new ListViewItem();
li.Text = rdr["ID"].ToString();
li.SubItems.Add(rdr["Adi"].ToString());
li.SubItems.Add(rdr["Soyadi"].ToString());
li.SubItems.Add(rdr["Telefon"].ToString());
li.SubItems.Add(rdr["Adres"].ToString());

listView1.Items.Add(li);
}

sql.Close();
}

Listview doldurma metodunu kayıt, güncelleme ve silme işlemlerinden sonra kullanacağız. Güncelleme veya silme işlemi yapabilmek için listviewden kayıt seçmemiz gerekir. Kayıtı seçip tekrar textboxlar içinde göstererek  kayıtlı veri üzerinde işlem yapabiliriz. Listview içindeki veriyi textboxlar içinde gösterebilmek için listview kontrolünün SelectedIndexChanged olayına alttaki kodları yazalım. id değişkenini güncelleme ve silme işleminde referans olarak kullanacağımız için  glabal olarak tanımladım.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
string id;
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count > 0)
{
ListViewItem li = listView1.SelectedItems[0];
id = li.SubItems[0].Text;
txtAdi.Text = li.SubItems[1].Text;
txtSoyadi.Text = li.SubItems[2].Text;
txtTelefon.Text = li.SubItems[3].Text;
txtAdres.Text = li.SubItems[4].Text;

}
}

İlk önce veritabanına kayıt işlemini gerçekleştirelim

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private void btnKaydet_Click(object sender, EventArgs e)
{
SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");

SqlCommand cmd = new SqlCommand();
cmd.Connection = sql;
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = "insert into tblKullanicilar (Adi, Soyadi, Telefon, Adres) values (@adi, @soyadi, @telefon, @adres)";
cmd.Parameters.AddWithValue("@adi",txtAdi.Text );
cmd.Parameters.AddWithValue("@soyadi", txtSoyadi.Text);
cmd.Parameters.AddWithValue("@telefon", txtTelefon.Text);
cmd.Parameters.AddWithValue("@adres", txtAdres.Text);

sql.Open();

int etkilenen = cmd.ExecuteNonQuery();

sql.Close();

if (etkilenen > 0)
{
MessageBox.Show("Kayıt edildi...");
}
else
{
MessageBox.Show("Kayıt edilmedi !!!");
}

//Listview i dolduruyoruz alttaki metod ile

listviewDoldur();

}

 

Kayıt edilmiş veriyi  güncelleme yapabilmek için;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void btnGuncelle_Click(object sender, EventArgs e)
{
SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");

SqlCommand cmd = new SqlCommand();
cmd.Connection = sql;
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = "update tblKullanicilar set Adi=@adi, Soyadi=@soyadi, Telefon=@telefon, Adres=@adres";
cmd.Parameters.AddWithValue("@adi", txtAdi.Text); // buradaki id global tanımladığımız değişken aracılığı ile listview de seçilen kayıdın id sini tutmakta
cmd.Parameters.AddWithValue("@soyadi", txtSoyadi.Text);
cmd.Parameters.AddWithValue("@telefon", txtTelefon.Text);
cmd.Parameters.AddWithValue("@adres", txtAdres.Text);

sql.Open();

int etkilenen = cmd.ExecuteNonQuery();

sql.Close();

if (etkilenen > 0)
{
MessageBox.Show("Güncellendi...");
listviewDoldur();
}
else
{
MessageBox.Show("Güncelleme başarısız !!!");
}
}

Kayıt edilmiş veriyi silmek için,

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void btnSil_Click(object sender, EventArgs e)
{
SqlConnection sql = new SqlConnection("server=.; database=coder; trusted_connection=true;");

SqlCommand cmd = new SqlCommand();
cmd.Connection = sql;
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = "delete from tblKullanicilar where ID=@id";
cmd.Parameters.AddWithValue("@id", id); // buradaki id global tanımladığımız değişken aracılığı ile listview de seçilen //kayıdın id sini tutmakta

sql.Open();

int etkilenen = cmd.ExecuteNonQuery();

sql.Close();

if (etkilenen > 0)
{
MessageBox.Show("Güncellendi...");
listviewDoldur();
}
else
{
MessageBox.Show("Güncelleme başarısız !!!");
}
}

Barkod oluşturma programı yapımı

Çubuklu çizgilerin bir arada bulunduğu çeşitli kodlama yöntemleriyle sunulan, yalnızca makinaların okuyabileceği şekilde olan şeylere kendimizi bildik bileli barkod diyoruz. Hikayeyi fazla uzatamayacağım. Benzer konuda bir çok makale yazılmış, hikayem gibi bu konuda kısa, basit yöntem ile girilen değerlerin barkod karşılığını söz deyimi ile barkod oluşturma programını birlikte yapalım.

Basit yöntem ile oluşturulan barkod şöyle; alttaki buton yardımı ile indirilen barkod fontlarını windows klasörü içindeki font klasörüne yükleyin.

Like or Tweet this page to reveal the content.

Daha önceki yazımda(Formda metin stilini değiştirme) formdaki herhangi bir yazının fontunu değiştire biliyorduk. Barkod oluşturmasını da aynı yöntem ile yapacağız.

Fontları ilgili yere yükledikten sonra boş form ekranına textbox, label, button ve combobox kontrolleri ekleyin. Combobox içine 3 tane item ekleyin (3 of 9 Barcode, Code 128, EAN-13 Half Height) olduğu gibi yazın, çünkü windows font içerisinden çağrılan isim aynı olması gerekir. (İşinizi garantiye almak istiyor, sorun yaşamak istemiyorsanız buradaki yazıda bilgisayarınızdaki fontları combobox içine ekletebilirsiniz.)

Font olayını hallettikten sonra kod kısmına geçebiliriz. Button clik olayına alttaki kodları yazmanız yeterli.

1
2
 label1.Text = textBox1.Text;
label1.Font = new Font(comboBox1.Text, label1.Font.Size, FontStyle.Regular);

Textbox içine değer girip combobox dan istediğiniz barkod fontu seçip ekrana yazdırabilirsiniz. Daha fazlasını isteyenler iletişime geçebilir…

Güncelleme bilgi !

Barkodu bu şekilde oluşturabiliyoruz. Fakat barkod okuyucuları oluşturduğumuz bu biçimi okumaya biliyor. Yazımı paylaştıktan   sonra barkod okuyucu ile okutabildim.  3 of 9 fontlu barkodu direk okumadı, girilen rakam veya yazının başına ve sonuna * koyarak Ör: *234234* şekilde yazılan yazının  3 of 9 fontlu biçimini barkod okuyucu 234234 olarak okuyabilmekte.

Barkod da sabit bir karakter uzunluğu yoktur. Örnekte yaptığımız textbox alanına 1 yazıp barkodunu çıkartsak onuda okuyabilir.

Formda metin stilini değiştirme

Bazen uygulama çalışma zamanında(runtime) formdaki kontrollerin bazı özelliklerini kullanıcıya yetkisine vermek isteyebiliriz. Runtime kontrol konusuna giren bu makaleyi bir örnekle renklendirmek istiyorum.

Örneğimizden yola çıkarak; çalışan form üzerindeki label kontrolünün adını, fontunu veya font boyutunu değiştirmek istersek.

Resimdeki gibi bir form tasarlayalım ve konuyu pekiştirelim. Forma; bir adet label, textbox, combobox ve numericupdown kontrollerini ekledikten sonra kodlamaya geçebiliriz.

Kontrollerin ana isimlerini değiştirmeden olduğu gibi
ulaştım.

1
2
3
4
private void textBox1_TextChanged(object sender, EventArgs e)
        {
            label1.Text = textBox1.Text;
        }

Burada textbox’ımıza çift tıklayıp TextChanged olayına yazdığımızda yapılmak istenen çalışma anında textbox’a girilen değer aynı anda label da gözükmesi.

1
2
3
4
5
6
7
  System.Drawing.Text.InstalledFontCollection yazitipi = new System.Drawing.Text.InstalledFontCollection();
            foreach (FontFamily eklenen in yazitipi.Families)
            {
                comboBox1.Items.Add(eklenen.Name);
            }
            numericUpDown1.Minimum = 8;
            numericUpDown1.Maximum = 80;

Fontunu ve font büyüklüğü değiştirme kontrollerine geçmeden önce formun load olayına(form boş alanına çift tıklayarak girilen kısıma yani başlangıçtaki kısıma) sistemdeki, windows’un yazı font isimlerini combobox içine aktarıyoruz. Bunun haricinde numericUpDown1 kontrolünün maksimum ve minimun değerlerini giriyoruz.(isteğe bağlı)

1
2
3
4
  private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            label1.Font = new Font(comboBox1.Text, label1.Font.Size);
        }

Combobox’ın SelectedIndexChanged olayına seçilen font ismini alarak font özelliğini ekliyoruz.

1
2
3
4
5
6
7
8
 private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            int deger = int.Parse(numericUpDown1.Value.ToString());

            label1.Font = new Font(label1.Font.FontFamily.Name, deger);


        }

Son olarak numericUpDown1 kontrolünün ValueChanged olayına girilen sayı değerlerini label font size özelliğine yazıyoruz.

C# dosya işlemleri

Masaüsütü uygulamamız için dosyalara, klasörlere ihtiyaç duymuşuzdur. Bu ihtiyaca karşılık hatırlatıcı bir kaç satır kod paylaşmak istedim.

File ve Directory sınıflarını kullanacağımız bu örneklerde bu iki sınıfı karıştırmamanız. Bu örnekler içinde openfilediretory kontrolünüde kullanacağız.

İlk örneğimiz resimdeki form tasarımı üzerinde, textbox daki değer adı ile yeni klasör oluşturalım.

1
2
3
4
5
6
7
8
9
10
11
 bool varmi = Directory.Exists("c:\" + textBox1.Text);

            if (varmi == false)
            {
                Directory.CreateDirectory("
c:\" + textBox1.Text);
                MessageBox.Show(textBox1.Text + "
isimli klasör oluşturuldu.");
            }
            else
            {
                MessageBox.Show("
Oluşturulmadı çünkü "+ textBox1.Text + " isimli klasör mevcut.");
            }

Directory’ü klasör oluşturduğumuzda kullanırız, file ise dosya oluşturduğumuzda kullanırız. Alttaki örneğimizde openfiledialog kontrolünü de kullanarak seçilen dosya uzantısı ilgili textbox a yazdırdık.

1
2
3
4
5
6
7
8
9
   string kopyalanandosyaadi;
        private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            textBox2.Text = openFileDialog1.FileName;

            kopyalanandosyaadi = Path.GetFileName(textBox2.Text);
           
        }

kopyalanandosyaadi değişkenini global olarak tanımlamamızın nedeni sonraki işlemimizde yani dosyayı kopyalama işleminde kullanmamız olmasındandır. Alttaki örnekte gösterilen uzantı daki belirlediğimiz klasör içine kopyalayalım.

1
2
3
4
5
6
7
8
9
10
 if (File.Exists(@"c:\\klasorum\" + kopyalanandosyaadi))
            {
                MessageBox.Show("Dosya zaten mevcut");
            }
            else
            {
                File.Copy(textBox2.Text, "c:\\klasorum\" + kopyalanandosyaadi);
                MessageBox.Show("
Dosya kopyalandı");
               
            }

Burada(File.Copy) kopyalanacak dosya ilk önce kopyalanan yerde sonrasında gelmekte. kopyalanan yer ve dosya adı, kopyalanacak dosya şekilde gelmektedir.

Son olarak mevcut klasörü silme işlemini yapalım. Klasör silme işlemi alttaki şekilde gerçekleşmede.

1
2
3
4
5
6
7
8
9
  if (Directory.Exists(@"c:\\asd\"))
            {
                Directory.Delete("c:\\asd", true);
                MessageBox.Show("Silindi");
            }
            else
            {
                MessageBox.Show("Dosya yerinde yok");
            }

Xml dosya okuma

Bir önceki yazıda Xml dosya oluşturma veri eklemeyi uygulamıştık. Bu yazıda oluşturduğumuz ve veri eklediğimiz xml dosyasındaki verileri nasıl okuruz görelim. Xml dosya okuma işlemini 3 ayrı; textbox, combobox ve listview kontrollerin de göstererek konunun öğrenilmesi için daha verimli hale getirdim.

Uygulama çalıştığında resimdeki gibi veriler kontrollerimizde gözükecek. Form üzerinde çalışma yaptığım uygulamada ilk olarak textbox lara veriyi nasıl çekebiliriz görelim. Aşağıdaki resimdeki gibi xml dosyamızın yapısı incelemenizde fayda olacak.

Daha önceden oluşturduğumuz xmldosyam.xml isimli dosyasmızın içindeki Kullanici3 daki veriyi textboxlarımızda gösterelim.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 XmlDocument doc = new XmlDocument();

            doc.Load("c:\\klasorum\\xmldosyam.xml");
            XmlElement root = doc.DocumentElement;
            XmlNodeList kayitlar = root.SelectNodes("/Rapor/kullanicilar");


            foreach (XmlNode secilen in kayitlar)
            {
                string sirasi = secilen.Attributes[0].InnerXml;

                if (sirasi == "kullanici3")
                {

                    textBox1.Text = secilen["adi"].InnerText;
                    textBox2.Text = secilen["soyadi"].InnerText;
                }
            }

Xml den combobox a dosyadaki bütün veriyi çekip gösterme;

1
2
3
4
5
6
7
8
9
10
11
 XmlDocument doc = new XmlDocument();

            doc.Load("c:\\klasorum\\xmldosyam.xml");
            XmlElement root = doc.DocumentElement;
            XmlNodeList kayitlar = root.SelectNodes("/Rapor/kullanicilar");

            foreach (XmlNode secilen in kayitlar)
            {

                comboBox1.Items.Add(secilen["adi"].InnerText);
            }

Xml dosyasındaki verileri listview de gösterme;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
XmlDocument doc = new XmlDocument();

            doc.Load("c:\\klasorum\\xmldosyam.xml");
            XmlElement root = doc.DocumentElement;
            XmlNodeList kayitlar = root.SelectNodes("/Rapor/kullanicilar");

            foreach (XmlNode secilen in kayitlar)
            {
               
                    ListViewItem lv = new ListViewItem();
                    lv.Text = secilen["adi"].InnerText;
                    lv.SubItems.Add(secilen["soyadi"].InnerText);
                   
                    listView1.Items.Add(lv);
            }