2013-03-27 98 views
0

我設計了一個進度條,當我加載網格時(我從存儲過程加載datagridview)時,我想使用該進度條。但是,調用存儲過程的過程有幾個不同的它調用的項目(見下文)。我很早就讓進度條起作用(它不在下面的代碼中,所以爲什麼在這裏),但我的問題是這樣的。具有多個操作的進度條

當我跟蹤的進度是多種不同的方法時,進度條能否正確啓動? 「LoadGrid」方法是我真正想跟蹤進度的方法,因爲這是存儲過程的處理和datagridview的加載(即時間消耗過程)。我想我更多地問什麼是適當的技術,而不是使用確切的代碼,但我在進度條上知之甚少。我知道我可以使用一個隨機的圖標,表示「忙碌」,但如果可以合法地進行,我寧願擁有進度條。

public void btnLoadGrid_Click(object sender, EventArgs e) 
{ 
    frmProgress progressForm = new frmProgress(); 

    try 
    { 
     progressForm.MdiParent = this; 
     progressForm.Text = "Importing DSC_0"; 
     progressForm.Top = this.Height/3 - progressForm.Height/2; 
     progressForm.Left = this.Width/2 - progressForm.Width/2; 
     //ofd1.Title = "Import legacy DSC balances"; 
     //this.ofd1.ShowDialog(this); 

     //Need code to empty grid before loading 
     grd1.Rows.Clear(); 
     grd1.Refresh(); 

     //Load grid based on new selections 
     GetUserSelections(); 
     GetUserRelatedInfo(); 
     LoadLabelForecastType(); 
     LoadGrid(); 
    } 
    catch (Exception ex) 
    { 
     util.LogError(ex); 
     MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
    } 
    Cursor.Current = Cursors.Default; 
    progressForm.Close();   

} 

和進度條本身:

namespace AmortClient 
{ 
    public partial class frmProgress : Form 
    { 
     public frmProgress() 
     { 
      InitializeComponent(); 
     } 


     public ProgressBar Pbar 
     { 
      get { return this.pb1; } 
     } 


    } 
} 
+0

最後一次我用我用後臺工作,你只是包裝你的所有「工作」在for循環中的進度條。以下是我使用的步驟。 http://www.codeproject.com/Tips/83317/BackgroundWorker-and-ProgressBar-demo – 2013-03-27 15:45:06

+0

一個很好的教程。非常基本但很有效。我認爲我的項目代碼的原作者可能會使用它,結合泛型和代表的其他一些內容,來提出我們的系統。我只知道這麼多,因爲我不得不在他後面進行補丁,這意味着要先學習如何工作! = D – Nevyn 2013-03-27 17:23:38

+0

謝謝,我會在接下來的幾天裏讀這本書並試一試。 – 2013-03-27 20:12:07

回答

0

我們有一個使用後臺線程和事件回調的進度條。它還使用「params」參數和委託,以便它可以推廣到代碼中的任何進程中。

這裏有幾個小snippits ...

private delegate T Method(ProgressBarCallBackInterface callingform, params object[] argsobject); 

private void frmProgress_Load(object sender, EventArgs e) 
{ 
    if (!string.IsNullOrEmpty(FormTitle)) 
    { 
     lblSampleTitle.Text = FormTitle; 
     this.Text = FormTitle; 
    } 
    else 
    { 
     lblSampleTitle.Text = string.Empty; 
     this.Text = string.Empty; 
    } 

    bgWorkerThread.RunWorkerAsync(); 
} 

private void bgWorkerThread_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Delegate method = Delegate.CreateDelegate(typeof(Method), instanceOfClassHavingTheFunction, FullFunctionName, true, true); 
    if (method != null) 
    { 
     ReturnValue = ((Method)method)(this, Parameters); 
    } 
} 

public void ReportProgress(int percentage, string statusText) 
{ 
    lblProgress.SetPropertyThreadSafe(() => lblProgress.Text, statusText); 
    bgWorkerThread.ReportProgress(percentage); 
} 

然後在任何代碼在使用它,我可以打電話

if (progressBar != null) 
    progressBar .ReportProgress(6, "Verifying Journal Integrity"); 

我的代碼是稍微複雜一些,因爲T不能void,所以我不得不添加一些開關和一個輔助方法,以允許它在具有void返回的進程上運行。但基本的形狀就在那裏。

下面是一個切入點進度條的示例:

//note: FunctionName, Class Having Function, Params.... 
frmProgress _frmProgress = new frmProgress("UpdateRigX", RigFacade.Instance, rigX, dRigVersion, ModuleVersion); 
_frmProgress.FormTitle = "Updating RigX..."; 
_frmProgress.ShowDialog(); 
+0

這可能比你想要做的更復雜......但它具有通用性和可重用性的好處。 :-) – Nevyn 2013-03-27 17:27:15