У меня есть программа Winform, которая выполняет некоторые вычисления, когда пользователь нажимает на кнопку, а затем вызывает событие paintbox для рисования нового BMP на основе результатов расчеты. Это прекрасно работает.Текст метки не обновляется до тех пор, пока весь цикл не будет завершен.
Теперь я хочу сделать это в 100 раз, и каждый раз, когда PictureBox обновляется, я хочу видеть итерацию, что это в настоящее время, обновляя текст на этикетке в соответствии с ниже:
private void button2_Click(object sender, EventArgs e)
{
for (int iterations = 1; iterations <= 100; iterations++)
{
// do some calculations to change the cellmap parameters
cellMap.Calculate();
// Refresh picturebox1
pictureBox1.Invalidate();
pictureBox1.Update();
// Update label with the current iteration number
label1.Text = iterations.ToString();
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Bitmap bmp = new Bitmap(cellMap.Dimensions.Width, cellMap.Dimensions.Height);
Graphics gBmp = Graphics.FromImage(bmp);
int rectWidth = scaleFactor;
int rectHeight = scaleFactor;
// Create solid brushes
Brush blueBrush = new SolidBrush(Color.Blue);
Brush greenBrush = new SolidBrush(Color.Green);
Brush transparentBrush = new SolidBrush(Color.Transparent);
Graphics g = e.Graphics;
for (int i = 0; i < cellMap.Dimensions.Width; i++)
{
for (int j = 0; j < cellMap.Dimensions.Height; j++)
{
// retrieve the rectangle and draw it
Brush whichBrush;
if (cellMap.GetCell(i, j).CurrentState == CellState.State1)
{
whichBrush = blueBrush;
}
else if (cellMap.GetCell(i, j).CurrentState == CellState.State2)
{
whichBrush = greenBrush;
}
else
{
whichBrush = transparentBrush;
}
// draw rectangle to bmp
gBmp.FillRectangle(whichBrush, i, j, 1f, 1f);
}
}
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
g.DrawImage(bmp, 0, 0, pictureBox1.Width, pictureBox1.Height);
}
Проблема У меня есть то, что текст ярлыка будет отображаться только после завершения последнего обновления. По существу, он не отображает от 1 до 99. Я могу видеть обновления ящика после каждого обновления, поскольку BMP изменяется с каждой итерацией. Есть идеи?
Вы пытались вызвать 'label1.Invalidate();' или/и 'label1.Update();' после изменения текста? – horgh
Нет, но после добавления этих двух утверждений он начал работать. Однако я не понимаю, почему? – deutschZuid
Попробуйте прочитать этот [Method.Update Method] (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.update.aspx) – horgh