Текст метки C # не обновляется - PullRequest
11 голосов
/ 15 апреля 2011

У меня есть следующий код:

private void button1_Click(object sender, EventArgs e)
{
  var answer =
    MessageBox.Show(
      "Do you wish to submit checked items to the ACH bank? \r\n\r\nOnly the items that are checked and have the status 'Entered' will be submitted.",
      "Submit",
      MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question,
      MessageBoxDefaultButton.Button1);

  if (answer != DialogResult.Yes)
    return;

  button1.Enabled = false;
  progressBar1.Maximum = dataGridView1.Rows.Count;
  progressBar1.Minimum = 0;
  progressBar1.Value = 0;
  progressBar1.Step = 1;

  foreach (DataGridViewRow row in dataGridView1.Rows)
  {
    if ((string) row.Cells["Status"].Value == "Entered")
    {
      progressBar1.PerformStep();

      label_Message.Text = @"Sending " + row.Cells["Name"].Value + @" for $" + row.Cells["CheckAmount"].Value + @" to the bank.";
      Thread.Sleep(2000);
    }
  }
  label_Message.Text = @"Complete.";
  button1.Enabled = true;
}

Это тест, который я создаю для переноса на мое приложение.Все работает нормально, но установлен label_Message.text.Это никогда не появляется на экране.Это устанавливается, я сделал console.write на нем, чтобы проверить.Это просто не обновляет экран.В конце я также получаю «Complete».

У кого-нибудь есть идеи?

Ответы [ 5 ]

21 голосов
/ 15 апреля 2011

Вы выполняете длительную операцию в потоке пользовательского интерфейса. Вы должны переместить его в фоновый поток (например, через BackgroundWorker), чтобы поток пользовательского интерфейса мог, например, перекрашивать экран при необходимости. Вы можете обмануть и выполнить Application.DoEvents, но я действительно рекомендую против этого.

Этот вопрос и ответ в основном то, что вы спрашиваете:
Форма не отвечает, когда любая другая операция выполняется в C #

17 голосов
/ 08 октября 2014

use Label.Refresh ();это экономит много времени. Это должно работать для вас

2 голосов
/ 15 апреля 2011

Метка не перерисовывается, пока вы не вернете поток пользовательского интерфейса обратно в цикл сообщений. Попробуйте Label.Refresh или, что еще лучше, попробуйте поместить длительную операцию в фоновый поток, как предлагали другие авторы.

1 голос
/ 15 апреля 2011

Эта операция выполняется в потоке пользовательского интерфейса.UI не будет обновляться, пока не закончится.Для обновления во время отправки вы должны выполнить отправку в отдельном потоке и оттуда обновить ярлык

0 голосов
/ 15 апреля 2011

Обычно это происходит, когда вы выполняете интенсивные вычисления / итерации в том же потоке, где работают элементы пользовательского интерфейса.Чтобы обойти это, вам понадобится отдельный поток, выполняющий эту работу, и соответственно обновите значение метки.Я бы опубликовал полный исходный пример, но сейчас я не в сети.

...