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(); 
     } 

我使用另一種方法調用上面的方法,並試圖更新這樣

public void doIt() 
    { 
     ShowDialog(); 

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

     Threading.Thread.Sleep(1000); 
     } 

    } 
一個循環內 textLabel

這就是我們在Java中的做法,但在C#中,我無法以這種方式更新標籤文本。這裏有什麼問題,爲什麼我不能更新文本?請幫忙。

+2

ShowDialog()是模態的,所以它阻止了代碼的運行,直到窗體關閉。我會使用計時器而不是for ...循環/睡眠。 – LarsTech

+1

...或BackgroundWorker,在adition中,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

抱歉,延遲。我非常感謝你的幫助。謝謝 :) –