none
Limpiar todos los controles WPF RRS feed

  • Pregunta

  • Gente que tal, vengo con una duda con WPF y C#. Resulta que tengo un formulario de carga de clientes que tiene varios controles y los quiero limpiar, encontre la forma pero es media "lenta" tarda como 2 segundos o mas en reaccionar y no es muy lindo. Habrá otra manera de hacerlo? Gracias!

    private void btnLimpiar_Click(object sender, RoutedEventArgs e)
            {
    
                foreach (object nuevoObjeto in gridGeneral.Children.OfType<object>())
                {
    
                    if (nuevoObjeto.GetType() == typeof(TextBox))
                    {
                        var textBox = (TextBox)nuevoObjeto;
                        textBox.Clear();
                    }
                    else if (nuevoObjeto.GetType() == typeof(DatePicker))
                    {
                        var datePicker = (DatePicker)nuevoObjeto;
                        datePicker.SelectedDate = DateTime.Now.Date;
                    }
                    else if (nuevoObjeto.GetType() == typeof(ComboBox))
                    {
                        var comboBox = (ComboBox)nuevoObjeto;
                        comboBox.SelectedIndex = -1;
    
                    }
                }
    
            }

    • Editado HajimeSaito jueves, 23 de octubre de 2014 4:35
    jueves, 23 de octubre de 2014 4:34

Respuestas

  • Prueba a hacerlo al revés: en lugar de buscar todos los hijos de tipo <object> y luego por cada uno de ellos comparar si es de uno de los tres tipos deseados (TextBox, DatePicker, ComboBox), haz lo contrario: mete tres búsquedas con el Children.OfType que busquen, respectivamente <TextBox>, <DatePicker> y <ComboBox>, y dentro de cada uno de los tres bucles no necesitarás hacer ninguna comprobación de tipo.

    Por cierto, aunque después de hacer el cambio anterior ya no te hará falta, por si alguna otra vez lo necesitas es más eficiente comprobar los tipos con "if (nuevoObjeto is TextBox)" que usando GetType como lo estás haciendo.

    • Propuesto como respuesta Christian AmadoMVP jueves, 23 de octubre de 2014 11:08
    • Marcado como respuesta HajimeSaito jueves, 23 de octubre de 2014 18:10
    jueves, 23 de octubre de 2014 6:24

Todas las respuestas

  • Prueba a hacerlo al revés: en lugar de buscar todos los hijos de tipo <object> y luego por cada uno de ellos comparar si es de uno de los tres tipos deseados (TextBox, DatePicker, ComboBox), haz lo contrario: mete tres búsquedas con el Children.OfType que busquen, respectivamente <TextBox>, <DatePicker> y <ComboBox>, y dentro de cada uno de los tres bucles no necesitarás hacer ninguna comprobación de tipo.

    Por cierto, aunque después de hacer el cambio anterior ya no te hará falta, por si alguna otra vez lo necesitas es más eficiente comprobar los tipos con "if (nuevoObjeto is TextBox)" que usando GetType como lo estás haciendo.

    • Propuesto como respuesta Christian AmadoMVP jueves, 23 de octubre de 2014 11:08
    • Marcado como respuesta HajimeSaito jueves, 23 de octubre de 2014 18:10
    jueves, 23 de octubre de 2014 6:24
  • Perfecto, a ver si entendi, algo asi?

    private void _limpiarControles()
            {
    
                foreach (TextBox nuevoObjeto in gridGeneral.Children.OfType<TextBox>())
                {
                    nuevoObjeto.Clear();
                }
    
                foreach (DatePicker nuevoObjeto in gridGeneral.Children.OfType<DatePicker>())
                {
                    nuevoObjeto.SelectedDate = DateTime.Now.Date;
                }
    
                foreach (PasswordBox nuevoObjeto in gridGeneral.Children.OfType<PasswordBox>())
                {
                    nuevoObjeto.Clear();
                }
            }
    Gracias!!!



    • Editado HajimeSaito jueves, 23 de octubre de 2014 7:54
    jueves, 23 de octubre de 2014 7:53
  • Exacto, a eso me refería. En principio, debería ser más rápido que tu versión anterior, pero tendrás que ejecutarlo para comprobarlo.
    jueves, 23 de octubre de 2014 9:22
  • hola

    una duda los controles estan directo sobre la ventana, o estan contenido dentro de otros controles, digamos algun panel o Grid

    lo pregunto porque en WPF hay un concepto de Visual Tree, aqui se explica el concepto

    WPF: Arboles

    quizas debas aplicar este para poder llegar a los controles

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 23 de octubre de 2014 11:50
  • Gracias Alberto, funciona más que perfecto, ahora tengo que hacerlo recursivo porque hay controles que estan dentro de GroupBox que no los toma.

    Si Leandro los controles están dentro de un Grid, en este caso "gridGeneral", pero hay algunos que no los toma porque estan dentro de un GroupBox (en mi caso PasswordBox), pensaba hacer algo recursivo, pero voy a leer lo de árboles a ver como lo soluciono! Gracias!

    jueves, 23 de octubre de 2014 18:10