none
Alternar entre Picturebox em sequencia ( Next, Previous) RRS feed

  • Pergunta

  • Tenho o seguinte código com 4 picturebox, as 4 se encontra uma em cima da outra ou seja só vemos uma de cada vez.

    ao inserir imagens vai preenchendo e mostrando a atual inserida.

    agora não consegui alterar entre as picturebox ja preenchidas em sequencia tipo next 1,2,3,4 ou previous 4,3,2,1.

    somente consegui com (Random) , mas fica aleatório. e eu gostaria de ver em sequencia...

    public partial class Form1 : Form
        {
           
            
            PictureBox[] box = new PictureBox[4];
            
    
            public void add_foto()
    
            {
                
            }
            public Form1()
            {
                InitializeComponent();
                box[0] = pictureBox1;
                box[1] = pictureBox2;
                box[2] = pictureBox3;
                box[3] = pictureBox4;
                
            }
    
            private void btaddimagem_Click(object sender, EventArgs e)
            {
                OpenFileDialog openFileDialog = new OpenFileDialog();
                openFileDialog1.Filter = "*.BMP; *.JPG; *.GIF,*.PNG,*.TIFF)| *.BMP; *.JPG; *.GIF; *.PNG; *.TIFF | " + "All files(*.*)| *.* ";
                openFileDialog1.Multiselect = false;
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
    
                    string nomearquivo = openFileDialog1.FileName;
    
                    Bitmap bmp = new Bitmap(nomearquivo);
    
    
                    if (pictureBox1.Image == null)
                    {
                        box[0].Image = bmp;
                        ChangePictureBoxes();
                        pictureBox1.Visible = true;
                        label1.Text = "Imagen 1 de 4";
                    }
                    else if (pictureBox2.Image == null)
                    {
                        box[1].Image = bmp;
                        ChangePictureBoxes();
                        pictureBox2.Visible = true;
                        label1.Text = "Imagen 2 de 4";
                    }
                    else if (pictureBox3.Image == null)
                    {
                        box[2].Image = bmp;
                        ChangePictureBoxes();
                        pictureBox3.Visible = true;
                        label1.Text = "Imagen 3 de 4";
                    }
                    else if (pictureBox4.Image == null)
                    {
                        box[3].Image = bmp;
                        ChangePictureBoxes();
                        pictureBox4.Visible = true;
                        label1.Text = "Imagen 4 de 4";
                    }
                    else
                    {
                        MessageBox.Show("Você só pode inserir 4 imagens");
                    }
    
    
                }
    
            }
    
            private void ChangePictureBoxes()
            {
                pictureBox1.Visible = false;
                pictureBox2.Visible = false;
                pictureBox3.Visible = false;
                pictureBox4.Visible = false;
    
            }
           
    
            private void btproxima_Click(object sender, EventArgs e)
            {
    
                int i;
                Random unn = new Random();
                i = unn.Next(1, 5);
    
                if (i == 1)
                {
                    ChangePictureBoxes();
                    pictureBox1.Visible = true;
                    label1.Text = "Imagen 1 de 4";
                }
                else if (i == 2)
                {
                    ChangePictureBoxes();
                    pictureBox2.Visible = true;
                    label1.Text = "Imagen 2 de 4";
                }
                else if (i == 3)
                {
                    ChangePictureBoxes();
                    pictureBox3.Visible = true;
                    label1.Text = "Imagen 3 de 4";
                }
                else if (i == 4)
                {
                    ChangePictureBoxes();
                    pictureBox4.Visible = true;
                    label1.Text = "Imagen 4 de 4";
                }
    
            }

                                         

    sábado, 1 de julho de 2017 19:29

Respostas

  •     private PictureBox[] picBoxes;
        private int currentPBXSelected = 0;
    
        public Form1()
        {
            InitializeComponent();
            picBoxes = this.Controls.OfType<PictureBox>().Reverse().ToArray();
        }
    
        private void Btn_PrevPic_Click(object sender, EventArgs e)
        {
            currentPBXSelected--;
    
            if (currentPBXSelected < 0)
                currentPBXSelected = picBoxes.Length - 1;
    
            picBoxes[currentPBXSelected].Visible = true;
    
            for (int i = 0; i < picBoxes.Length; i++)
            {
                if (i != currentPBXSelected)
                    picBoxes[i].Visible = false;
            }
        }
    
        private void Btn_NextPic_Click(object sender, EventArgs e)
        {
            currentPBXSelected++;
    
            if (currentPBXSelected > picBoxes.Length -1)
                currentPBXSelected = 0;
    
            picBoxes[currentPBXSelected].Visible = true;
    
            for (int i = 0; i < picBoxes.Length; i++)
            {
                if (i != currentPBXSelected)
                    picBoxes[i].Visible = false;
            }
        }

    O que fazemos é: No construtor do Form, após fazer as instancias de todos os controles (Chamando o método InitializeComponent()), usamos os métodos do IEnumerable(T) para pegar todos os controles do form que sejam do tipo PictureBox, logo após, damos um Reverse, caso contrario a ordem ficaria contraria (PrevPicture iria pegar a próxima PictureBox ao invés da anterior, e vice-versa). Depois, 2 métodos simples que você vai chamar com botões ou o que você quiser. Pra pegar a proxima PictureBox, incrementamos a variável de controle currentPBXSelected, uma int que conterá o indicie da PictureBox atualmente visível no nosso array picBoxes. Após incrementa-la, verificamos se o seu valor é maior que o tamanho do array menos 1 (Já que estamos lidando com indicies com base zero), se for, então atribuímos zero, para que assim, a PictureBox atual seja a primeira (considerando que a ultima PictureBox visível seria a ultima da coleção). Depois, um belo For percorrendo toda a coleção, e verificando se o valor da variável de iteração i é o mesmo da variável de controle currentPBXSelected, se for, então esta é a PictureBox atualmente visível, não mexeremos nela. Assim, isso basicamente vai pegar a próxima PictureBox na coleção, torna-la visível, e todas as outras invisíveis. O método que faz a ordem reversa é a mesma coisa, como pode ver. A unica diferença é que decrementamos o valor da variável de controle currentPBXSelected, e verificamos se seu valor é menor que 0. Se for, fazemos ela assumir o valor do ultimo indicie na coleção.

    Veja se te ajuda.

    domingo, 2 de julho de 2017 17:32

Todas as Respostas

  •     private PictureBox[] picBoxes;
        private int currentPBXSelected = 0;
    
        public Form1()
        {
            InitializeComponent();
            picBoxes = this.Controls.OfType<PictureBox>().Reverse().ToArray();
        }
    
        private void Btn_PrevPic_Click(object sender, EventArgs e)
        {
            currentPBXSelected--;
    
            if (currentPBXSelected < 0)
                currentPBXSelected = picBoxes.Length - 1;
    
            picBoxes[currentPBXSelected].Visible = true;
    
            for (int i = 0; i < picBoxes.Length; i++)
            {
                if (i != currentPBXSelected)
                    picBoxes[i].Visible = false;
            }
        }
    
        private void Btn_NextPic_Click(object sender, EventArgs e)
        {
            currentPBXSelected++;
    
            if (currentPBXSelected > picBoxes.Length -1)
                currentPBXSelected = 0;
    
            picBoxes[currentPBXSelected].Visible = true;
    
            for (int i = 0; i < picBoxes.Length; i++)
            {
                if (i != currentPBXSelected)
                    picBoxes[i].Visible = false;
            }
        }

    O que fazemos é: No construtor do Form, após fazer as instancias de todos os controles (Chamando o método InitializeComponent()), usamos os métodos do IEnumerable(T) para pegar todos os controles do form que sejam do tipo PictureBox, logo após, damos um Reverse, caso contrario a ordem ficaria contraria (PrevPicture iria pegar a próxima PictureBox ao invés da anterior, e vice-versa). Depois, 2 métodos simples que você vai chamar com botões ou o que você quiser. Pra pegar a proxima PictureBox, incrementamos a variável de controle currentPBXSelected, uma int que conterá o indicie da PictureBox atualmente visível no nosso array picBoxes. Após incrementa-la, verificamos se o seu valor é maior que o tamanho do array menos 1 (Já que estamos lidando com indicies com base zero), se for, então atribuímos zero, para que assim, a PictureBox atual seja a primeira (considerando que a ultima PictureBox visível seria a ultima da coleção). Depois, um belo For percorrendo toda a coleção, e verificando se o valor da variável de iteração i é o mesmo da variável de controle currentPBXSelected, se for, então esta é a PictureBox atualmente visível, não mexeremos nela. Assim, isso basicamente vai pegar a próxima PictureBox na coleção, torna-la visível, e todas as outras invisíveis. O método que faz a ordem reversa é a mesma coisa, como pode ver. A unica diferença é que decrementamos o valor da variável de controle currentPBXSelected, e verificamos se seu valor é menor que 0. Se for, fazemos ela assumir o valor do ultimo indicie na coleção.

    Veja se te ajuda.

    domingo, 2 de julho de 2017 17:32
  • você poderia me dar uma ajuda com sua explicação realmente eu entendi toda a explicação mas não consegui colocar em prática...
    segunda-feira, 3 de julho de 2017 02:57
  • Eu entendo, é mais fácil entender o código do que a explicação :v

    Mas me diga, o que deu errado? (Se possível, poste o código que você tentou e não deu certo)

    segunda-feira, 3 de julho de 2017 13:35
  • Opa desculpa a demora mas resolvi colocar um botão para cada imagem. Resolveu meu problema do mesmo jeito rs...
    segunda-feira, 10 de julho de 2017 03:10