C# ve Windows Forms ile masaüstü uygulamaları geliştirirken, ekranınıza sürükleyip bıraktığınız butonlar, metin kutuları, resimler ve listelerin arka planda nasıl çalıştığını hiç merak ettiniz mi? Visual Studio’nun sunduğu Araç Kutusu (Toolbox) sayesinde harika arayüzleri saniyeler içinde tasarlayabiliyoruz. Ancak profesyonel bir yazılımcı olmak için bu görsel nesnelerin kalbinde yatan temel yapıyı, yani Kontrol Sınıfını (Control Class) anlamak çok önemlidir.
Bu kapsamlı rehberimizde, ilk defa masaüstü programlamanın derinliklerine inenler için System.Windows.Forms.Control sınıfının ne olduğunu, bize sunduğu ortak özellikleri, metotları, olayları ve kod yazarak (dinamik olarak) arayüz nesnelerini nasıl oluşturabileceğimizi detaylı örneklerle öğreneceğiz.
Kontrol Sınıfı (Control Class) Nedir?
Nesne Tabanlı Programlama (OOP) dünyasında Kalıtım (Inheritance) adını verdiğimiz çok önemli bir kural vardır. Bir sınıfın özellikleri, ondan türetilen alt sınıflara aktarılır. Windows Forms mimarisinde kullanıcı arayüzünde (GUI) yer alan ve ekranda görsel bir yer kaplayan her şey (Button, Label, TextBox, CheckBox vb.) aslında Control adındaki devasa bir temel sınıftan miras alınarak üretilmiştir.
Örneğin, bir Button nesnesi arka planda Control sınıfından türetilmiştir. Bu sayede Control sınıfının sahip olduğu “boyut”, “renk”, “konum” gibi yetenekler otomatik olarak butona da geçer. Kısacası Kontrol sınıfı; ekranda çizim yapma, farenin veya klavyenin hareketlerini algılama ve pencere üzerindeki diğer nesnelerle hizalanma gibi tüm temel işlevleri kapsayan bir “ana (ebeveyn) sınıftır”.
Kontrol Sınıfının Ortak Özellikleri (Properties)
Araç kutusundan formunuza hangi nesneyi eklerseniz ekleyin, Control sınıfından miras aldığı için Properties (Özellikler) panelinde her zaman bazı ortak ayarlarla karşılaşırsınız. Bunlardan en sık kullanılanları şunlardır:
- Name: Kontrolün kod tarafındaki kimliğidir. Yazılımcı, bu nesneye komut verirken bu ismi kullanır (Örn:
txtKullaniciAdi). - Text: Kontrolün üzerinde kullanıcıya görünen yazıdır.
- Location: Kontrolün form üzerindeki sol üst köşeye olan X ve Y koordinat uzaklığını belirler (
Pointyapısı ile kullanılır). - Size: Kontrolün genişlik (Width) ve yükseklik (Height) değerlerini piksel cinsinden ayarlar.
- BackColor ve ForeColor: Sırasıyla nesnenin arka plan rengini ve yazı rengini belirler.
- Enabled: Nesnenin kullanılabilir (aktif) olup olmadığını belirler.
Falseyapılırsa nesne soluk (gri) görünür ve tıklanamaz. - Visible: Nesnenin form üzerinde görünür olup olmadığını ayarlar.
- TabIndex: Klavyedeki “Tab” tuşuna basıldığında form üzerindeki kontroller arasında hangi sırayla geçiş yapılacağını belirler.
- Parent: Kontrolün hangi taşıyıcı nesnenin (Form, Panel, GroupBox) içinde bulunduğunu gösterir veya ayarlar.
Kontrol Sınıfının Ortak Metotları (Methods)
Metotlar, nesnelere belirli bir işi yaptırdığımız komut bloklarıdır. Control sınıfından gelen ve arayüz elemanlarına hükmetmemizi sağlayan temel metotlar şunlardır:
- Focus(): Program çalışırken imleci (odaklanmayı) doğrudan ilgili kontrolün üzerine taşır. Örneğin hatalı bir şifre girildiğinde
txtSifre.Focus();kodu ile imleci tekrar şifre kutusuna alabilirsiniz. - Hide() ve Show(): Bir nesneyi kod kullanarak gizlemek (
Hide) veya görünür hale getirmek (Show) için kullanılır. - BringToFront() ve SendToBack(): Form üzerinde üst üste binen nesnelerden birini en öne getirmek veya en arkaya göndermek için z-index (derinlik) sırasını değiştirir.
Kontrol Sınıfının Ortak Olayları (Events)
Olaylar (Events), kullanıcının bir nesneyle girdiği etkileşimlerdir. Hangi aracı kullanırsanız kullanın Control sınıfından şu standart olaylar miras gelir:
- Mouse Olayları: Fareyle ilgili eylemleri yakalar.
MouseEnter(fare nesnenin üzerine geldiğinde),MouseLeave(fare nesneden ayrıldığında),MouseDown(fare tuşuna basıldığında) veMouseUp(fare tuşu bırakıldığında) gibi olaylardır. - Klavye Olayları: Nesne seçiliyken klavyeden gelen hareketleri yakalar.
KeyDown(bir tuşa basıldığı an),KeyPress(karakter basıldığında) veKeyUp(basılan tuş bırakıldığında) olaylarıdır.
Kod İle Dinamik Kontrol Oluşturma (Run-Time)
Visual Studio’da Toolbox (Araç Kutusu) kullanarak sürükle-bırak yapmak çok kolaydır. Ancak bir otopark otomasyonu yapıyorsanız ve boş araç kapasitesine göre ekranda dinamik sayıda buton oluşturmanız gerekiyorsa ne olacak?
İşte Kontrol Sınıfı mantığını anladığınızda, arayüz nesnelerini kod yazarak çalışma anında (Run-Time) kendi ellerinizle üretebilirsiniz.
Örnek 1: C# Kodlarıyla Form Üzerine Buton Ekleme
Formunuzun boş bir ekran olduğunu varsayalım. Form_Load olayı içine şu kodları yazarak, görsel tasarımcıyı hiç kullanmadan kendi butonumuzu ve metin kutumuzu oluşturalım:
private void Form1_Load(object sender, EventArgs e)
{
// 1. TextBox (Metin Kutusu) Sınıfından Bir Nesne Türetiyoruz
TextBox txtDinamik = new TextBox();
txtDinamik.Name = "txtGiris";
txtDinamik.Location = new Point(50, 50); // X:50, Y:50 konumu
txtDinamik.Size = new Size(150, 25);
txtDinamik.BackColor = Color.LightYellow;
// 2. Button Sınıfından Bir Nesne Türetiyoruz
Button btnDinamik = new Button();
btnDinamik.Name = "btnTikla";
btnDinamik.Text = "Bana Tıkla!";
btnDinamik.Location = new Point(50, 90); // X:50, Y:90 konumu
btnDinamik.Size = new Size(100, 35);
// Olay (Event) Ataması Yapıyoruz (Butona tıklanınca ne olacak?)
btnDinamik.Click += new EventHandler(BtnDinamik_Click);
// 3. OLUŞTURULAN NESNELERİ FORMUN "CONTROLS" KOLEKSİYONUNA EKLİYORUZ
this.Controls.Add(txtDinamik);
this.Controls.Add(btnDinamik);
}
// Butona tıklandığında çalışacak olan özel metodumuz
private void BtnDinamik_Click(object sender, EventArgs e)
{
MessageBox.Show("Kod ile oluşturulan dinamik butona tıkladınız!");
}
Bu kodu yazdığınızda; program çalıştığı an formun üzerinde sarı arka planlı bir metin kutusu ve bir buton belirdiğini göreceksiniz. İşte this.Controls.Add() kodu, ürettiğimiz bu Kontrol nesnelerini formun taşıyıcı sistemine dâhil ederek görünür hale getirir.
Güçlü Bir İpucu: Controls Koleksiyonunu Kullanarak Toplu İşlemler
Masaüstü uygulamalarında bazen onlarca TextBox nesnesi olur. Bir “Temizle” butonuna bastığınızda hepsini tek tek textBox1.Text = "";, textBox2.Text = ""; şeklinde yazmak eziyettir.
Her Windows Formu, üzerinde barındırdığı nesneleri this.Controls adında bir koleksiyonda tutar. Kalıtım (Inheritance) mantığı sayesinde bu koleksiyon içindeki her şey bir Control‘dür. Aşağıdaki kod, bu koleksiyonda dönerek sadece TextBox olan nesnelerin içini tek bir döngü ile temizler:
private void btnHepsiniTemizle_Click(object sender, EventArgs e)
{
// Form üzerindeki tüm "Control" nesnelerini sırayla dolaş
foreach (Control nesne in this.Controls)
{
// Eğer o anki nesne TextBox sınıfından türetilmişse (is operatörü)
if (nesne is TextBox)
{
// İçini temizle
nesne.Text = "";
}
}
}
Not: Eğer TextBox’larınız formun içine değil de bir GroupBox veya Panel içine (başka bir taşıyıcıya) eklendiyse, aramayı formun değil, o taşıyıcının koleksiyonunda (groupBox1.Controls) yapmalısınız.
Sonuç
C# Windows Form geliştiriciliğinde Kontrol Sınıfı (Control Class) kavramını kavramak, sizi sadece araçları kullanan birinden, araçları tasarlayan ve yöneten usta bir yazılımcıya dönüştürür. TextBox, Label, Button gibi arayüz yapıtaşlarının birer “Sınıf” olduğunu, Size, Location, BackColor gibi özelliklerin onlara atalarından (Control sınıfından) miras kaldığını bildiğinizde, her türlü görsel bileşene C# kodlarıyla kusursuz bir şekilde hükmedebilirsiniz. Yeni uygulamalarınızda “Toolbox” kullanmak yerine kodla kendi arayüz kontrollerinizi oluşturarak denemeler yapmayı kesinlikle unutmayın. İyi kodlamalar dileriz!




