Dynamiczne tworzenie kontrolek w c#.

0

Witam, zrobiłem coś takiego (testowo):

 
for (int a = 1; a <= 5; a++)
            {
                PictureBox pictureBox = new PictureBox();
                pictureBox.Name = "nowy"+a.ToString();
                pictureBox.Parent = panel1;
                pictureBox.Visible = true;
                pictureBox.Left = 10;
                pictureBox.Top = 30;
                pictureBox.Image = System.Drawing.Bitmap.FromFile("g.jpg");
            }

pętla wykona się 5 razy i umieści na panel1 5 picturebox-ów.
Niestety kod ten umieszcza tylko jeden picturebox.
Nie bardzo wiem jak podejść do tematu. Proszę o pomoc. :)

0

Umieszcza 5, tylko że jeden na drugim. Następny musisz umieszczać np. w odległości równej szerokości poprzedniej kontrolki, w ten sposób ułożysz je w rzędzie.

0
for (int a = 1; a <= 5; a++)
            {
                PictureBox pictureBox = new PictureBox();
                pictureBox.Name = "nowy"+a.ToString();
                pictureBox.Parent = panel1;
                pictureBox.Visible = true;
                pictureBox.Left = 10 + (a*32);
                pictureBox.Top = 30;
                pictureBox.Image = System.Drawing.Bitmap.FromFile("g.jpg");
            } 

nadal umieszcza 1

0

a moze panel1 jest na tyle maly ze pokazuje tylko jeden pictureBox? sam sie nie rozszerzy, musisz mu pomoc :)

0

Ustaw jeszcze

pictureBox.SizeMode = PictureBoxSizeMode.AutoSize; 
0
adams85 napisał(a)

Ustaw jeszcze

pictureBox.SizeMode = PictureBoxSizeMode.AutoSize; 

pięknie, pomogło :) dzięki.

0

Jesli można, mam następne pytanie.
Jak wykonać pictureBox_MouseDoubleClick dla każdego z pictureBox lub tylko dla np.trzeciego ?

adams85 napisał(a)

Znaczy się, jak wywołać podwójne kliknięcie z poziomu kodu, czy jak podpiąć event do kontrolki?

jak podpiąć event

// fcuk :/ - Ł

0

A może użyć TableLayoutPanel, który sam ułoży kontrolki obok siebie?

0
pictureBox.MouseDoubleClick += new MouseEventHandler(this.PictureBoxMouseDoubleClick); 

Metoda PictureBoxMouseDoubleClick musi przyjmować dwa argumenty: pierwszy to object, a drugi MouseEventArgs:

 private void MouseDoubleClick(Object sender, MouseEventArgs e)
{
 MessageBox.Show("Click!");//czy cokolwiek innego co chcesz zrobic
}
0

tak, ale czy to nie jest czasem jeden event dla wszystkich pictureBox-ów ?

 
        private void MouseDoubleClick(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click!");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            for (int a = 1; a <= 5; a++)
            {
                PictureBox pictureBox = new PictureBox();
                pictureBox.Name = "nowy"+a.ToString();
                pictureBox.Parent = panel1;
                pictureBox.Visible = true;
                pictureBox.Left = 10 + (a*32);
                pictureBox.Top = 30;
                pictureBox.Image = System.Drawing.Bitmap.FromFile("g.jpg");
                pictureBox.SizeMode = PictureBoxSizeMode.AutoSize;

                pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick);
                
            }
        }

zastanawiam się jak zrobić event dla konkretnej kontrolki?
Czyli jesli klikne na 1 pictureboxa to niech wykona MessageBox("event 1"), kliknę na 2 pictureboxa to nich wykona MessageBox("event 2").

0

Tak samo, tylko dla każdej kontrolki musisz napisać oddzielną metodę i odpowiednio podpiąć.

0

Wyobraźmy sobie sytuacje taką:

  1. pobieram z bazy lub pliku listę i tworzę tablicę. W tablicy mam "koło", "koło", "kwadrat", "kwadrat", "trójkąt".
  2. Tworzę piktureboxy "koło", "koło", "kwadrat", "kwadrat", "trójkąt".
  3. Przypisuję eventy do każdego z nich. koła mają swój evet, kwadraty swój i trójkąt swój.
    Klikając na którąś z figur wywołuje odpowiednie zdarzenie.
    Z czymś takim walczę. :)
0
adams85 napisał(a)

Tak samo, tylko dla każdej kontrolki musisz napisać oddzielną metodę i odpowiednio podpiąć.

problem jest w tym, że nie wiem jak to zrobić.

0

aha chwila :)

0

sorry nie wyspałem się dzisiaj :)
działa :)

 
        private void MouseDoubleClick1(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click! 1");//czy cokolwiek innego co chcesz zrobic
        }
        private void MouseDoubleClick2(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click! 2");//czy cokolwiek innego co chcesz zrobic
        }
        private void MouseDoubleClick3(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click! 3");//czy cokolwiek innego co chcesz zrobic
        }
        private void MouseDoubleClick4(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click! 4");//czy cokolwiek innego co chcesz zrobic
        }
        private void MouseDoubleClick5(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click! 5");//czy cokolwiek innego co chcesz zrobic
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            for (int a = 1; a <= 5; a++)
            {
                PictureBox pictureBox = new PictureBox();
                pictureBox.Name = "nowy"+a.ToString();
                pictureBox.Parent = panel1;
                pictureBox.Visible = true;
                pictureBox.Left = 10 + (a*32);
                pictureBox.Top = 30;
                pictureBox.Image = System.Drawing.Bitmap.FromFile("g.jpg");
                pictureBox.SizeMode = PictureBoxSizeMode.AutoSize;

                if (a == 1) pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick1);
                if (a == 2) pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick2);
                if (a == 3) pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick3);
                if (a == 4) pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick4);
                if (a == 5) pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick5);
                
            }
        }
0

teraz pobawimy się z przesuwaniem tych elementów.

0

ustalmy, że masz liste List<string> figury;w której trzymasz elementy przeczytane z pliku (koło, kwadrat i trojkąt). Jak rozumiem kolejność elementów wcale nie musi być taka jak opisałeś. Więć twoje zadanie polega na tym, żeby przelecieć w pętli wszytstkie elementy z listy, stworzyć odpowiednią ilość pictureboxów i dla każdego przypisać odpowiedni obrazek oraz event. Więc może to wyglądać tak:

 
List<string> figury;
//tu wypełniasz liste
for (int i = 0; i < figury.Count; i++)
{
    PictureBox pictureBox = new PictureBox();
    pictureBox.Name = "figura" + i.ToString();
    pictureBox.Parent = panelFigury;
    pictureBox.Visible = true;
    pictureBox.Left = 10 + (i * 32);//tu trzeba dokładniej wyliczyć odstęp
    pictureBox.Top = 30;
    switch (figury[i])
    {
        case "kolo":
            pictureBox.Image = System.Drawing.Bitmap.FromFile("kolo.jpg");
            pictureBox.MouseDoubleClick += new MouseEventHandler(this.KoloMouseDoubleClick);
            break;
        case "kwadrat":
            pictureBox.Image = System.Drawing.Bitmap.FromFile("kwadrat.jpg");
            pictureBox.MouseDoubleClick += new MouseEventHandler(this.KoloMouseDoubleClick);
            break;
        case "trojkat":
            pictureBox.Image = System.Drawing.Bitmap.FromFile("trojkat.jpg");
            pictureBox.MouseDoubleClick += new MouseEventHandler(this.KoloMouseDoubleClick);
            break;
    }
    
    pictureBox.SizeMode = PictureBoxSizeMode.AutoSize;
}

albo skorzystać z rady somekind'a i nie martwić się o odstępy a wrzucać pictureboxy do tablelayout'a:

 
List<string> figury = new List<string>();
//tu wypełniasz liste
for (int i = 0; i < figury.Count; i++)
{
    PictureBox pictureBox = new PictureBox();
    pictureBox.Name = "figura" + i.ToString();
    pictureBox.Parent = this.tableLayoutPanel1;
    pictureBox.Visible = true;
    switch (figury[i])
    {
        case "kolo":
            pictureBox.Image = System.Drawing.Bitmap.FromFile("kolo.jpg");
            pictureBox.MouseDoubleClick += new MouseEventHandler(this.KoloMouseDoubleClick);
            break;
        case "kwadrat":
            pictureBox.Image = System.Drawing.Bitmap.FromFile("kwadrat.jpg");
            pictureBox.MouseDoubleClick += new MouseEventHandler(this.KoloMouseDoubleClick);
            break;
        case "trojkat":
            pictureBox.Image = System.Drawing.Bitmap.FromFile("trojkat.jpg");
            pictureBox.MouseDoubleClick += new MouseEventHandler(this.KoloMouseDoubleClick);
            break;
    }                   
    
}
0

przesuwanie kontrolek. tworzę dynamicznie 2 kontrolki. Zrobiłem eventy dla nich. Jednak przesuwać mogę ostatnią (2).
Może ktoś z waz zauważy gdzie jest błąd?

 
        private Point m_mouseDownHere1, m_lastLocation1;
        private Point m_mouseDownHere2, m_lastLocation2;

        private void MouseDoubleClick1(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click! 1");//czy cokolwiek innego co chcesz zrobic
        }
        private void MouseDoubleClick2(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click! 2");//czy cokolwiek innego co chcesz zrobic
        }

        private void MouseDown1(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;
            m_lastLocation1 = pictureBox.Location;
            // original location of the window in Parent coordinates
            m_mouseDownHere1.X = e.X;  // child window coordinates of the mouse
            m_mouseDownHere1.Y = e.Y;

        }

        private void MouseMove1(object sender, MouseEventArgs e)
        {
            if (pictureBox.Capture == false)
                return;
            pictureBox.Location = new Point(m_lastLocation1.X + e.X - m_mouseDownHere1.X, m_lastLocation1.Y + e.Y - m_mouseDownHere1.Y);
            m_lastLocation1 = pictureBox.Location;

        }

        private void MouseUp1(object sender, MouseEventArgs e)
        {
            pictureBox.Location = new Point(m_lastLocation1.X + e.X - m_mouseDownHere1.X, m_lastLocation1.Y + e.Y - m_mouseDownHere1.Y);
        }

        private void MouseDown2(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;
            m_lastLocation2 = pictureBox.Location;
            // original location of the window in Parent coordinates
            m_mouseDownHere2.X = e.X;  // child window coordinates of the mouse
            m_mouseDownHere2.Y = e.Y;

        }

        private void MouseMove2(object sender, MouseEventArgs e)
        {
            if (pictureBox.Capture == false)
                return;
            pictureBox.Location = new Point(m_lastLocation2.X + e.X - m_mouseDownHere2.X, m_lastLocation2.Y + e.Y - m_mouseDownHere2.Y);
            m_lastLocation2 = pictureBox.Location;

        }

        private void MouseUp2(object sender, MouseEventArgs e)
        {
            pictureBox.Location = new Point(m_lastLocation2.X + e.X - m_mouseDownHere2.X, m_lastLocation2.Y + e.Y - m_mouseDownHere2.Y);
        }

        private PictureBox pictureBox;

        private void button1_Click(object sender, EventArgs e)
        {
            
            for (int a = 1; a <= 2; a++)
            {
                pictureBox = new PictureBox();
                pictureBox.Name = "nowy"+a.ToString();
                pictureBox.Parent = panel1;
                pictureBox.Visible = true;
                pictureBox.Left = 10 + (a*32);
                pictureBox.Top = 30;
                pictureBox.Image = System.Drawing.Bitmap.FromFile("g.jpg");
                pictureBox.SizeMode = PictureBoxSizeMode.AutoSize;

                if (a == 1)
                {
                    pictureBox.MouseMove += new MouseEventHandler(this.MouseMove1);
                    pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick1);
                    pictureBox.MouseDown += new MouseEventHandler(this.MouseDown1);
                    pictureBox.MouseUp += new MouseEventHandler(this.MouseUp1);
                }
                if (a == 2)
                {
                    pictureBox.MouseMove += new MouseEventHandler(this.MouseMove2);
                    pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick2);
                    pictureBox.MouseDown += new MouseEventHandler(this.MouseDown2);
                    pictureBox.MouseUp += new MouseEventHandler(this.MouseUp2);
                }

                
            }
        }
0
adams85 napisał(a)

ustalmy, że masz liste List<string> figury;w której trzymasz elementy przeczytane z pliku (koło, kwadrat i trojkąt). Jak rozumiem kolejność elementów wcale nie musi być taka jak opisałeś. Więć twoje zadanie polega na tym, żeby przelecieć w pętli wszytstkie elementy z listy, stworzyć odpowiednią ilość pictureboxów i dla każdego przypisać odpowiedni obrazek oraz event. Więc może to wyglądać tak:

 
....
        case "trojkat":
            pictureBox.Image = System.Drawing.Bitmap.FromFile("trojkat.jpg");
            pictureBox.MouseDoubleClick += new MouseEventHandler(this.KoloMouseDoubleClick);
            break;
    }                   
    
}

ooo nie zauważyłem tego postu wcześniej, dzięki.
bardzo fajny i przydatny.
Jestem już poziom wyżej i walczę z przesunięciami kontrolek. :)

0

Najlepiej będzie jak pozmieniasz we wszystkich metodach, które podpinasz do eventów nazwy pictureboxów na (picturebox)sender. Sender to obiekt, który zgłasza żądanie, w przypadku klikania, przesuwania itd jest to twój picturebox, ale żeby wykorzystać metody i właściwości pictureboxa musisz zrzutować typ object na pictureBox.
W ogóle to się zastanawiam czy cokolwiek z tych metod działa, bo jak piszesz picturebox.Location, a tworzysz pictureboxy o nazwach nowy+licznik, to powinieneś sie do nich odwoływać nowy1.Location. W wyżej opisany sposób możesz ominąć zgodność nazw i posługiwać się konkretnym obiektem, który wywołał event. Robisz to np tak:

 
private void MouseDown2(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;
            m_lastLocation2 = ((pictureBox)sender).Location;//podwojny nawias
            // original location of the window in Parent coordinates
            m_mouseDownHere2.X = e.X;  // child window coordinates of the mouse
            m_mouseDownHere2.Y = e.Y;

        }
0
adams85 napisał(a)

Najlepiej będzie jak pozmieniasz we wszystkich metodach, które podpinasz do eventów nazwy pictureboxów na (picturebox)sender. Sender to obiekt, który zgłasza żądanie, w przypadku klikania, przesuwania itd jest to twój picturebox, ale żeby wykorzystać metody i właściwości pictureboxa musisz zrzutować typ object na pictureBox.
W ogóle to się zastanawiam czy cokolwiek z tych metod działa, bo jak piszesz picturebox.Location, a tworzysz pictureboxy o nazwach nowy+licznik, to powinieneś sie do nich odwoływać nowy1.Location. W wyżej opisany sposób możesz ominąć zgodność nazw i posługiwać się konkretnym obiektem, który wywołał event. Robisz to np tak:

 
private void MouseDown2(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;
            m_lastLocation2 = ((pictureBox)sender).Location;//podwojny nawias
            // original location of the window in Parent coordinates
            m_mouseDownHere2.X = e.X;  // child window coordinates of the mouse
            m_mouseDownHere2.Y = e.Y;

        }

zmieniając na w/w kod program zgłasza " is a 'field' but is used like a 'type'".

0

PictureBox z dużej litery;]

0

hehehe ale dałem. kod działa. dziękuję bardzo z poświęcony czas.
Następny etap to łączenie liniami tychże kontrolek i zapis tego, ale to już nie dzisiaj.
Wklejam poprawiony i działający kod dla zainteresowanych.

 
        private Point m_mouseDownHere1, m_lastLocation1;
        private Point m_mouseDownHere2, m_lastLocation2;

        private void MouseDoubleClick1(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click! 1");//czy cokolwiek innego co chcesz zrobic
        }
        private void MouseDoubleClick2(Object sender, MouseEventArgs e)
        {
            MessageBox.Show("Click! 2");//czy cokolwiek innego co chcesz zrobic
        }

        private void MouseDown1(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;
            m_lastLocation1 = ((PictureBox)sender).Location;
            // original location of the window in Parent coordinates
            m_mouseDownHere1.X = e.X;  // child window coordinates of the mouse
            m_mouseDownHere1.Y = e.Y;

        }

        private void MouseMove1(object sender, MouseEventArgs e)
        {
            if (((PictureBox)sender).Capture == false)
                return;
            ((PictureBox)sender).Location = new Point(m_lastLocation1.X + e.X - m_mouseDownHere1.X, m_lastLocation1.Y + e.Y - m_mouseDownHere1.Y);
            m_lastLocation1 = ((PictureBox)sender).Location;

        }

        private void MouseUp1(object sender, MouseEventArgs e)
        {
            ((PictureBox)sender).Location = new Point(m_lastLocation1.X + e.X - m_mouseDownHere1.X, m_lastLocation1.Y + e.Y - m_mouseDownHere1.Y);
        }

        private void MouseDown2(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
                return;
            m_lastLocation2 = ((PictureBox)sender).Location;//podwojny nawias
            // original location of the window in Parent coordinates
            m_mouseDownHere2.X = e.X;  // child window coordinates of the mouse
            m_mouseDownHere2.Y = e.Y;
        }

        private void MouseMove2(object sender, MouseEventArgs e)
        {
            if (((PictureBox)sender).Capture == false)
                return;
            ((PictureBox)sender).Location = new Point(m_lastLocation2.X + e.X - m_mouseDownHere2.X, m_lastLocation2.Y + e.Y - m_mouseDownHere2.Y);
            m_lastLocation2 = ((PictureBox)sender).Location;

        }

        private void MouseUp2(object sender, MouseEventArgs e)
        {
            ((PictureBox)sender).Location = new Point(m_lastLocation2.X + e.X - m_mouseDownHere2.X, m_lastLocation2.Y + e.Y - m_mouseDownHere2.Y);
        }

        private PictureBox pictureBox;

        private void button1_Click(object sender, EventArgs e)
        {
            
            for (int a = 1; a <= 2; a++)
            {
                pictureBox = new PictureBox();
                pictureBox.Name = "nowy"+a.ToString();
                pictureBox.Parent = panel1;
                pictureBox.Visible = true;
                pictureBox.Left = 10 + (a*32);
                pictureBox.Top = 30;
                pictureBox.Image = System.Drawing.Bitmap.FromFile("g.jpg");
                pictureBox.SizeMode = PictureBoxSizeMode.AutoSize;

                if (a == 1)
                {
                    pictureBox.MouseMove += new MouseEventHandler(this.MouseMove1);
                    pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick1);
                    pictureBox.MouseDown += new MouseEventHandler(this.MouseDown1);
                    pictureBox.MouseUp += new MouseEventHandler(this.MouseUp1);
                }
                if (a == 2)
                {
                    pictureBox.MouseMove += new MouseEventHandler(this.MouseMove2);
                    pictureBox.MouseDoubleClick += new MouseEventHandler(this.MouseDoubleClick2);
                    pictureBox.MouseDown += new MouseEventHandler(this.MouseDown2);
                    pictureBox.MouseUp += new MouseEventHandler(this.MouseUp2);
                }

                
            }
        }
0

Jak obiecałem, zrobiłem łączenie elementów liniami na dwa sposoby.
Oto eventy:

 
        private int poz = 0;
        private Point p1 = new Point();
        private Point p2 = new Point(); 

        private void MouseDoubleClick1(Object sender, MouseEventArgs e)
        {
            poz = poz + 1;
            //Graphics grx = panel1.CreateGraphics();
            if (poz == 1)
            {
                p1 = new Point(m_lastLocation1.X, m_lastLocation1.Y);
            }
            if (poz == 2)
            {
                p2 = new Point(m_lastLocation1.X, m_lastLocation1.Y);
                poz = 0;

                //sposób pierwszy
                //Pen d = new Pen(Color.Red, 2);
                //d.DashStyle = DashStyle.Dot; //linia przerywana
                //grx.DrawLine(d, p1, p2);

                //sposób drugi bardziej elegancki :)
                ShapeContainer canvas = new ShapeContainer(); 
                LineShape theLine = new LineShape();

                canvas.Parent = panel1;
                theLine.Parent = canvas;
                theLine.StartPoint = p1;
                theLine.EndPoint = p2;
                
            }
        }

        private void MouseDoubleClick2(Object sender, MouseEventArgs e)
        {
            poz = poz + 1;
            //Graphics grx = panel1.CreateGraphics();
            if (poz == 1)
            {
                p1 = new Point(m_lastLocation2.X, m_lastLocation2.Y);
            }
            if (poz == 2)
            {
                p2 = new Point(m_lastLocation2.X, m_lastLocation2.Y);
                poz = 0;

                //sposób pierwszy
                //Pen d = new Pen(Color.Red, 2);
                //d.DashStyle = DashStyle.Dot; //linia przerywana
                //grx.DrawLine(d, p1, p2);

                //sposób drugi bardziej elegancki :)
                ShapeContainer canvas = new ShapeContainer();
                LineShape theLine = new LineShape();

                canvas.Parent = panel1;
                theLine.Parent = canvas;
                theLine.StartPoint = p1;
                theLine.EndPoint = p2;
            }
        }

Zastanawiam się jak rozwiązać temat przenoszenia kontrolek razem z połączeniami linii? Czyli połączyłem linią koło z kwadratem i przesuwam kwadrat lub koło w inne miejsce zachowując połączenie między nimi.
Mam wizję ;) jak to zrobić tylko nie wiem czy to dobre rozwiązanie. Wymyśliłem, że użyję Timer-a i tablicy w której będą pamiętane połączenia. W czasie przesuwania obiektu połączenia p1 i p2 będą korygowane.

Oczywiście chętnie wysłucham innych propozycji albo nawet gotowego rozwiązania. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1