Más sobre la limpieza de los TextBoxes. La palabra reservada as de C#.

Iba a contestar en un comentario a este post del blog de Juan Fco. Berrocal en el que se comenta cómo limpiar los textboxes de un formulario de una manera sencilla, pero voy a aprovechar para hacer un microartículo (pero micro micro) 😉

Aquí presento lo que me parece una versión un poco más depurada del tema que se trata en el post de forma implícita (manipulación de varios controles de una sola vez). Y debajo explico por qué lo hago así.

private void btnLimpiar_Click(object sender, EventArgs e)
{
  limpiarTextBoxes(this);
 
  // Y opcionalmente...
  this.textBox1.Focus();
}
 
private void limpiarTextBoxes(Control parent)
{
   TextBox t;
   
   //Limpiar de manera rapida
   foreach (Control c in parent.Controls)
   {
       t = c as TextBox;
 
       if (t != null)
       {
           t.Clear();
       }
 
       if (c.Controls.Count > 0)
       {
           limpiarTextBoxes(c);
       }
   }
}

La única diferencia es que en el bucle foreach de la rutina que limpia el texto del TextBox, se hace un casting del Control a TextBox usando la palabra reservada «as» de C#. Esto lo que hace es que si el control es un TextBox (o un derivado de él) obtiene una referencia de tipo TextBox, y si no, devuelve null. Lo bueno es que obtenemos una referencia tipada con la clase que queremos manipular.

Creo que es más claro hacer esto como ejemplo, porque si quisieras llamar a un método o usar una propiedad que sólo implementa la clase TextBox (por ejemplo la propiedad CharacterCasing) y no lo implementa la clase Control, utilizando este código sí que es posible, y con el anterior no…

Hala, pues ya está. ¿A que ha sido realmente micro?

Saludos!

EDITADO: He cambiado el código según la sugerencia de Alejandro Mezcua, para limpiar el TextBox utilizando el método Clear, en vez de Text = «». El motivo lo podéis ver en los comentarios 😉
 

8 comentarios sobre “Más sobre la limpieza de los TextBoxes. La palabra reservada as de C#.”

  1. Me gusta esa solución, aunque utilizar is/as a mí me parece casi indiferente.
    Lo bueno de tu código es que limpia también los textbox de paneles dentro del formulario.
    En cualquier caso muy entretenida la discusión 😉

  2. Esto nos demuestra que, por mucho que creamos que sabemos, y que hacemos las cosas lo «más mejor» y optimizadas que es posible… SIEMPRE habrá alguien que nos haga ver lo poquito que en realidad sabemos, o lo lejos que estamos de esa «optimización perfecta» que creíamos conocer.

    Saludos

  3. Bueno… Más que la optimización perfecta, este es quizá un buen ejemplo de que las cosas no salen perfectas a la primera, pero que las iteraciones ayudan a ir depurando y mejorando… (depurando en el sentido de separar polvo y paja, no de darle al F5…) 😉

  4. Un par de cosas, ya que has hecho un cast a textBox por qué no usas t.Clear() en lugar de t.Text = «»? En principio la segunda forma debería ser un poco más eficiente ya que no estás creando el segundo string por cada asignación, ya que los strings son inmutables.

    Por otro lado, y esto lo he medido, es más eficiente en cuanto a velocidad el no hacer el cast y hacer c = «» donde c is Control, que hacer el cast de Control a TextBox y luego llamar a Clear()…

    Un saludo,

    Alejandro

  5. Perdón, en el comentario anterior me refiero a que en principio parece más eficinete usar Clear() que t.Text = «», y no al revés como he puesto… (es un poco tarde ;-))

  6. Hola Alejandro.

    Sobre lo que planteas de que porque no mejor pone un t.Clear( ); en ves de t.Text = «»;.

    Al menos a mi no me lo permitia, es decir no me aparecia ese metodo al utilizar la Clase «Control» con el «foreach».

    Saludos.

  7. Hola Juan Fco.:

    Lo que comenta Alejandro es utilizar t.Clear(), es decir, llama al método Clear() usando la referencia de tipo TextBox (t), no la referencia de tipo Control (c), con lo que debería estar disponible.

    Muy buenos los comentarios, Alejandro 😉

    Si al final estamos usando extreme programming remoto… 😉 Y acabaremos con el código más óptimo XD

  8. Creo q puliendo un poco este codigo esta seria la mejor manera bueno al menos para mi por ese motivo lo comparto con ustedes xq de ustedes mismo son los derechos de autor solo lo he mejorado bueno al menos he probado el tiempo de respuesta….

    private void btnLimpiar_Click(object sender, EventArgs e)
    {
    limpiarTextBoxes(this);
    // Y opcionalmente…
    this.textBox1.Focus();
    }

    public void LimpiarTextBoxes(Control parent)
    {
    foreach (Control c in parent.Controls)
    {
    if (c is TextBoxX)
    {
    c.Text = «»;
    c.Tag = «»;
    }
    if (c.Controls.Count > 0)
    {
    LimpiarTextBoxes(c);
    }
    }
    }
    En cuanto a la propiedad Tag q tambien la hago = «» no se preocupen pues en mi caso utilizo esa propiedad para almacenar codigos….

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *