none
pictureBox & imageList?

    Dotaz

  • Dobrý den, potřeboval bych radu. Tvořím aplikaci ve Microsoft Visual C# 2010 Express a chtěl bych přiřazovat kazdému pictureBoxu (konkrétně na jeho BackgroundImage) jednotlivý obrázek z imageList1. Bohužel, se mi to nepovedlo napsat jinak než takto:

     public void prirad_obr()
            {
                pictureBox1.BackgroundImage = imageList1.Images[0];
                pictureBox2.BackgroundImage = imageList1.Images[1];
                pictureBox3.BackgroundImage = imageList1.Images[2];
                pictureBox4.BackgroundImage = imageList1.Images[3];
                pictureBox5.BackgroundImage = imageList1.Images[4];
                pictureBox6.BackgroundImage = imageList1.Images[5];
                pictureBox7.BackgroundImage = imageList1.Images[6];
                pictureBox8.BackgroundImage = imageList1.Images[7];
                pictureBox9.BackgroundImage = imageList1.Images[0];
                pictureBox10.BackgroundImage = imageList1.Images[1];
                pictureBox11.BackgroundImage = imageList1.Images[2];
                pictureBox12.BackgroundImage = imageList1.Images[3];
                pictureBox13.BackgroundImage = imageList1.Images[4];
                pictureBox14.BackgroundImage = imageList1.Images[5];
                pictureBox15.BackgroundImage = imageList1.Images[6];
                pictureBox16.BackgroundImage = imageList1.Images[7];
            }

    Nevíte jak to napsat např. přes nějaký cyklus? Předem děkuji za odpověď.



    • Upravený gunyy 14. června 2012 18:52
    14. června 2012 18:50

Odpovědi

  • Ano jde to, jestli dobře rozumím otázce.

    Tato funkce vám najde Control podle názvu. Za controlId dosadíte název pictureBoxu a za container pravděpodobně this.

    public Control FindControl(string controlId, Control container)
            {
                if (container.Name == controlId)
                    return container;
    
                foreach (Control control in container.Controls)
                {
                    Control c = FindControl(controlId, control);
                    if (c != null)
                        return c;
                }
                return null;
            }
    Teď můžete už použít jednoduchý cyklus. Za x dosadíte index toho vašeho Image v listu, kde x se vám bude přičítat od 0 do 7, ale to věřím že už zvládnete sám. :)
     for (int i = 1; i < 17; i++)
                    ((PictureBox)FindControl("pictureBox" + i, this)).BackgroundImage = imageList1.Images[x];
    Nevýhoda tohoto je, že tato cesta je poměrně pomalé a nefeketivní. Lepší je si nejdříve všechny pictureBox nahrát do pole a pak je používat z pole.

    David Roško
    • Upravený David Roško 19. června 2012 0:05
    • Označen jako odpověď gunyy 20. června 2012 13:02
    19. června 2012 0:01

Všechny reakce

  • Co třeba vytvořit si pole:

    pictureBox[x].BackgroundImage = imageList1.Images[x];


    JCH

    14. června 2012 19:42
  • To jsem právě zkoušel ale když to tak udělám tak mi to vyhodí chybu, že nezná pictureBox a nějaké [x] to nebere, zkoušel jsem to i ukládat do stringové proměnné, jenže i když tam uložím správný název pictureBoxu tak nemůžu pracovat s událostmi jako je např. ten BackgroundImage
    14. června 2012 21:28
  • Ano jde to, jestli dobře rozumím otázce.

    Tato funkce vám najde Control podle názvu. Za controlId dosadíte název pictureBoxu a za container pravděpodobně this.

    public Control FindControl(string controlId, Control container)
            {
                if (container.Name == controlId)
                    return container;
    
                foreach (Control control in container.Controls)
                {
                    Control c = FindControl(controlId, control);
                    if (c != null)
                        return c;
                }
                return null;
            }
    Teď můžete už použít jednoduchý cyklus. Za x dosadíte index toho vašeho Image v listu, kde x se vám bude přičítat od 0 do 7, ale to věřím že už zvládnete sám. :)
     for (int i = 1; i < 17; i++)
                    ((PictureBox)FindControl("pictureBox" + i, this)).BackgroundImage = imageList1.Images[x];
    Nevýhoda tohoto je, že tato cesta je poměrně pomalé a nefeketivní. Lepší je si nejdříve všechny pictureBox nahrát do pole a pak je používat z pole.

    David Roško
    • Upravený David Roško 19. června 2012 0:05
    • Označen jako odpověď gunyy 20. června 2012 13:02
    19. června 2012 0:01
  • Dobrý den,

    do pole je to potřebné nejprve dostat. Samo se to do něj nebude vytvářet.

    Jak moc umíte práci s poli?

    x byla proměnná. I tu si musíte nejprve zadefinovat a pak v cyklu použít.


    JCH

    19. června 2012 4:41
  • Výborné, takhle to bohatě stačí. Díky moc. :)
    20. června 2012 13:02