Form İçerisindeki Kontrollere Dinamik Olarak Ulaşmak c#
Merhaba,
Form içerisinde belli olmayan sayıda Component olduğunu ve hepsini kontrol etmek istediğinizi düşünün. Belirli sayıda da olsa, fazla miktarda Component'i Code Behind içerisinde tek tek yazmanız hiç profesyonel ve zevkli olmayacaktır.
Biz de bugün TextBox’larımızın içerisindeki değerleri bir ListBox içerisine ekleyeceğiz. Bu durumda aklımıza birkaç çözüm daha gelebilir ama amacım biraz da Reflection ile ilgilenmek.
Makaleyi bitirdiğinizde Web veya Windows uygulamanızdaki formunuzda ne kadar Component olduğunun veya isimlerinin ne olduğunun hiçbir önemi kalmayacaktır. Çünkü istediğiniz anda istediğiniz Component'e ulaşabileceksiniz.
Hemen bir Windows Forms Application açalım (CTRL + SHIFT + N) ve formumuzu yaratalım. Ben formu şu şekilde oluşturdum:
NOT: using System.Reflection; satırını eklemeyi unutmayın.
Aşağıda yazmış olduğum fonksiyonda görüldüğü üzere tüm kontrollere Control sınıfının Controls property’si sayesinde ulaşmış oluyoruz. Ama burada tüm component’ler mevcut durumda. Dolayısıyla bizim bunları ayrıştırmamız gerekecek.
Burada GetType()devreye giriyor. Bize döndürdüğü Type nesnesinin “Name” property’sini kullanarak bu nesnenin türünü tespit ediyoruz ve TextBox değilse sıradaki componenti çağırıyoruz.
protected void FindControls(Control Ctrl)
{
foreach (Control item in Ctrl.Controls)
{
Type CtrlType = item.GetType();
PropertyInfo[] PropList = CtrlType.GetProperties();
if (CtrlType.Name != "TextBox") continue;
foreach (PropertyInfo PropInfo in PropList)
{
if (PropInfo.Name == "Text" && PropInfo.PropertyType == typeof(String))
{
LBoxTexts.Items.Add( CtrlType.InvokeMember(PropInfo.Name, BindingFlags.GetProperty, null, item, null).ToString());
}
}
}
}
Henüz işimiz bitmedi. İşe yarar component’i bulduktan sonra istemiş olduğumuz property’ye de ulaşamamız gerekiyor. GetProperties() fonksiyonu, ona vermiş olduğumuz kontrole ait tüm public property’leri getiriyor. Biz de bu listeyi kullanarak istediğimiz property’ye ulaşıyoruz ve onu işliyoruz.
NOT: FindControls fonksiyonuna parametre olarak formunuzu göndererek bir debug işlemi yapmanızı ve tek tek incelemenizi tavsiye ederim. Böylece burada anlatılanları daha rahat kavrayabilirsiniz.