进度条有多个动作

时间:2013-03-27 15:06:20

标签: c# visual-studio-2008 stored-procedures progress-bar

我设计了一个进度条,我想在加载网格时使用它(我从存储过程加载数据网格视图)。但是,调用存储过程的进程有几个不同的项目(见下文)。我很早就开始使用进度条(它不在下面的代码中,因此我在这里),但我的问题是这个。

当我跟踪的进度是多种不同的方法时,进度条是否可以正常运行。 “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; }
        }


    }
}

1 个答案:

答案 0 :(得分: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");

我的代码稍微复杂一点,因为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();