2013-08-30 67 views
5

我試圖動態地將pictureboxes添加到C#win32窗體中,用於生產質量近乎適中的應用程序,我試圖構建它,並且我已經將它變得非常糟糕。如何通過按鈕點擊動態生成圖片框?

我遇到的問題是,我似乎無法動態地在方法中添加picturebox或控件到窗體。我已經通過Form1初始化方法將它們添加到窗體中,但是如果我在button_click方法中添加控件,它不會添加它們,除非我有面板容器,並且鍵入panel1.Controls.Add(stuff) 。但是,然後這個圖片盒出現在一個完全不同於預期的位置 - 顯然,它被面板本身擋住了。大多數的圖畫框都被面板阻擋,其中一部分是面板外側。我不知道發生了什麼事。

下面是我使用,我學會了在網上添加pictureboxes,在點擊一個按鈕方法的代碼:

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是一個工作的質感,我見過的東西彈出當我嘗試用Form1的方法制作一個picturebox,所以這不是問題。該問題不會-appear-是我的語法,因爲我能夠給

PictureBox pb = new PictureBox(); 

代碼直接複製到Form1的方法,它執行就好了。

我在網上找不到任何東西,這讓我完全陷入困境。

+1

刪除'for'循環中的第二個'InitializeComponent();'調用。 – keyboardP

+2

並刪除'pbName [i] .Parent = this;' –

+0

@keyboardP沒有骰子,結果相同。它在那裏幾次的唯一原因是因爲我試圖讓它初始化pictureboxes,哈哈;但刪除循環中的一個沒有任何結果。按鈕點擊沒有顯示。 – Codefun64

回答

2

事實證明,問題是,有作爲該計劃的背景圖像一個圖片,這是幾乎在WinForm本身一樣大。 picturebox屏蔽了所有以編程方式創建的控件,從而讓代碼無所作爲。

5

這段代碼可以幫助您獲得概念: 這是我正在爲在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

對不起,但這並沒有幫助我;我嘗試使用在我的代碼中的方法中動態製作的流佈局面板,但仍然沒有出現在我的屏幕上。這就像我被詛咒。 – Codefun64