none
Obtener lista de controles que están en distintos paneles RRS feed

  • Pregunta

  • Hola buen dia

    Tengo varios paneles con una PictureBox cada panel
    Quise poder recorrer los PictureBox de la siguiente manera 

    for (int indice = 0; indice<50;indice++)
                {
                    var controles = this.Controls.OfType<PictureBox>().Where(x => x.Name.Equals("pictureBox + indice+1"));
    
                    if (DAO.ConsultasSQL.Existe(Convert.ToInt32(indice)))
                    {
                        foreach (var ctrl in controles)
                        {
                            ctrl.Image = imageListMesas.Images[1];
                        }
                    }
                    else
                    {
                        foreach (var ctrl in controles)
                        {
                            ctrl.Image = imageListMesas.Images[0];
                        }
                    }
                }

    El problema que al estar dentro de un panel no lo reconoce

    Entonces quise aplicar la misma logica para obtener los paneles

    for (int panel = 0; panel < 50; panel++)
                    {
                        var paneles = this.Controls.OfType<Panel>().Where(x => x.Name.Equals("panel" + panel + 1));
                    }

    Pero en este caso me aparece que IEnumerable<Panel> no tiene una definicion para Controls


    Hay alguna solucion?

    Saludos

    sábado, 11 de agosto de 2018 12:40

Respuestas

  • me aparece que IEnumerable<Panel> no tiene una definicion para Controls

    No, efectivamente IEnumerable<Panel> no tiene Controls, lo Controls están en el Panel, no en el IEnumerable<Panel>. Cuando ocurre esto, significa que se te ha olvidado meter un foreach para enumerar el IEnumerable.

    Pero estás trabajando mucho más de lo necesario, te bastaría con enumerar  this.Controls.OfType<Panel>()

    para obtener todos los paneles, y luego dentro de cada uno ya puedes buscar los pictureboxes de cada panel. No se necesita filtrar los paneles por nombre, a no ser que hayas usado paneles con otra nomenclatura distinta en los que no necesites buscar pictureboxes.

    foreach (Panel pnl in  this.Controls.OfType<Panel>())
    {
       // Aquí buscar PictureBoxes en los Controls de pnl
    }

    sábado, 11 de agosto de 2018 12:54
    Moderador
  • Muchas gracias, tenia el problema que los paneles estaban dentro de un TableLayoutPanel, pero use la misma logica para resolverlo y me funciono

     foreach (TableLayoutPanel tableLayoutPanel in this.Controls.OfType<TableLayoutPanel>())
                {
                    foreach (Panel panel in tableLayoutPanel.Controls.OfType<Panel>())
                    {
                        var controles = panel.Controls.OfType<PictureBox>();
                        foreach (var ctrl in controles)
                        {
                            ctrl.Image = imageListMesas.Images[1];
                        }
                    }
                }

    Gracias

    sábado, 11 de agosto de 2018 22:25

Todas las respuestas

  • me aparece que IEnumerable<Panel> no tiene una definicion para Controls

    No, efectivamente IEnumerable<Panel> no tiene Controls, lo Controls están en el Panel, no en el IEnumerable<Panel>. Cuando ocurre esto, significa que se te ha olvidado meter un foreach para enumerar el IEnumerable.

    Pero estás trabajando mucho más de lo necesario, te bastaría con enumerar  this.Controls.OfType<Panel>()

    para obtener todos los paneles, y luego dentro de cada uno ya puedes buscar los pictureboxes de cada panel. No se necesita filtrar los paneles por nombre, a no ser que hayas usado paneles con otra nomenclatura distinta en los que no necesites buscar pictureboxes.

    foreach (Panel pnl in  this.Controls.OfType<Panel>())
    {
       // Aquí buscar PictureBoxes en los Controls de pnl
    }

    sábado, 11 de agosto de 2018 12:54
    Moderador
  • Muchas gracias, tenia el problema que los paneles estaban dentro de un TableLayoutPanel, pero use la misma logica para resolverlo y me funciono

     foreach (TableLayoutPanel tableLayoutPanel in this.Controls.OfType<TableLayoutPanel>())
                {
                    foreach (Panel panel in tableLayoutPanel.Controls.OfType<Panel>())
                    {
                        var controles = panel.Controls.OfType<PictureBox>();
                        foreach (var ctrl in controles)
                        {
                            ctrl.Image = imageListMesas.Images[1];
                        }
                    }
                }

    Gracias

    sábado, 11 de agosto de 2018 22:25