none
Localizar Picturebox no form RRS feed

  • Pergunta

  • Pessoal,

    Como eu posso saber as posições de todos os picturebox que existem no meu form? Pois eu os criei dinamicamente, são varios tipos de imagens, e eu preciso clicar em uma e sabe se existe outra proxima.

    É um jogo de Damas. Fiz toda a logica e falta "comer" as peças. Eu tenho duas pecas diferentes que ao clicar eu pego a posicao left e top do picturebox, mas eu so pego da que eu cliquei, nao consigo saber se existe outra proxima para "comer".

    quarta-feira, 26 de maio de 2010 23:10

Respostas

  • Age,

    É possível encontrar os controles usando um método recursivo no formulário. Por exemplo:

     private List<T> GetChildControls<T>(Control c, bool recursive)
        where T : Control
    {
        // lista de controles
        var childControlsList = new List<T>();

        // adiciona controles na lista de controles
        childControlsList.AddRange(c.Controls.OfType<T>());

        // verifica se o método é recursivo e realiza
        // um loop nos filhos
        if (recursive)
        {
            foreach(Control ctrl in c.Controls)
                childControlsList.AddRange(this.GetChildControls<T>(ctrl, true));
        }

        return childControlsList;
    }

    Para procurar por controles do tipo PictureBox você poderia fazer da seguinte maneira:

    // procura por controles PictureBox no formulário
    var listaPictureBox = this.GetChildControls<PictureBox>(this, true);
    foreach (var pb in listaPictureBox)
        MessageBox.Show(pb.Name);

    Minha sugestão ainda seria criar esse método GetChildControls como um método de extensão da classe Control em uma Class Library que pode ser reutilizada em outros projetos. Por exemplo:

    public static class ControlExtensions
    {
        public static List<T> GetChildControls<T>(this Control c, bool recursive)
            where T : Control
        {
            // lista de controles
            var childControlsList = new List<T>();

            // adiciona controles na lista de controles
            childControlsList.AddRange(c.Controls.OfType<T>());

            // verifica se o método é recursivo e realiza
            // um loop nos filhos
            if (recursive)
            {
                foreach (Control ctrl in c.Controls)
                    childControlsList.AddRange(ctrl.GetChildControls<T>(true));
            }

            return childControlsList;
        }
    }

    O método para procurar os controles ficaria então da seguinte maneira:

    // procura por controles PictureBox no formulário
    var listaPictureBox = this.GetChildControls<PictureBox>(true);
    foreach (var pb in listaPictureBox)
        MessageBox.Show(pb.Name);

    Obs: Não testei os códigos, aparentemente estão ok.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    • Marcado como Resposta AgeMania sexta-feira, 28 de maio de 2010 00:12
    quinta-feira, 27 de maio de 2010 02:21
    Moderador

Todas as Respostas

  • Age,

    É possível encontrar os controles usando um método recursivo no formulário. Por exemplo:

     private List<T> GetChildControls<T>(Control c, bool recursive)
        where T : Control
    {
        // lista de controles
        var childControlsList = new List<T>();

        // adiciona controles na lista de controles
        childControlsList.AddRange(c.Controls.OfType<T>());

        // verifica se o método é recursivo e realiza
        // um loop nos filhos
        if (recursive)
        {
            foreach(Control ctrl in c.Controls)
                childControlsList.AddRange(this.GetChildControls<T>(ctrl, true));
        }

        return childControlsList;
    }

    Para procurar por controles do tipo PictureBox você poderia fazer da seguinte maneira:

    // procura por controles PictureBox no formulário
    var listaPictureBox = this.GetChildControls<PictureBox>(this, true);
    foreach (var pb in listaPictureBox)
        MessageBox.Show(pb.Name);

    Minha sugestão ainda seria criar esse método GetChildControls como um método de extensão da classe Control em uma Class Library que pode ser reutilizada em outros projetos. Por exemplo:

    public static class ControlExtensions
    {
        public static List<T> GetChildControls<T>(this Control c, bool recursive)
            where T : Control
        {
            // lista de controles
            var childControlsList = new List<T>();

            // adiciona controles na lista de controles
            childControlsList.AddRange(c.Controls.OfType<T>());

            // verifica se o método é recursivo e realiza
            // um loop nos filhos
            if (recursive)
            {
                foreach (Control ctrl in c.Controls)
                    childControlsList.AddRange(ctrl.GetChildControls<T>(true));
            }

            return childControlsList;
        }
    }

    O método para procurar os controles ficaria então da seguinte maneira:

    // procura por controles PictureBox no formulário
    var listaPictureBox = this.GetChildControls<PictureBox>(true);
    foreach (var pb in listaPictureBox)
        MessageBox.Show(pb.Name);

    Obs: Não testei os códigos, aparentemente estão ok.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    • Marcado como Resposta AgeMania sexta-feira, 28 de maio de 2010 00:12
    quinta-feira, 27 de maio de 2010 02:21
    Moderador
  • Obrigado Ari!

     

    Era exatamente isso que eu queria, agora consigo terminar minha Dama sem problemas maiores :P

    sexta-feira, 28 de maio de 2010 00:13