2017-03-04 1 views
0

Angenommen, ich habe 100 Textfelder in einem Formular. Zahlen gehen in diese Textfelder.C# Alle Textfelder in einem Formular hinzufügen

Ich will eine Taste klicken, und es wird alle leeren Textfelder verwerfen, und fügen Sie alle diejenigen, die eine Zahl in ihnen haben.

Wie könnte ich?

Bis jetzt. Das ist der Code, den ich bekommen habe. Wie würde ich es hinzufügen, dass sie alle hinzufügen.

foreach (Control c in this.Controls) 
    { 
     if (c is TextBox) 
     { 
      TextBox textBox = c as TextBox; 
      if (textBox.Text != string.Empty) 
      { 
       //add! 
      } 
     } 
+4

[Ich habe 100 Textfelder auf einem Formular] (http: //i.stack. imgur.com/fvdkb.png) – Plutonix

+0

Ich verspreche es. Es ist nicht so. Überhaupt! Ich glaube fest an eine nette, saubere Benutzeroberfläche. Obwohl es so scheint. –

Antwort

2

Für Sie Massendateneingabe aufrufen zu bekommen betrachten sollte eine DataGrid anstelle eines TextBox mit - dies, weil in WinForms ist, Kontrollen sind teuer - sie sind individuell hWnd Objekte von User32 verwaltet - so wird Ihre Form etwas träge sein, und langsam neu zu streichen wenn alle 100 Textfelder gleichzeitig auf dem Bildschirm angezeigt werden.

(In der Tat sollten Sie WPF für die Erstellung Ihrer UI verwenden, da es sich besser mit hoher DPI verhält und "fensterlose" hardwarebeschleunigte Grafik verwendet).

Wie auch immer, Sie wollen eine Tree-Traversal-Funktion, um alle Textfelder, wie in @ Muhammads Antwort abrufen, dann entfernen Sie sie. Ich nehme zur Kenntnis, dass Sie nicht direkt Mohammeds Antwort verwenden können, weil Sie nicht Steuerelemente entfernen können, wie Sie durch eine Steuer Sammlung laufen, so versuchen Sie dies:

public static IEnumerable<Control> GetDescendantControls(this Control control) 
{ 
    Stack<Control> stack = new Stack<Control>(); 
    stack.Push(control); 
    while(stack.Count > 0) 
    { 
     Control c = nodes.Pop(); 
     yield return c; 
     foreach(Control child in c.Controls) stack.Push(child); 
    } 
} 


List<Control> allEmptyTextBoxControls = this.GetDescendantControls() 
    .OfType<TextBox>() 
    .Where(c => String.IsNullOrWhitespace(c.Text)) 
    .ToList(); 

foreach(Control c in allEmptyTextBoxControls) c.Parent.Controls.Remove(c); 
0

auf alle Bedienelemente

public static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control 
{ 
    var children = (control.Controls != null) ? control.Controls.OfType<TControl>() : Enumerable.Empty<TControl>(); 
    return children.SelectMany(c => GetChildControls<TControl>(c)).Concat(children); 
} 

Nun ist diese Funktion

var allTextBoxes = this.GetChildControls<TextBox>(); 
foreach (TextBox tb in allTextBoxes) 
{ 
    if(tb.Text != ""){ 
     //DO WHAT YOU WANT 
    } 
} 
+0

Dies kann zur Laufzeit abstürzen, wenn Sie die Steuerinstanz entfernen, da die Auflistung innerhalb eines ausführenden Enumerators mutiert wird. Sie sollten sie zuerst in eine temporäre Liste laden (mit 'ToList()') und dann entfernen. – Dai

Verwandte Themen