2015-08-17 101 views
-1

如果我有一個窗體Form1我只是想知道的進度條,並宣佈使用一個窗口形成遞增另一種形式

public partial class Form1 : Form 
{ 
    GraphLoadProgress loadProgress; 

    public Form1() 
    { 
     loadProgress = new GraphLoadProgress(); 
     loadProgress.Show(); 
     // do some stuff 
     loadProgress.progress = 25; // increment by 25% 
     // more stuff 
     for (int i = 0; i < 65; i++) // increment by 65% 
     { 
     loadProgress.progress = 1; 
     } 
     // even more stuff 
     loadProgress.progress = 10; // increment by 10% 

     // blah blah 
     loadProgress.progress = 100; // make sure it goes over 100% 
    } 
} 

,並在我的GraphLoadProgress形式以下

public partial class GraphLoadProgress : Form 
{ 
    public int progress { get; set; } 

    private void StartBackgroundWork() 
    { 
     if (Application.RenderWithVisualStyles) 
      progressBar.Style = ProgressBarStyle.Marquee; 
     else 
     { 
      progressBar.Style = ProgressBarStyle.Continuous; 
      progressBar.Maximum = 100; 
      progressBar.Value = 0; 
      timer1.Enabled = true; 
     } 
     //backgroundWorker.RunWorkerAsync(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (progressBar.Value > progressBar.Maximum) 
      this.Close(); 
     progressBar.Increment(progress); 
    } 
} 

這顯然不工作,因爲計時器將更新和增量,即使我不想要它,有沒有什麼辦法增加進度條,並且只在進度條仍在更新時增加一定量?

+0

友好親建議給匿名downvoters:從不downvote沒有留下評論。 – abatishchev

回答

1

你可以直接使用進度setter方法,是這樣的:

private int _progress = 0; 
public int progress { 
    get { return _progress; } 
    set { 
     _progress = value; 
     if (progressBar.InvokeRequired) { 
      this.Invoke((MethodInvoker) delegate {progressBar.Value == value;}); 
     } else { 
      progressBar.Value = value; 
     } 
    } 
} 

這樣,你可以從外部進度的值應該是什麼設置。 InvokeRequired檢查可以設置不同線程的值。

更加緊密地mimicing你會是一個只寫屬性(只有一個setter)的行爲:

public int progress { 
    set { 
     if (progressBar.InvokeRequired) { 
      this.Invoke((MethodInvoker) delegate {progressBar.Increment(value);}); 
     } else { 
      progressBar.Increment(value); 
     } 
    } 
} 

您也可以隨時只需添加一個公共Increment方法的形式。

public void IncrementProgress(int Value) 
{ 
    if (progressBar.InvokeRequired) { 
     this.Invoke((MethodInvoker) delegate {progressBar.Increment(Value);}); 
    } else { 
     progressBar.Increment(Value); 
    } 
} 

您應該在任何情況下爲最大值添加檢查以避免例外。

+0

任何機會,你會知道如何關閉加載窗口,一旦達到100%? – user3078930

+0

@ user3078930由於您可以控制改變進度條的所有路徑(在設計器中將其設置爲私有路徑),因此您可以在setter中添加一個檢查。改變這個值,如果它的> = 100,調用'this.close()'。 – Jens

相關問題