سلام دوستان عزیز وقتتون بخیر من میخوام موقع لود گزارش یک پروگرس بار هم برای فرم بزارم که کاربر بفهمه که برنامه درحال اجرای عملیات هستش برای همین از یک بک گراند ورکر و یک پروگرس بار به طریق زیر استفاده کردم نمیدونم طریقه استفاده من به این شکل درست هست یا نه و اینکه زمان دقیق لود شدن گزارش را نمیدونم یعنی اگه فایلمون حجیم باشه تایم لود شدن فرم با پر شدن پروگرس بار یکی نمیشه لطفا اگه فرصت کردید بنده را راهنماییم بفرمایید ممنونم البته اینم بگم که بدنه اصلی کد درداخل بلوک botton2 بود که وقتی کاربر روی این دکمه کلیک میکرد گزارش لود میشد حالا من این تیکه کد را داخل بلوک BG_RunWorkerCompleted قرار دادم که نمیدونم درست هست یا نیست چون تابه حال با بک گراند ورکر کار نکردم لطفا راهنماییم بفرمایید پیشاپیش از صبرو شکیبایی شما سپاسگذارم
private void button2_Click(object sender, EventArgs e)
{
BG.RunWorkerAsync(500);
this.Cursor = Cursors.WaitCursor;
//BG.CancelAsync();
}
private void BG_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
int time = (int)e.Argument;
temp = new List<int>();
for (int i = 0; i <= 10; i++)
{
if (BG.CancellationPending)
{
e.Cancel = true;
break;
}
BG.ReportProgress(i * 10);
Thread.Sleep(time);
temp.Add(i);
}
e.Result = temp;
// BG.CancelAsync();
}
private void BG_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{if (e.Cancelled)
{
MessageBox.Show("You Cancelled The BackGroundWorker!");
}
else
{
frm_Report frm_R = new frm_Report();
var dtRpt = Rpt_data();
var ds = new DataSet();
ds.Tables.Add(dtRpt);
var stiReport1 = new StiReport();
stiReport1.Load(Application.StartupPath + @"\Report.mrt");
DataTable table = new DataTable();
table.Columns.Add(new DataColumn("t1"));
table.Columns.Add(new DataColumn("t2"));
DataTable ff = ds.Tables[0];
for (int i = 0; i < ff.Rows.Count; i++)
{
table.Rows.Add(ff.Rows[i][ff.Columns[0].ColumnName].ToString(), ff.Rows[i][ff.Columns[1].ColumnName].ToString());
}
stiReport1.RegData("Table1", table);
//stiReport1.Design();
stiReport1.Render(false);
frm_R.stiViewerControl1.Report = stiReport1;
frm_R.stiViewerControl1.Refresh();
frm_R.Show();
// progressBar1.Value -= progressBar1.Value;
/* temp.AddRange((List<int>)e.Result);
MessageBox.Show("Done!");*/
}
}
private void BG_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}