如何在C#中使用backgroundworker发送电子邮件时显示进度条。当我们将任何东西复制到我们的驱动器时,它应该逐步显示。我正在阅读excel文件以发送电子邮件。 progressbar1.performstep();
OnClick On Button我正在显示进度条
private void button2_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
percentageLabel.Visible = true;
backgroundWorker1.RunWorkerAsync();
}
进展改变事件:该怎么办?
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progresBar1.PerformStep();
}
On Do work sendmail :(注意:我需要backgroundWorker1.ReportProgress应该一步一步执行,问题在这里我知道但该怎么做以及该怎么做?请在这里帮忙)
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
backgroundWorker1.ReportProgress(98);
while (!quit)
{
// Code to send email here
sendmail();
}
}
void sendmail()
{
string ConStr = "";
ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Program Files\\CreditControl\\CC\\outstanding.xlsx;Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";
string query = "SELECT [Agent ID] FROM [Sheet1$] group by [Agent ID] ";
OleDbConnection conn = new OleDbConnection(ConStr);
OleDbCommand cmd = new OleDbCommand(query, conn);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
System.Data.DataTable dt = new System.Data.DataTable();
da.Fill(dt);
conn.Close();
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i]["Agent ID"].ToString() != "")
{
ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Program Files\\CreditControl\\CC\\agent_mail_master.xlsx;Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";
string query2 = "SELECT Mail1,Mail2,Mail3,Mail4,Mail5 FROM [Sheet1$] where [Agent ID] = '" + dt.Rows[i]["Agent ID"].ToString() + "'";
OleDbConnection conn2 = new OleDbConnection(ConStr);
if (conn2.State == ConnectionState.Closed)
{
conn2.Open();
}
OleDbCommand cmd1 = new OleDbCommand(query2, conn2);
OleDbDataAdapter sda = new OleDbDataAdapter(cmd1);
System.Data.DataTable dts = new System.Data.DataTable();
sda.Fill(dts);
conn2.Close();
if (dts.Rows.Count > 0)
{
try
{
SmtpClient SmtpServer = new SmtpClient();
MailMessage mail = new MailMessage();
SmtpServer.Credentials = new System.Net.NetworkCredential("");
SmtpServer.Port = 25;
SmtpServer.Host = "";
mail.From = new MailAddress("");
if (dts.Rows[0]["Mail1"].ToString() != "")
mail.To.Add(dts.Rows[0]["Mail1"].ToString());
if (dts.Rows[0]["Mail2"].ToString() != "")
mail.To.Add(dts.Rows[0]["Mail2"].ToString());
if (dts.Rows[0]["Mail3"].ToString() != "")
mail.To.Add(dts.Rows[0]["Mail3"].ToString());
if (dts.Rows[0]["Mail4"].ToString() != "")
mail.To.Add(dts.Rows[0]["Mail4"].ToString());
if (dts.Rows[0]["Mail5"].ToString() != "")
mail.To.Add(dts.Rows[0]["Mail5"].ToString());
mail.Subject = "";
mail.IsBodyHtml = true;
ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Program Files\\CreditControl\\CC\\outstanding.xlsx;Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1;\"";
string query3 = "Select [Date],[Agency Name] ,[Agent ID],[Delay Days],[OD Amount],[Receipt Amount],[Outstanding Amount],Remarks,[Entered By] FROM [Sheet1$] where [Agent ID] ='" + dt.Rows[i]["Agent ID"].ToString() + "'";
OleDbConnection conn3 = new OleDbConnection(ConStr);
OleDbCommand cmd2 = new OleDbCommand(query3, conn3);
OleDbDataAdapter oda = new OleDbDataAdapter(cmd2);
System.Data.DataTable dta = new System.Data.DataTable();
oda.Fill(dta);
conn3.Close();
StringBuilder sb = new StringBuilder();
mail.Body = sb.ToString();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
quit = true;
}
ON backgroundWorker_RunWorkerCompleted成功消息:
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
progressBar1.Visible = false;
percentageLabel.Text = "";
MessageBox.Show("Error");
return;
}
else
{
MessageBox.Show("Processed successfully");
System.Windows.Forms.Application.Exit();
}
}
答案 0 :(得分:0)
您需要触发ProgressChangedEvent。
之类的东西bgWorker.ReportProgress( PercentageCompleted(...) );
还要注意progressBar1.Value
期望Int32介于0 .. 100之间而不是介于0 ... 1之间的Double(从您的代码中可以看出,您向BackgroundWorker报告的值是不明显的)
对于ReportStep,请确保设置所有必需的属性。你可以在MSDN上找到一个例子
http://msdn.microsoft.com/en-us/library/system.windows.forms.progressbar.performstep(v=vs.110).aspx
因此,在这种情况下,您需要在ProressChanged-Method中调用pbar1.ReportStep(),而不是直接设置pbar1的值。
编辑:这是派生的BackgroundWorker如何处理这些事件的一个非常基本的例子
public sealed class MyBackgroundWorker : BackgroundWorker
{
public MyBackgroundWorker(ProgressBar pBar)
{
this.MyProgressBar = pBar;
this.WorkerReportsProgress = true;
this.WorkerSupportsCancellation = false;
this.DoWork += MyBackgroundWorker_DoWork;
this.ProgressChanged += MyBackgroundWorker_ProgressChanged;
this.RunWorkerCompleted += MyBackgroundWorker_RunWorkerCompleted;
}
public ProgressBar MyProgressBar { get; private set; }
void MyBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Finish");
}
void MyBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
SendMail();
}
void MyBackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Boolean either = true; // These are your choices
if (either)
{
// If the ProgressBar has been properly configured regarding
//
// this.myProgressBar.Minimum
// and
// this.myProgressBar.Maximum
//
// you can simply call
this.MyProgressBar.PerformStep();
}
else
{
// If the Progressbar has not been properly configured,
// you have to assign the value provided by
// ProgressChangedEvents e like this
this.MyProgressBar.Value = e.ProgressPercentage;
}
}
private Boolean SendMail()
{
// foreach mail in MailsToSend ...
// Snip - I assume your code for sending mails works correctly
try
{
// Snip
}
catch (Exception ex)
{
// Snip
}
finally
{
this.ReportProgress( (100 * cntMailsSent) / cntTotalMailsToSend);
}
// quit = true; // What do you use this for?
}
}