我设计了一个进度条,我想在加载网格时使用它(我从存储过程加载数据网格视图)。但是,调用存储过程的进程有几个不同的项目(见下文)。我很早就开始使用进度条(它不在下面的代码中,因此我在这里),但我的问题是这个。
当我跟踪的进度是多种不同的方法时,进度条是否可以正常运行。 “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 :(得分: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();