2015-05-18 17 views
13

Uygulamada çocuk denetimleri içeren bir grup kutum var. (Eklenen resimde de görüldüğü gibi). Basit bir foreach döngüsünü kullanarak bazı doğrulama yapmak için tüm metin kutularını numaralandırmak istiyorum.Grup kutusunun içindeki Çocuk denetimleri listesini alın

Bu belge anahat

enter image description here

foreach (Control control in grpBxTargetSensitivity.Controls) 
      { 
       if (control is FlowLayoutPanel && control.HasChildren) 
       { 
        foreach (Control ctrl in control.Controls) 
        { 
         if (ctrl is Panel && ctrl.HasChildren) 
         { 
          foreach (Control tbox in ctrl.Controls) 
          { 
           if (tbox is TextBox) 
           { 
            TextBox textbox = tbox as TextBox; 
            validData &= !string.IsNullOrWhiteSpace(textbox.Text); 
           } 
          } 
         } 
        } 
       } 
      } 

Sorum şu kontrollerin konut adil bir fikir verecek, dahil olmak üzere tüm denetimleri almak için (muhtemelen LINQ aracılığıyla) daha iyi bir yolu var mı paneller içinde yer alan metin kutuları yukarıdaki yönteme göre.

var validData 
    = grpBxTargetSensitivity.Controls.OfType<FlowLayoutPanel>() 
          .SelectMany(c => c.Controls.OfType<Panel>()) 
          .SelectMany(c => c.Controls.OfType<TextBox>()) 
          .All(textbox => !string.IsNullOrWhiteSpace(textbox.Text)); 

Bu grup kutusunda tüm FlowLayoutPanels tüm panellerin içindeki tüm metin kutularının kapmak edeceğiz:

cevap

15

bu daha kolay okunmasını sağlayacak olsun .. iyi olduğunun bilmiyorum görüş meselesi olduğunu ve bu TextBox'ların değerini varsa, true değerini döndürün.

+0

Mükemmel! Bir ton teşekkürler. LINQ'ta bir yol var mı, bazı metin kutularını filtrelemek için yukarıdaki sorguya bir koşul ekleyebilir miyim? –

+1

@ this-Me Tabii ki, LINQ'ın 'Where' maddesini kullanabilirsiniz. En son 'SelectMany() 've' All() 'arasında bir şey deneyin:' .Where (textbox => textbox.Name.StartsWith ("birşey")) ' –

3

Tek astar slution,

IEnumerable<TextBox> collection = grpBxTargetSensitivity.Children.OfType<TextBox>(); //assuming you are looking for TextBox 

veya

Yapabilirsin, jenerik yöntemle aşağıdaki deneyin

sonra
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
      if (child != null && child is T) 
      { 
       yield return (T)child; 
      } 

      foreach (T childOfChild in FindVisualChildren<T>(child)) 
      { 
       yield return childOfChild; 
      } 
     } 
    } 
} 

aşağıdaki gibi kontroller numaralandırmak,

foreach (TextBox tb in FindVisualChildren<TextBox>(grpBxTargetSensitivity)) //assuming you are looking for TextBox 
{ 
    // do something 
} 
2

Sana biri herhangi bir metin kutularının bulmak yeteneği (veya T türü) yöntem ve metin kutusu (veya T türü) herhangi bir kalıtsal nesne oluşturmak:

public static List<T> GetSubControlsOf<T>(Control parent) where T : class 
{ 
     var myCtrls = new List<T>(); 

     foreach (Control ctrl in parent.Controls) 
     { 
      if (ctrl.GetType() == typeof(T) || ctrl.GetType().IsInstanceOfType(typeof(T))) // if ctrl is type of T 
      { 
       myCtrls.Add(ctrl as T); 
      } 
      else if (ctrl.HasChildren) 
      { 
       var childs = GetSubControlsOf<T>(ctrl); 

       if (childs.Any()) myCtrls.AddRange(childs); 
      } 
     } 

     return myCtrls; 
} 

ve örneğin bu form kullanan:

foreach (var textbox in GetSubControlsOf<TextBox>(this)) 
{ 
     validData &= !string.IsNullOrWhiteSpace(textbox.Text); 
} 
İlgili konular