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


    }
}
4

1 回答 1

0

我们有一个使用后台线程和事件回调的进度条。它还使用“params”参数和委托,以便可以将其泛化到代码中的任何进程中。

这里有一些小片段......

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");

我的代码稍微复杂一些,因为Tcannot be void,所以我不得不添加一些开关和辅助方法以允许它在有void返回的进程上运行。但基本形状就在那里。

以下是进度条的入口点示例:

//note: FunctionName, Class Having Function, Params....
frmProgress _frmProgress = new frmProgress("UpdateRigX", RigFacade.Instance, rigX, dRigVersion, ModuleVersion);
_frmProgress.FormTitle = "Updating RigX...";
_frmProgress.ShowDialog();
于 2013-03-27T17:16:57.723 回答