0

Пожалуйста, посмотрите на следующий кодНевозможно обновить метку в окне запроса

private Label textLabel; 

public void ShowDialog() 
     { 
      Form prompt = new Form(); 
      prompt.Width = 500; 
      prompt.Height = 150; 
      prompt.Text = caption; 
      textLabel = new Label() { Left = 50, Top=20, Text="txt"}; 
      TextBox textBox = new TextBox() { Left = 50, Top=50, Width=400 }; 
      Button confirmation = new Button() { Text = "Ok", Left=350, Width=100, Top=70 }; 
      confirmation.Click += (sender, e) => { prompt.Close(); }; 
      prompt.Controls.Add(confirmation); 
      prompt.Controls.Add(textLabel); 
      prompt.Controls.Add(textBox); 
      prompt.ShowDialog(); 
     } 

Я звоню выше метод, используя другой метод и пытается обновить textLabel поле внутри цикла, как этот

public void doIt() 
    { 
     ShowDialog(); 

     for(int i=0;i<10;i++) 
     { 
     textLabel.TEXT = ""+i; 

     Threading.Thread.Sleep(1000); 
     } 

    } 

Так мы работаем на Java, но в C# я не смог обновить текст ярлыков таким образом. Что здесь не так, и почему я не могу обновить текст? Пожалуйста помоги.

+2

ShowDialog() является модальным, поэтому он блокирует выполнение кода до тех пор, пока форма не будет закрыта. Я бы использовал таймер вместо ... для цикла/сна. – LarsTech

+1

... или BackgroundWorker, в дополнении, textLabel недоступен (вне сферы действия) в методе doIt –

+0

@NikolaDavidovic: Он определяется как глобальная переменная –

ответ

4

Так вот как я бы это сделать, это не полное решение, но я надеюсь, что он будет указывать вам в правильном направлении:

Сделать Prompt класс, который выводит из формы. Добавьте к нему элементы управления (я сделал это вручную, но вы можете использовать конструктор). Добавьте Timer, который будет срабатывать каждую секунду и который изменит текст метки. Когда счетчик достигает 10, остановите таймер.

public partial class Prompt : Form 
{ 
     Timer timer; 
     Label textLabel; 
     TextBox textBox; 
     Button confirmation; 
     int count = 0; 
     public Prompt() 
     { 
      InitializeComponent(); 
      this.Load += Prompt_Load; 
      this.Width = 500; 
      this.Height = 150; 
      textLabel = new Label() { Left = 50, Top = 20, Text = "txt" }; 
      textBox = new TextBox() { Left = 50, Top = 50, Width = 400 }; 
      confirmation = new Button() { Text = "Ok", Left = 350, Width = 100, Top = 70 }; 
      this.Controls.Add(confirmation); 
      this.Controls.Add(textLabel); 
      this.Controls.Add(textBox); 
      timer = new Timer(); 
      timer.Interval = 1000; 
      timer.Tick += timer_Tick; 
     } 

     void Prompt_Load(object sender, EventArgs e) 
     { 
      timer.Start(); 
     } 

     void timer_Tick(object sender, EventArgs e) 
     { 
      this.textLabel.Text = " " + count.ToString(); 
      count++; 
      if (count == 10) 
       timer.Stop(); 
     } 
} 

В методе doIt создайте экземпляр вашего Prompt формы, установите его подпись и вызвать его метод ShowDialog().

public void doIt() 
{ 
    Prompt p = new Prompt(); 
    p.Text = caption; 
    p.ShowDialog(); 

} 
+0

Извините за задержку. Я действительно ценю твою помощь. Спасибо :) –