2013-08-30 7 views
5

Próbuję dynamicznie dodawać skrzynki obrazków do formularza C# win32 dla aplikacji o niemalże produkcyjnej jakości, którą próbuję budować, i mam ją prawie całkowicie.Jak dynamicznie tworzyć obrazki, klikając przycisk?

Problem, na który napotykam, polega na tym, że nie mogę dodawać do niego obrazków ani formantów dynamicznie, w metodzie. Dodałem je do formularza za pomocą metody inicjowania Form1, ale jeśli dodaję formanty w, powiedzmy, metodzie button_click, to po prostu nie dodaje ich, chyba że mam kontener panelu, i wpisz panel1.Controls.Add (stuff) . Ale wtedy obrazek pojawia się w zupełnie innym miejscu niż zamierzano - i zablokowany przez, jak widać, sam panel. Większość ramek graficznych jest blokowana przez panel, a jego część - na zewnątrz - panel. Nie mam pojęcia, co się dzieje.

Oto kod używam, że dowiedziałem się online, aby dodać pictureboxes w sposobie przycisk kliknij:

PictureBox pb = new PictureBox(); 
     pb.Size = new Size(this.Size.Width/14, this.Size.Width/12); //I use this picturebox simply to debug and see if I can create a single picturebox, and that way I can tell if something goes wrong with my array of pictureboxes. Thus far however, neither are working. 
     pb.BackgroundImage = Properties.Resources.cardback; 
     pb.BackgroundImageLayout = ImageLayout.Stretch; 
     pb.Location = new Point(50, 50); 
     pb.Anchor = AnchorStyles.Left; 
     pb.Visible = true; 
     InitializeComponent(); 
     this.Controls.Add(pb); 
     PictureBox[] pbName = new PictureBox[totaldeckcount]; 
     for (int i = 0; i < totaldeckcount; i++) 
     { 
      pbName[i] = new PictureBox(); 
      pbName[i].Size = new Size(this.Size.Width/14, this.Size.Width/12); 
      pbName[i].BackgroundImage = Properties.Resources.cardback; 
      pbName[i].BackgroundImageLayout = ImageLayout.Stretch; 
      pbName[i].Image = Properties.Resources.cardback; 
      pbName[i].Anchor = AnchorStyles.Left; 
      pbName[i].Visible = true; 
      int x = 0; 
      int y = 15; 
      if (i > 10) 
      { 
       y += (int)((this.Size.Height * i) + 30); 
      } 
      x = (int)((this.Size.Width/12) * Math.IEEERemainder(i, 10)); 
      pbName[i].Location = new Point(x, y); 
      this.Controls.Add(pbName[i]); 
     } 

Cardback jest struktura pracy, widziałem rzeczą pojawiają się przy próbie tworzenie ramki obrazka w metodzie Form1, więc to nie problem. Problem nie -appear- być moim składnia, ponieważ udało mi się skopiować kod

PictureBox pb = new PictureBox(); 

bezpośrednio do metody Form1 i wykonany dobrze.

Nie mogę znaleźć niczego w Internecie za pośrednictwem Google, a to mnie całkowicie zepsuło.

+1

Usuń drugie wywołanie 'InitializeComponent();', które znajduje się wewnątrz pętli 'for'. – keyboardP

+2

I usuń 'pbName [i] .Parent = this;' –

+0

@keyboardP Bez kości, ten sam wynik. Jedynym powodem, dla którego jest tam kilka razy, jest to, że próbowałem go zainicjować, to haha; ale usunięcie tego w pętli nic nie dało, ten sam wynik. Nic nie pojawia się na kliknięciu przycisku. – Codefun64

Odpowiedz

2

Okazuje się, że problem jest, że nie było PictureBox działając jako tła dla programu, który był prawie tak duży jak sam winform. Obrazek zablokował wszystkie kontrolki, które zostały utworzone programowo, dając iluzję, że kod nic nie robi.

5

Ten kod pomoże ci uzyskać pojęcie: To jest ten, nad którym pracuję, aby dynamicznie tworzyć pole graficzne, pole tekstowe i przycisk na panelu flowlayoutpanel.

PictureBox[] pics = new PictureBox[50]; 
    TextBox[] txts = new TextBox[50]; 
    Button[] butns = new Button[50]; 
    FlowLayoutPanel[] flws = new FlowLayoutPanel[50] 
    static int brh =0; 


    for (int i = 0; i < totalnumbers; i++) 
     { 
      flws[i] = new FlowLayoutPanel(); 
      flws[i].Name = "flw" + i; 
      flws[i].Location = new Point(3,brh); 
      flws[i].Size = new Size(317,122); 
      flws[i].BackColor = Color.DarkCyan; 
      flws[i].BorderStyle = BorderStyle.Fixed3D; 
      flws[i].Disposed += Form1_Disposed;    
      flws[i].Click += new EventHandler(butns_Click); 

      pics[i] = new PictureBox(); 
      pics[i].Location = new Point(953, 95 + brh); 
      pics[i].Name = "pic" + i; 
      pics[i].Size = new Size(300, 75); 
      pics[i].ImageLocation = "E:/image"+i; 
      flws[i].Controls.Add(pics[i]); 

      txts[i] = new TextBox(); 
      txts[i].Name = "txt" + i; 
      txts[i].Location = new Point(953, 186 + brh); 
      txts[i].TextChanged += Form1_TextChanged; 
      flws[i].Controls.Add(txts[i]); 

      butns[i] = new Button(); 
      butns[i].Click += new EventHandler(butns_Click); 
      butns[i].Text = "submit"; 
      butns[i].Name = "but" + i; 
      butns[i].Location = new Point(1100, 186 + brh); 

      flws[i].Controls.Add(butns[i]); 
      this.Controls.Add(flws[i]); 
      flowLayoutPanel1.Controls.Add(flws[i]); 
      brh += 130; 
     } 


private void butns_Click(object sender, EventArgs e) 
    { 
     // you can add the procces to perform after dynamically created button pressed 
    } 
+0

Przepraszam, ale to mi nie pomogło; Próbowałem użyć panelu flowlayout wykonanego dynamicznie w metodzie w moim kodzie, ale wciąż nic nie pojawia się na moim ekranie. To tak, jakbym był przeklęty. – Codefun64