C# FORM UYGULAMALARI
Yazılım dünyasında düzenli aralıklarla "X öldü" cümlesi dolaşır. Son on yılda en sık duyulanlardan biri "Windows Forms öldü" oldu. Web yükseldikçe, mobil patladıkça masaüstü artık konuşulmaz oldu. Oysa Türkiye'deki orta ölçekli üreticilerin muhasebe yazılımlarını, depo takip programlarını, kalite kontrol arayüzlerini, devlet kurumlarının iç araçlarını açıp bakın — yarıya yakını hâlâ C# ve WinForms üzerinde çalışıyor. Üstelik Microsoft .NET 6 ile birlikte framework'ü modern .NET sürümüne taşıdı; AOT derleme, per-monitor DPI, dark mode opt-in gibi yenilikler eklemeye devam ediyor.
Bu yazı, C# diline aşina olup masaüstü tarafına geçmek isteyenler veya iş yerinde 10-15 yıllık bir WinForms kod tabanıyla karşılaşan geliştiriciler için yazıldı. Bir Windows masaüstü uygulamasının nasıl kurulduğu, temel kontroller, olay tabanlı düşünce, veritabanına bağlanma ve WinForms'un modern kardeşleri (WPF, MAUI) ile ilişkisi pratik biçimde ele alınıyor.
Windows Forms Nedir ve Nereden Çıktı?
Windows Forms, kısaca WinForms, 2002'de .NET Framework 1.0 ile gelen masaüstü UI kütüphanesidir. O dönemin baskın masaüstü framework'ü olan MFC ve Visual Basic 6 formlarına alternatif olarak tasarlandı. Temel fikir basitti: Visual Studio içindeki Form Designer'da kontrolleri sürükleyip bırakarak arayüz çiz, kod tarafında olaylara cevap yaz.
WinForms perde arkasında Win32 API'yi sarmalar. Her kontrol (Button, TextBox, ComboBox) aslında bir Windows pencere tutamacına bağlıdır. Bu, performansın hızlı ve native hissetmesini sağlar; karşılığında uygulama yalnızca Windows üzerinde çalışır. Cross-platform vaat etmez, hiç vaat etmedi.
Sıfırdan Form Projesi Açmak
Visual Studio 2022'yi açıp "Create a new project" ekranında "Windows Forms App" şablonunu seçtiğinde üç önemli dosya oluşur:
- Program.cs: Uygulamanın giriş noktası.
Application.Run(new Form1())satırı pencereyi açar. - Form1.cs: Form sınıfının kod tarafı — olay handler'ları, iş mantığı.
- Form1.Designer.cs: Designer'ın otomatik ürettiği kontrol tanımları. Elle değiştirmemek daha güvenli — bir sonraki tasarım kaydında üzerine yazılır.
Form'un Properties panelinden Text (başlık çubuğu yazısı), Size (boyut), StartPosition (ekranın neresinde açılacak), FormBorderStyle (kenarlık tipi) gibi onlarca özellik ayarlanabilir. F5 ile çalıştırınca pencere ekranda belirir. Bütün hikâyeyi başlatmak bu kadar.
Temel Kontroller
WinForms'da düzinelerce hazır kontrol bulunur. Pratikte en sık karşılaşılanlar:
- Button: Tıklanabilir buton — formun çoğu eylemi buradan tetiklenir
- Label: Statik metin etiketi — alan başlıkları, açıklamalar
- TextBox / RichTextBox: Kullanıcı metin girişi
- ComboBox / ListBox: Açılır liste ve seçim listesi
- CheckBox / RadioButton: Tekli ve çoklu seçim
- DataGridView: Tablo gösterimi — kurumsal uygulamaların belkemiği
- PictureBox: Görsel gösterimi
- TabControl: Sekmeli arayüzler için
- MenuStrip / StatusStrip / ToolStrip: Üst menü, durum çubuğu, araç çubuğu
- OpenFileDialog / SaveFileDialog: Dosya seçme ve kaydetme pencereleri
Yeni bir kontrol türü gerektiğinde Toolbox'tan sürüklemek yeterli. Daha karmaşık sahnelerde UserControl ile kendi bileşik kontrollerini tasarlayabilirsin — örneğin "müşteri kartı" diye tek bir UserControl yapıp formda yedi kez kullanmak, kod tekrarını ciddi ölçüde azaltır.

Olay Tabanlı Düşünce Modeli
WinForms, olay tabanlı (event-driven) bir modelde çalışır. Sen kontrolleri tasarlarsın, çalışma zamanında kullanıcı tıklar, yazar, seçer — kontroller bu eylemleri olay (event) olarak yayar; sen ilgili olayı yakalayıp ne yapılacağını yazarsın.
En yaygın örnek bir butona tıklamaktır. Designer'da butona çift tıklayınca Visual Studio otomatik olarak Click handler iskeletini oluşturur:
- Designer.cs içine
this.button1.Click += new EventHandler(this.button1_Click);satırını ekler - Form1.cs içinde boş
private void button1_Click(object sender, EventArgs e)metodu açılır - İçini doldurmak sana kalır
Daha modern bir yazımda lambda ile inline subscribe etmek de mümkündür: button1.Click += (s, e) => MessageBox.Show("Tıklandı");. Click dışında TextChanged, SelectedIndexChanged, FormLoad, FormClosing gibi onlarca olay vardır. Hangi olayların ne sırada tetiklendiğini bilmek (örneğin Load mu Shown mu önce gelir) zamanla oturur.
Veriye Bağlanma
Kurumsal bir form uygulamasının yarısı veri okuma, yarısı veri yazmadır. WinForms iki yol sunar: manuel doldurma veya data binding.
Manuel yöntemde ADO.NET veya Entity Framework Core ile veriyi çekersin, sonra dataGridView1.DataSource = liste; diyerek listeyi grid'e verirsin. Tek satırlık iş.
İkinci yöntem BindingSource kullanır. BindingSource verinin etrafında bir kapsayıcı işlevi görür; grid, textbox, combobox gibi kontroller bu kaynağa bağlanır. Veride değişiklik olduğunda kontroller otomatik tazelenir. Master-detail ekranlarda (örneğin solda müşteri listesi, sağda seçili müşterinin siparişleri) hayat kurtarır.
Bağlantıdan SQL Server kullanan tarafta connection string'ler ve performans için connection pooling, raporlama tarafında ise DataGridView'i Excel'e veya PDF'e aktarmak en sık karşılaşılan ek isteklerdir. Bunlar için ClosedXML, EPPlus, QuestPDF gibi kütüphaneler dakikalar içinde devreye alınır.
WinForms, WPF ve MAUI Arasındaki Fark
Microsoft'un masaüstü tarafında üç aktif teknolojisi var. Hangisini seçeceğini sahnen belirler:
- WinForms: 2002'den beri var, stabil, hızlı, Designer'ı kolay. Sadece Windows. Kurumsal iç araçlarda, hızlı prototiplerde, eski kod tabanı bakımında baskın seçim.
- WPF: 2006'da geldi. XAML tabanlı, MVVM modeline uygun, animasyon ve modern görünüm konusunda WinForms'tan kat be kat ileride. Sadece Windows. Karmaşık iş arayüzleri ve özelleştirilmiş "şık" uygulamalar için.
- .NET MAUI: 2022'de Xamarin.Forms'un halefi olarak çıktı. Tek kod tabanından Windows, macOS, iOS, Android. Masaüstüne odaklı klasik kurumsal uygulamalar için olgunlaşma süreci hâlâ devam ediyor; mobile-first projelerde daha güçlü.
Yeni başlayan birinin yolu çoğunlukla şu olur: WinForms ile temel olayları, kontrolleri, data binding'i öğren; ardından WPF/XAML ve MVVM'e geç; cross-platform veya mobil gerekirse MAUI'ye uzan. C# dilinin temelleri her üçünde de aynı kaldığı için C# eğitim programı ile çekirdek bilgi yapıldığında framework geçişleri kısa süre alır.
Hâlâ WinForms Tercih Etmek İçin Sebepler
Yeni bir proje için 2026'da WinForms seçmek mantıklı mı? Bazı sahnelerde fazlasıyla mantıklı:
- Hızlı iç araç: Üç buton, bir grid, bir SQL bağlantısı yeterliyse — WinForms ile saat hesabında bitirilir, WPF'te yarım gün, web'de iki gün sürer.
- Tek operatör Windows makinesi: Bayi terminali, üretim hattı bilgisayarı, kasa noktası gibi sahnelerde cross-platform talebi yoktur.
- Eski kod tabanı: Şirketin 10 yıllık WinForms uygulamasını WPF'e portlamak çoğu zaman ekonomik değildir; yeni özellikleri aynı kod tabanına eklemek pratiktir.
- Düşük kaynak tüketimi: Web tabanlı bir intranet aracı her seferinde tarayıcı ve sekme açar; WinForms uygulaması 30-40 MB'da koşar.
Modern .NET'le Gelen Yenilikler
.NET 6, 7, 8, 9 ile WinForms görünüşte aynı kaldı ama altyapıda ciddi yenilemeler geldi. Per-monitor DPI ile artık farklı çözünürlükteki ekranlar arasında pencere sürüklendiğinde bulanıklaşma yok. Dark mode opt-in olarak eklendi; tek API çağrısı ile başlık çubuğu koyu temaya geçer. NativeAOT publish ile uygulama tek dosya, runtime kurulumu gerektirmeyen bir .exe olarak çıkabilir — son kullanıcının ".NET 8'i yükle" demesine gerek kalmaz. Tüm sürüm notları ve API referansı Microsoft'un resmi WinForms dokümantasyonu üzerinden takip edilebilir.
Async/await desteği UI tarafında da güvenlidir; await Task.Run(...) ile uzun süren bir iş arka planda koştuğunda UI thread bloklanmaz, kontroller donmaz. Bu basit kalıp tek başına eski WinForms uygulamalarının %80'inin yaşadığı "tıkladım, ekran kilitlendi" sorununu çözer.
Sık Yapılan Hatalar
WinForms'a yeni başlayanların hemen hemen hepsi aynı tuzaklara düşer.
Birincisi, ağır işi UI thread'inde çalıştırmak. Veritabanından 100 bin satır çekerken arayüz beyaz olur, "yanıt vermiyor" başlığı görünür. Çözüm async/await veya BackgroundWorker.
İkincisi, Designer.cs'i elle düzenlemek. Designer dosyayı bir sonraki kaydetmede yeniden üretir, değişikliklerin uçar. Kontrol tanımları kodla değil Designer'la, iş mantığı Form1.cs ile yazılır.
Üçüncüsü, her formu birbirinden bağımsız tasarlamak. UserControl ve base form kullanmadan büyüyen uygulamalarda aynı kart 30 yerde farklı küçük varyasyonlarla yazılır; bakım kabusa döner.
Son olarak versiyonlama: .NET Framework 4.8 üzerindeki WinForms ile .NET 6+ üzerindeki WinForms aynı görünür ama farklı runtime'lar üzerinde çalışır. Yeni proje açarken Visual Studio'da "Windows Forms App (.NET Framework)" değil "Windows Forms App" şablonunu seçmek modern tarafa geçmenin en kolay yoludur.



