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

Este método anterior no funciona y los controles no se borran. Compila bien, pero no hace nada.¿Cómo borrar el texto de todos los cuadros de texto en el formulario?

¿Alguna idea?

+2

Como un lado, es posible que desee especificar 'TextBoxBase' en lugar de' TextBox'; eso incluirá automáticamente cuadros de texto multilínea, cuadros de texto enriquecidos, etc. – Timwi

+1

Además, no necesita convertir a 'TextBox'. – SLaks

+0

Este código funciona tal cual, pero asegúrese de que para cada instrucción, (this.Controls) es el control real que tiene los cuadros de texto, por ejemplo, si tiene un formulario, con un tableLayoutPanel, y los cuadros de texto son todo en tableLayoutPanel, foreach (var c en this.Controls) no funcionará, debe ser foreach (var c en tableLayoutPanel1.Controls). – Hammy

Respuesta

4

Tus cuadros de texto están probablemente dentro de paneles u otros contenedores, y no directamente dentro del formulario.

Necesita recorrer recursivamente la colección Controls de cada control secundario.

+0

Están dentro de GroupBoxes. ¿Cuál sería el mejor curso de acción? –

+0

@sergio: necesita hacer que su función sea recursiva. – SLaks

6

Tuvimos un problema como este unas semanas antes. Si establece un punto de interrupción y analiza profundamente el this.Controls, el problema revela su naturaleza: debe recurrir a través de todos los controles secundarios.

El código podría tener este aspecto:

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); 
     } 
    } 
} 

Cuando inicialmente llama ClearForm, pase en esto, o Página (supongo que eso es lo que 'esto' es).

57

me gusta :) 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); 
} 

Buena suerte!

+2

buen código de muestra! – TheGeekYouNeed

+0

No funciona para mí. :( –

+0

@Alexbelek, ¿cuál es la versión de dot net que está usando? – Homam

2

Y esto para despejar todos los controles en forma de texto como, casilla de verificación, radioButton

puede agregar diferentes tipos que quiera ..

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

Parece genial, pero ¿cómo implementarlo? – Nuno

+0

@Nuno solo necesita llamar al formulario de método enviado o guardado con el objeto de control de paso –

-1

sólo tiene que utilizar

private void button2_Click(object sender, EventArgs e) 
    { 

     textBox1.Text = ""; 
    } 
0

intente esto:

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

que no funciona, me sale el siguiente mensaje: "Error CS0120 Se requiere una referencia de objeto para el campo, método o propiedad no estático 'Control.Controls' " – Nuno

2

Mejoré/arreglé mi método de extensión.

public static class ControlsExtensions 
{ 
    public static void ClearControls(this Control frm) 
    { 
     foreach (Control control in frm.Controls) 
     { 
      if (control is TextBox) 
      { 
       control.ResetText(); 
      } 

      if (control.Controls.Count > 0) 
      { 
       control.ClearControls(); 
      } 
     } 
    } 
} 
Cuestiones relacionadas