显示发送电子邮件的进度条

时间:2014-11-22 09:06:13

标签: c# winforms c#-4.0 progress-bar c#-2.0

如何在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();
        }
    }

enter image description here

1 个答案:

答案 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?
    }
}