Visual Basic (VB.NET) içinde dinamik kontroller oluşturmak için gerekli sınıfın bir örneğini oluşturup, bunu Controls koleksiyonuna eklemek kullanılır. Dinamik olarak oluşturulan kontroller için olayları işlemek üzere VB.NET'te delegeler ve AddHandler operatörü kullanılır:
Örnek (VB.NET):
Dim btn As New Button() btn.Text = "Bana tıkla!" btn.Location = New Point(40, 40) Me.Controls.Add(btn) AddHandler btn.Click, AddressOf Button_Click Private Sub Button_Click(sender As Object, e As EventArgs) MessageBox.Show("Dinamik olarak oluşturulan butona tıklandı.") End Sub
Klasik VB6'da dinamik olarak kontroller oluşturmak ve olayları işlemek yalnızca kontrol dizileri (Control Arrays) aracılığıyla mümkündür; burada dizinler ayrı öğeleri ayırt eder:
Örnek (VB6):
' Formda Index = 0 olan bir CommandButton olmalıdır Load Command1(1) Command1(1).Visible = True Private Sub Command1_Click(Index As Integer) MsgBox "İndeksi " & Index & " olan buton tıklandı!" End Sub
Unutulmamalıdır ki, VB.NET'te VB6'daki gibi kontrol dizileri anlayışı yoktur — dinamik olarak oluşturulan kontrollerin olaylarını işlemek yalnızca delegeler ve AddHandler/RemoveHandler mekanizmasıyla sağlanır.
Soru: "Dinamik olarak oluşturulan bir kontrolün yok edilmesi sırasında RemoveHandler çağrısını unutursanız ne olur? Bunun olası sonuçları nelerdir?"
Cevap: Kontrolü silmeden önce RemoveHandler çağrısını unutursanız, işleyiciye olan referans bellek üzerinde kalır; bu da bir bellek sızıntısına (memory leak) neden olur ve bazen zaten yok edilmiş bir nesneye veya forma erişim girişimi, istisna ile sonuçlanır.
Örnek:
' Unutulan RemoveHandler: ' AddHandler btn.Click, AddressOf SomeHandler ' Controls.Remove(btn) ' btn artık yok, ama işleyici hala duruyor
Hikaye
Ödeme terminali için faturalama sisteminde ödeme işlemleri için dinamik butonlar oluşturuldu. Pencere kapatıldıktan sonra kalan olay işleyicileri bellek temizliğine (Garbage Collection) engel oluyordu. Bir hafta içinde uygulama bellek sızıntıları oluşturdu ve sunucuların çökmesine neden olup, gece işlemleri sırasında işlemi manuel olarak yeniden başlatma ihtiyacı doğdu.
Hikaye
WinForms'ta bir tıbbi görüntüleme projesinde birçok "görsel önizleme" oluşturmak ve yok etmek için PictureBox'lar dinamik olarak oluşturuldu. Geliştirici olay işleyicilerini kaldırmadı. Uygulama 20-30 kez yüklendikten sonra yavaşlamaya başladı: binlerce gizli işleyici hala duruyordu ve kaynakların serbest bırakılmasını engelliyordu.
Hikaye
Bir çocuklar için eğitim uygulamasında dinamik olarak bilgi yarışması butonları oluşturuluyordu ve oyun sona erdikten sonra formdan siliniyordu, ancak olaylar
RemoveHandlerile iptal edilmedi. Bu nedenle, yeni bir oyun başladığında, "hayalet" kontrol kodunu tetikleyen durumlar ortaya çıktı; bu da geçersiz popup'lara, puanlama hatalarına ve genel karmaşaya neden oldu.