2014-02-06 138 views
0
private void button1_Click(object sender, EventArgs e) 
{ 
    button1.Enabled = false; 
    string IDs = ID.Text; 
    string[] eachIDs = Regex.Split(IDs, "\n"); 
    foreach (var eachID in eachIDs) 
    { 
     getContent(eachID); 
     titleBox.Text = "Done"; 
    } 
} 
private void getContent(string value) 
{ 
    label1.Text = value; 
    Thread.Sleep(5000); 
} 

爲Input說「IDNUMBER01,IDNUMBER02,IDNUMBER03,IDNUMBER04」每一個在豐富的文本框中輸入新線我會給4組的ID。顯示當前變量值,而循環

該代碼成功拆分它們。我想在標籤文本中顯示在當前循環中使用的ID的值。

問題,我的代碼是隻顯示最後一個ID它穿過環。

回答

1

這是因爲UI是這段代碼的執行之後才更新的,因爲他們正在執行在同一個線程中。您將需要打開一個線程,運行此代碼並調用分派器(或者如果此應用程序爲Winforms,則爲Control.BeginInvoke)來更新UI。

編輯

試試這個:

private void button1_Click(object sender, EventArgs e) 
{ 
    button1.Enabled = false; 
    string IDs = ID.Text; 
    new System.Threading.Thread(() => 
    { 
     string[] eachIDs = Regex.Split(IDs, "\n"); 
     foreach (var eachID in eachIDs) 
     { 
      getContent(eachID);    
      titleBox.BeginInvoke((Action) delegate { titleBox.Text = "Done"; }); 
     } 
    }).Start(); 
} 

private void getContent(string value) 
{ 
    label1.BeginInvoke((Action) delegate { label1.Text = value; });   
    Thread.Sleep(5000); 
} 
+0

但我有問題 它顯示 「跨線程操作無效:從其創建的線程以外的線程訪問控制'ID'」。 當我嘗試調試 – harishannam

+0

它顯示了這兩個行了同樣的問題,而調試「button1.Enabled = FALSE; 字符串ID = ID.Text;」 – harishannam

+0

此外richTextbox只有一個完成即使我傳遞三個ID到他們 – harishannam

2

可能是你UI凍結,你不能看到這changes.Try,使用async/await功能:

private async void button1_Click(object sender, EventArgs e) 
{ 
    button1.Enabled = false; 
    string IDs = ID.Text; 
    string[] eachIDs = Regex.Split(IDs, "\n"); 
    foreach (var eachID in eachIDs) 
    { 
     await getContent(eachID); 
     titleBox.Text = "Done"; 
    } 
} 
private async Task getContent(string value) 
{ 
    label1.Text = value; 
    await Task.Delay(5000); 
} 
+0

你和@Guilherme解決方案都可以工作。我想知道線程更好還是等待功能更好。你可以請建議。 – harishannam

+0

等待只適用於.Net框架4.5(與Windows XP不兼容) – Guilherme

+0

兩者幾乎具有相同的性能,並且幾乎以相同的方式工作,但線程是手動的,等待是自動的(較少的代碼)。 – Guilherme

0

在你的榜樣,你最好使用一個計時器,以顯示你的價值的文字。你只看到最後一個ID,因爲循環執行得非常快,並且在foreach中使用Thread.Sleep不會飛。 您可以在Thread.Sleep之前使用Application.DoEvents(),但計時器仍然是您更好的選擇... imho。