2013-08-30 5 views
5

Oluşturmaya çalıştığım yakın üretim kalitesinde bir uygulama için C# win32 formuna dinamik olarak resim kutuları eklemeye çalışıyorum ve hemen hemen onu aldım.Düğme tıklatmayla dinamik olarak nasıl üretilir?

Karşılaştığım sorun, bir yöntemde dinamik olarak formdaki resim kutularını veya denetimlerini ekleyemiyorum. Form1 başlatma yöntemi ile bunları forma ekledim, ancak bir button_click yönteminde denetimleri eklerseniz, bir panel kapsayıcım olmadığı sürece bunları eklemez ve panel1.Controls.Add (stuff) yazın . Ancak, daha sonra, resim kutusu, amaçlanandan tamamen farklı bir yerde görünür ve görünüşe göre, panelin kendisi tarafından engellenir. Resim kutusunun çoğu panel tarafından engellenir ve bir kısmı da panel dışıdır. Ne olup bittiği hakkında bir fikrim yok. Ben çalıştığınızda şey açılır gördüğüm

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 bir çalışma doku geçerli: Burada

ben bir düğme tıklama yönteminde, PictureBoxes eklemek için çevrimiçi öğrendim kullanıyorum kodu Form1'in yönteminde bir resim kutusu yapmak, bu yüzden sorun değil. Ben Form1 yöntemiyle doğrudan

PictureBox pb = new PictureBox(); 

kodu kopyalayıp başardı ve gayet güzel infaz beri sorun, benim dizimi olmak -appear- etmez.

Google aracılığıyla çevrimiçi bir şey bulamıyorum ve bu bana tamamen şaşırdı.

+1

İkinci 'InitializeComponent();' for' döngüsünün içindeki çağrıyı kaldırın. – keyboardP

+2

Ve kaldır pbName [i] .Parent = bu; ' –

+0

@keyboardP Hiçbir zar, aynı sonuç. Birkaç kez orada olmasının tek sebebi, onu resim kutularını başlatmaya çalışıyorum çünkü; ama döngüdeki bir şeyi çıkarmak hiçbir şey yapmadı, aynı sonuç. Düğme tıklandığında hiçbir şey görünmez. – Codefun64

cevap

2

O winform kendisi kadar büyüktü, sorun programı için arka plan görüntüsü olarak davranan bir picturebox vardı yani çıkıyor. Resim kutusu programlı olarak oluşturulan tüm kontrolleri bloke etti, böylece kodun hiçbir şey yapmadan yanılsamasını sağladı.

5

Bu kod size konsept kazandırmanıza yardımcı olabilir: Flowlayoutpanel'de resim kutusu, metin kutusu ve dinamik olarak düğme oluşturmak için çalışıyorum.

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

Üzgünüm, ama bu bana hiç yardımcı olmadı; Kodumda bir yöntemle dinamik olarak yapılmış bir akış panelini kullanmayı denedim, ancak yine de ekranımda hiçbir şey görünmüyor. Lanetlenmiş gibiyim. – Codefun64