2016-05-06 3 views
2

Я пытаюсь поместить текст от 0 до 11 на 12 картинок с изображением мяча, но получить текст 11 на всех.Напишите текст в массиве PictureBox

Как я могу получить текст на шарах от 0 до 11?

вот мой код:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
namespace wfballs2 
{ 
    public partial class Form1 : Form 
    { 
     String s; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      PictureBox[] Shapes = new PictureBox[12]; 
      for (int i = 0; i < 12; i++) 
      { 
       s = Convert.ToString(i); 
       Shapes[i] = new PictureBox(); 
       Shapes[i].Name = "ball" + i.ToString(); 
       Shapes[i].Location = new Point(10 + 45 * i, 300); 
       Shapes[i].Size = new Size(40, 40); 
       Shapes[i].Image = Image.FromFile(@ "C:\Users\Eiko\Desktop\ball\ball.jpg"); 
       Shapes[i].SizeMode = PictureBoxSizeMode.CenterImage; 
       Shapes[i].Visible = true; 
       this.Controls.Add(Shapes[i]); 
       Shapes[i].Paint += new PaintEventHandler((sender2, e2) => 
       { 
        e2.Graphics.DrawString(s, Font, Brushes.Black, 10, 13); 
       }); 
      } 
     } 
    } 
} 

ответ

1

Переменная s является экземпляром в вашей форме, поэтому его стоимость распределяется по форме, и все формы, которые Вы создаете.

Everytime один из вашей формы окрашена, этот код:

e2.Graphics.DrawString(s, Font, Brushes.Black, 10, 13); 

будет работать. То, что s является переменной экземпляра вашей Формы. Он покажет для всех фигур последнее значение, на которое оно было установлено. В вашем случае, что происходит на последней итерации вашего цикла for, следовательно, на 11.

Чтобы исправить это, вы должны захватить переменную цикла в локальной переменной перед анонимным обработчиком событий, а затем использовать этот локальный var для выполнения Convert.ToString(val) в обработчике события, например, так:

var val = i; // capture variable 
Shapes[i].Paint += new PaintEventHandler((sender2, e2) => 
{ 
     // use captured variable here 
     e2.Graphics.DrawString(Convert.ToString(val), Font, Brushes.Black, 10, 13); 
}); 

Это будет генерировать строку с локальной переменной на основе val.

+0

Кроме того, я стараюсь это, но тот же результат ...... спасибо U – ej8000

+0

Я забыл сказать, что текст стал 12 на всех шарах – ej8000

+0

@ ej8000 неподвижного захват переменной, это работает в моем местном тесте ... – rene

1
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
namespace wfballs2 
{ 
    public partial class Form1 : Form 
    { 

     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      int k = 0; 
      PictureBox[] Shapes = new PictureBox[12]; 
      for (int i = 0; i < 12; i++) 
      { 
       Shapes[i] = new PictureBox(); 
       Shapes[i].Name = "ball" + i.ToString(); 
       Shapes[i].Location = new Point(10 + 45 * i, 300); 
       Shapes[i].Size = new Size(40, 40); 
       Shapes[i].Image = Image.FromFile(@ "C:\Users\Eiko\Desktop\ball\ball.jpg"); 
       Shapes[i].SizeMode = PictureBoxSizeMode.CenterImage; 
       Shapes[i].Visible = true; 
       this.Controls.Add(Shapes[i]); 
       Shapes[i].Paint += new PaintEventHandler((sender2, e2) => 
       { 
        e2.Graphics.DrawString(k.ToString(), Font, Brushes.Black, 10, 13); 
        k++; 
       }); 
      } 
     } 
    } 
} 
+0

Я стараюсь это, но я получил те же приветов – ej8000

Смежные вопросы