2017-02-16 2 views
-2

У меня есть форма с меткой, а также внешний класс. В моем классе у меня есть цикл for от 1 до 1000. Как я могу показать значение от 1 до 1000 от моего класса до метки формы?C# - метка формы обновления из переменной цикла другого класса

//external class 

public class TestClass 
{ 
    public void myLoop() 
    { 
     for (int i = 1; i <= 1000; i++) 
     { 
      // show value of i to label 
     } 
    } 
} 
+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные сведения, чтобы точно указать, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. См. Страницу «Как спросить», чтобы помочь прояснить этот вопрос. –

+0

Как вы планируете использовать этот класс в форме? нужно показать номер 1 на 1 –

+0

Обновлено сообщение, я вызываю функцию myLoop в потоке и да, я хочу показать номер 1 на 1. – markandrewkato

ответ

1

Если у вас есть ссылка на форму как Form1, и что форма имеет ярлык с именем Label1, который является общественным/доступным для TestClass:

public class TestClass 
{ 
    public void myLoop() 
    { 
     for (int i = 1; i <= 1000; i++) 
     { 
      // show value of i to label 
      form1.label1.Text = i.ToString(); 
      // allow message pumping to redraw the label 
      Application.DoEvents(); 
      // pause long enough to see it before the next one happens 
      System.Threading.Thread.Sleep(100); 
     } 
    } 
} 

Я бы не рекомендовал использовать Application.DoEvents для нормального кода производства; но если вы используете поток пользовательского интерфейса и не используете асинхронный код, это будет «взломанный» способ получить все события оконных событий (в основном WM_PAINT, чтобы получить ярлык для перерисовки) во время цикла.

Лучший способ заключается в использовании события:

public class TestClass { 
    public class ProgressEventArgs : EventArgs { 
     public int Value { get; set; } 
    } 
    public event EventHandler<ProgressEventArgs> Progress; 
    public void myLoop() { 
     for (int i = 0; i <= 1000; ++i) { 
      var evt = Progress; 
      if (evt != null) { 
       evt.Invoke(this, new ProgressEventArgs() { Value = i; }); 
      } 
     } 
    } 
} 

и обрабатывать это событие в виде:

public class TestForm : Form { 
     private somevent_click(object sender, EventArgs evt) { 
      var test = new TestClass(); 
      test.Progress += test_Progress; 
      test.myLoop(); 
     } 
     private void test_Progress(object sender, TestClass.ProgressEventArgs evt) { 
      label1.Text = evt.Value; 
     } 
    } 

Заметим, что это будет происходить в том же потоке, поэтому в зависимости от того, что еще вы сделайте это в своем цикле, вы можете не получить пересылку сообщений. Вместо этого используйте фоновый поток или асинхронный код.

+0

Спасибо за ответ tim. Извините за плохой пост. Моя реальная цель - узнать, есть ли чистый способ доступа к переменной (обновляет в реальном времени, например, внутри цикла) из другого класса в мою форму. Я думаю, что ваш ответ прав, но я думаю, что есть способ не вызвать определенный элемент управления внутри класса. Как передать управление функции? – markandrewkato

+0

Вышеупомянутый вопрос о самом худшем способе решения проблемы. Это достаточно плохо, чтобы предложить сочетание «TestClass» с формой вместо использования комбинации событий/свойств, но затем добавить вызовы к «Application.DoEvents()» и «Thread.Sleep()», ни одна из которых не принадлежит ни одному из них настоящий код, абсолютно безответственный. Хуже того, из текста ясно, что автор этого ответа _knows_ эти вещи плохие. –

+0

Правильный способ сделать это - вывести событие из своего класса и получить его уловить и обновить. – Tim

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