none
Limpiar Combobox dentro de un Tabcontrol RRS feed

  • Pregunta

  • Bune dia a todos.

    Tengo el siguiente problema, resulta que tengo un tabcontrol con varios tabpage, y dentro de cada tabpage o pestaña tengo varios combobox cargados mediante un datasource, lo que necesito hacer es limpiar cada combobox en su propiedad text, para lo cual lo hagho mediante un foreach anidado:

    foreach (Control EditaTab in this.tabControl1.Controls)  //Recorro el tabcontrol
                    {
                             foreach (Control EditaCtrl in EditaTab.Controls)  //Recorro los controles del primer tabpage

                            {

                                   if (EditaCtrl is ComboBox) //Si es un combobox
                                  {
                                         EditaCtrl.BackColor = Color.LightBlue;          //Cambio el color de fondo (funciona)                  
                                         EditaCtrl.Enabled = true;                             //Activo el control (funciona)
                                         EditaCtrl.Text = "";                                     //Limpio el combobox (NO FUNCIONA)
                                   }

                            }

                    }

    Lo curioso del caso, es quie solo hace las tres tareas en el tabpage que esta activo, para los demas solo ejecuta el cambio de color y la activacion del control, el texto no lo limpia.

    Alguna sugerencia?

    Gracias de antemano.


    viernes, 25 de octubre de 2019 16:36

Respuestas

  • Hola Cristian, lo que sucede, a mi entnder es que no calificas el control, o sea ej.

     foreach (ComboBox EditaCtrl in EditaTable.Controls.OfType<ComboBox>())

    Por qué? a mi entender cuando agrupas a todos los controls, las propiedades no son las mismas para todos ej. un button su propiedad text no es lo mismo que la propiedad Text de un textbox o un ComboBox. Al explicitar el control solo recurre a esa propidad.

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗

    viernes, 25 de octubre de 2019 16:54
  •  Pues fijate si no es el tema del cambio de page, si no prueba lo que te digo en el form ej:

      foreach (ComboBox ctl in this.Controls.OfType<ComboBox>())
                {
                    ctl.Text = "";
    
    
                }

    Como está expuesto el código limpia el text de todos los Combobox

    Saludos lo seguimos viendo


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗

    viernes, 25 de octubre de 2019 17:17

Todas las respuestas

  • Hola Cristian, lo que sucede, a mi entnder es que no calificas el control, o sea ej.

     foreach (ComboBox EditaCtrl in EditaTable.Controls.OfType<ComboBox>())

    Por qué? a mi entender cuando agrupas a todos los controls, las propiedades no son las mismas para todos ej. un button su propiedad text no es lo mismo que la propiedad Text de un textbox o un ComboBox. Al explicitar el control solo recurre a esa propidad.

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗

    viernes, 25 de octubre de 2019 16:54
  • Hola Marcelo.

    Gracias por responder, ya intente lo que mencionas, sin embargo aun persiste el problema, el recorrido entre los tabpage lo hace correcto, sin embargo al dar la instruccion de limpiar el combobox, no lo hace.

    Seguire investigando.

    viernes, 25 de octubre de 2019 17:15
  •  Pues fijate si no es el tema del cambio de page, si no prueba lo que te digo en el form ej:

      foreach (ComboBox ctl in this.Controls.OfType<ComboBox>())
                {
                    ctl.Text = "";
    
    
                }

    Como está expuesto el código limpia el text de todos los Combobox

    Saludos lo seguimos viendo


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗

    viernes, 25 de octubre de 2019 17:17
  • Recree tu escenario prueba de esta manera Ej:

      private void button9_Click(object sender, EventArgs e)
            {
                foreach (Control EditaTab in this.tabControl1.Controls)  //Recorro el tabcontrol
                {
                    foreach (ComboBox ctl in EditaTab.Controls.OfType<ComboBox>())  //Recorro los controles del primer tabpage
    
                    {
                      
                           ctl.BackColor = Color.LightBlue;          //Cambio el color de fondo (funciona)                  
                           ctl.Enabled = true;                             //Activo el control (funciona)
                           ctl.Text = "";                                     //Limpio el combobox (??)
                   
    
                    }
    
                }
            }

    En mi escenario funciona perfecto

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗


    • Editado Marcelo PF viernes, 25 de octubre de 2019 17:26
    viernes, 25 de octubre de 2019 17:24
  • Gracias Marcelo.

    Me dedique a debugear el codigo, para apoyarme, declare una variable string en donde almaceno el valor del combobox despues de haber hecho los recorridos (donde limpio el combobox). Para mi sorpresa, realmente la propiedad text del combobox si esta vacia (los foreach si funcionan), sin embargo el texto sigue mostrandose graficamente dentro del control:

    string valor;

    //Despues de realizar los forech hago lo siguiente:

    valor = combobox1.text;

    //El contenido de la variable esta vacio ("").

    No se que pueda ser.

    viernes, 25 de octubre de 2019 18:17
  • Algó más debe haber que cargue el text. Mi esenario, cargo los cobo por Datasource de base de datos NORTHWND

     SqlCommand Comand = new SqlCommand();
                SqlConnection con = new SqlConnection(@"data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Dirección\Desktop\NORTHWND.MDF;Integrated Security=True");
                SqlDataAdapter Adapter = new SqlDataAdapter(@"select * from [Customers] ", con);
                con.Open();
                System.Data.DataTable Dtos = new System.Data.DataTable();
                Adapter.Fill(Dtos);
    comboBox1.DataSource = Dtos;
                comboBox1.DisplayMember = "City";
                comboBox1.DisplayMember = "City";
                comboBox2.DataSource = Dtos;
                comboBox2.DisplayMember = "City";
                comboBox2.DisplayMember = "City";
                comboBox3.DataSource = Dtos;
                comboBox3.DisplayMember = "City";
                comboBox3.DisplayMember = "City";

     Imagen luego de ejecutar

       todos con la misma carga. Luego de ejecutar el código expuesto

    Como ves, algo más está llenado nuevamente el Combobox, tal vez si colocas todo el código se podrá ver donde

    Saludos y lo seguimos viendo


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗



    • Editado Marcelo PF viernes, 25 de octubre de 2019 18:37
    viernes, 25 de octubre de 2019 18:35
  • Si si, te doy toda la razón, acabo de comprobar (por un error mío) que si colocas ValueMember al combo aparte de DisplayMember actua de manera que indicas tú. Pues no se por qué (se me quemaron los papeles) por no destruye el text hasta que no está activado. Una solución, generar la selección automática del control mediante un int ej tal cual estaba solo agrego el it

      private void button9_Click(object sender, EventArgs e)
            {
                int i = 0;
                foreach (TabPage EditaTab in this.tabControl1.Controls.OfType<TabPage>())  //Recorro el tabcontrol
                {
    
    
                    foreach (ComboBox ctl in EditaTab.Controls.OfType<ComboBox>())  //Recorro los controles del primer tabpage
    
                    {
                        tabControl1.SelectedIndex = i;
                           ctl.BackColor = Color.LightBlue;          //Cambio el color de fondo (funciona)                  
                           ctl.Enabled = true;                             //Activo el control (funciona)
                           ctl.Text = "";                                     //Limpio el combobox (Veremos....)
                       
                    }
                    i += 1;
                }
            }

    No se que tan bonito quede que se mueva tabControl entre páginas pero bueno por el momento es lo que hay

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗


    • Editado Marcelo PF viernes, 25 de octubre de 2019 19:37
    viernes, 25 de octubre de 2019 19:34
  • Si si, te doy toda la razón, acabo de comprobar (por un error mío) que si colocas ValueMember al combo aparte de DisplayMember actua de manera que indicas tú. Pues no se por qué (se me quemaron los papeles) por no destruye el text hasta que no está activado. Una solución, generar la selección automática del control mediante un int ej tal cual estaba solo agrego el it

      private void button9_Click(object sender, EventArgs e)
            {
                int i = 0;
                foreach (TabPage EditaTab in this.tabControl1.Controls.OfType<TabPage>())  //Recorro el tabcontrol
                {
    
    
                    foreach (ComboBox ctl in EditaTab.Controls.OfType<ComboBox>())  //Recorro los controles del primer tabpage
    
                    {
                        tabControl1.SelectedIndex = i;
                           ctl.BackColor = Color.LightBlue;          //Cambio el color de fondo (funciona)                  
                           ctl.Enabled = true;                             //Activo el control (funciona)
                           ctl.Text = "";                                     //Limpio el combobox (Veremos....)
                       
                    }
                    i += 1;
                }
            }

    No se que tan bonito quede que se mueva tabControl entre páginas pero bueno por el momento es lo que hay

    Saludos


    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗


    Justamente eso era lo que quería evitar, hacer que el usuario vea un especie de flashaso en su pantalla, al final cumple con lo buscado, aunque no de la mejor manera.

    seguiré investigando un poco, cualquier solución la pondré para cerrar el tema.

    Gracias Marcelo.

    viernes, 25 de octubre de 2019 20:35