2011-01-26 11 views
18
private void CleanForm() 
{ 
    foreach (var c in this.Controls) 
    { 
     if (c is TextBox) 
     { 
      ((TextBox)c).Text = String.Empty; 
     } 
    } 
} 

Powyższa metoda nie działa, a elementy sterujące nie są wyczyszczone. Kompiluje się dobrze, ale nic nie robi.Jak wyczyścić tekst wszystkich pól tekstowych w formularzu?

Wszelkie pomysły?

+2

Na marginesie, możesz chcieć określić 'TextBoxBase' zamiast' TextBox'; to automatycznie uwzględni także wieloliniowe pola tekstowe, bogate pola tekstowe itp. – Timwi

+1

Ponadto nie trzeba rzutować na "TextBox". – SLaks

+0

Ten kod działa tak, jak jest, ale upewnij się, że w przypadku każdej instrukcji (this.Controls) jest faktycznym formantem, który ma pola tekstowe, na przykład, jeśli masz formularz, z tableLayoutPanel, a pola tekstowe są wszystko w tableLayoutPanel, foreach (var c w this.Controls) nie zadziała, musi to być foreach (var c w tableLayoutPanel1.Controls). – Hammy

Odpowiedz

4

Twoje pola tekstowe znajdują się prawdopodobnie w panelach lub innych pojemnikach, a nie bezpośrednio w formularzu.

Musisz przechodzić rekurencyjnie zbiór Controls każdego elementu sterowania dzieckiem.

+0

Są wewnątrz GroupBoxes. Jaki byłby najlepszy sposób działania? –

+0

@sergio: Musisz uczynić swoją funkcję rekursywną. – SLaks

6

Mieliśmy taki problem kilka tygodni wcześniej. Jeśli ustawisz punkt przerwania i przyjrzysz się uważnie this.Controls, problem ujawnia jego naturę: musisz powtarzać przez wszystkie kontrolki podrzędne.

Kod mógłby wyglądać następująco:

private void CleanForm() 
{ 
    traverseControlsAndSetTextEmpty(this); 
} 
private void traverseControlsAndSetTextEmpty(Control control) 
{ 

    foreach(var c in control.Controls) 
    { 
     if (c is TextBox) ((TextBox)c).Text = String.Empty; 
     traverseControlsAndSetTextEmpty(c); 
    } 
} 
4
private void CleanForm(Control ctrl) 
{ 
    foreach (var c in ctrl.Controls) 
    { 
     if (c is TextBox) 
     { 
      ((TextBox)c).Text = String.Empty; 
     } 

     if(c.Controls.Count > 0) 
     { 
      CleanForm(c); 
     } 
    } 
} 

Kiedy początkowo nazywać ClearForm, przechodzą w tym, lub Page (zakładam, że to, co 'to' jest).

57

Lubię lambda :)

private void ClearTextBoxes() 
{ 
    Action<Control.ControlCollection> func = null; 

    func = (controls) => 
     { 
      foreach (Control control in controls) 
       if (control is TextBox) 
        (control as TextBox).Clear(); 
       else 
        func(control.Controls); 
     }; 

    func(Controls); 
} 

Powodzenia!

+2

ładny kod przykładowy! – TheGeekYouNeed

+0

Nie działa dla mnie. :( –

+0

@Alexbelek, jaka jest wersja sieci z kropkami, z której korzystasz? – Homam

2

I to na oczyszczenie wszystkich elementów sterujących w postaci jak tekstowym wyboru, Radiobutton

można dodawać różne typy chcesz ..

private void ClearTextBoxes(Control control) 
    { 
     foreach (Control c in control.Controls) 
     { 
      if (c is TextBox) 
      { 
       ((TextBox)c).Clear(); 
      } 

      if (c.HasChildren) 
      { 
       ClearTextBoxes(c); 
      } 


      if (c is CheckBox) 
      { 

       ((CheckBox)c).Checked = false; 
      } 

      if (c is RadioButton) 
      { 
       ((RadioButton)c).Checked = false; 
      } 
     } 
    } 
+0

Wydaje się, że jest świetny, ale jak go zaimplementować? – Nuno

+0

@No jedyne, do którego należy zadzwonić, formularz formularza został przesłany lub zapisany z pominięciem obiektu kontrolnego –

-1

Wystarczy użyć

private void button2_Click(object sender, EventArgs e) 
    { 

     textBox1.Text = ""; 
    } 
0

Spróbuj tego:

var t = Form.Controls.OfType<TextBox>().AsEnumerable<TextBox>(); 
foreach (TextBox item in t) 
{ 
    item.Text = ""; 
} 
+0

nie działa, pojawia się następujący komunikat: "Błąd CS0120 Odniesienie do obiektu jest wymagane w przypadku niestatycznego pola, metody lub właściwości "Control.Controls" " – Nuno

2

Poprawiłem/naprawiłem moją metodę rozszerzenia.

Powiązane problemy