Bu makalemizde IEnumerable interface(arayüzü)’nden faydalanıp kontrolleri nasıl liste halinde dönebileceğimiz göreceğiz.
Öncelikle ControlFind adında bir class oluşturuyoruz ve bu classın tanımlamasını IEnumarable olarak tanımlıyoruz bu sınıfdan instance aldığımızda bizden parametre olarak “Control” girmemizi isteyecektir ve FindChildControlRecursive adındaki metodumuzada istediğimiz kontrolün hangi kontrolün altında aranacağınızı parametre olarak geçiyoruz döngü ile kontrol içerisindeki istediğimiz kontrolleri bir lise halinde bize dönecektir. Cümle içerisinde çok fazla kontrol kelimesini kullandığımızı farkettim 🙂
Şimdi ControlFind adlı sınıfımıza bir gözatalım
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 | using System.Collections.Generic; using System.Web.UI; namespace ControlFind { public class ControlFinder<t> where T : Control { private readonly List<t> foundControls = new List<t>(); public IEnumerable<t> FoundControls { get { return foundControls; } } public void FindChildControlsRecursive(Control control) { foreach (Control cont in control.Controls) { if (cont.GetType() == typeof(T)) { foundControls.Add((T)cont); } else { FindChildControlsRecursive(cont); } } } } } |
Şimdi ise asp.net’sayfamızdan ControlFind sınıfını kullanalım
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | protected void Page_Load(object sender, EventArgs e) { ControlFinder<textbox> cf = new ControlFinder<textbox>(); cf.FindChildControlsRecursive(pnl); var textboxlist = cf.FoundControls; var list = new ArrayList(); foreach (var lst in textboxlist) { if (lst.Text != "") { list.Add(lst.Text); } } Response.Write(list.Count); } |
Üstteki kodlarda anlaşılacağı üzere ControlFinder sınıfından bir instance almaya çalışınca bizden aramak istediğimiz kontrol nesnesinin sınıfını parametre olarak geçmemizi istiyor. aldığımız instance ile FindChildControlsRecursive metoduna erişiyoruz bu metod ilede aradığımız kontrolün hangi nesne altında aranacaksa parametre olarak o nesneyi geçiyoruz mesela ContentPlaceHolder, Panel, MultiView vb. nesneler gibi daha sonra bu kontrollere yine instance’ini aldığımız cf adından ControlFind sınıfının FoundControl propert’si ile aramamızla eşleşen sonuçlara ulaşıyoruz ardından döngüylede Arraylist’e add metoduyla ekleyip son olarak Arraylist’imizde kaç tane kontrol bulunduğuyla ilgili bir sayı yazdıırıyoruz sayfaya.