PaintEventHandler логическая проблема - PullRequest
1 голос
/ 15 июня 2010

Я создаю несколько коробок с изображениями динамически, затем присваиваю следующее:

// class variable
public String PaintLabel;

// private void Form2_Load(object sender, EventArgs e)

//begin loop
this.PaintLabel = serialno;
Shapes[i].Paint += new PaintEventHandler(ctl_Paint);
// end loop

// my event override
private void ctl_Paint(object sender, PaintEventArgs e)
{
    Control tmp = (Control)sender;

    using (Font myFont = new Font("Arial", 9, FontStyle.Bold))
    {
        e.Graphics.DrawString(this.PaintLabel, myFont, Brushes.LightYellow, new Point(62, 2));
    } // using (Font myFont = new Font("Arial", 10))
} // private void ctl_Paint(object sender, EventArgs e)

Предполагается создать коробки с рисунками и написать разные серийные номера на каждой из них.Но в итоге пишется последний серийный номер, найденный на всех графических полях

РЕДАКТИРОВАТЬ:

Хорошо, ваше решение для меня очень продвинуто.Но я пытался это понять.

Я добавил ваш кусок кода в мой.

Затем изменил массив моего графического блока следующим образом

MyControl[] Shapes = new MyControl[Num_Picbox];

В моем циклеЗатем я сделал следующее:

Shapes[i].SerialNumber = serialno;
Shapes[i].Paint += new PaintEventHandler(ctl_Paint);

Но когда я компилирую и запускаю код, он не рисует серийный номер на картиночной коробке.

РАЗРЕШЕНИЕ:

Спасибо за всетвоя помощь.Я изменил ваш

var PaintLabels = new Dictionary<Control, string>();

на

Dictionary<Control, string> PaintLabels = new Dictionary<Control, string>();

Что бы разобраться, событие рисования не смогло увидеть локальную переменную.

1 Ответ

1 голос
/ 15 июня 2010

Это потому, что вы внутри цикла снова и снова используете строковое поле, обновляя его значение, пока цикл не будет завершен, когда последнее значение будет в поле:Одним из решений было бы преобразование PaintLabel в массив с таким количеством элементов, сколько есть фигур.Или, что еще проще, создайте Dictionary, который также содержит ссылку между фигурами и серийными номерами:

var PaintLabels = new Dictionary<Control, string>();

//begin loop
PaintLabels.Add(Shapes[i], serialno);
Shapes[i].Paint += new PaintEventHandler(ctl_Paint);
// end loop


// in the paint event
e.Graphics.DrawString(PaintLabel[tmp], myFont, Brushes.LightYellow, new Point(62, 2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...