【问题标题】:show progressbar on sending email在发送电子邮件时显示进度条
【发布时间】:2014-11-22 09:06:13
【问题描述】:

如何在 C# 中使用 backgroundworker 发送电子邮件时显示进度条。当我们将任何内容复制到驱动器时​​,它应该逐步显示。我正在阅读 excel 文件以发送电子邮件。 progressbar1.performstep();

按钮的 OnClick 我正在显示进度条

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

在做工作 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();
        }
    }

【问题讨论】:

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


    【解决方案1】:

    您需要触发 ProgressChangedEvent。像

    bgWorker.ReportProgress( PercentageCompleted(...) );
    

    还请注意,progressBar1.Value 需要一个介于 0 .. 100 之间的 Int32,而不是介于 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?
        }
    }
    

    【讨论】:

    • 请看上面我已经更新了,我知道我已经手动输入了reportprogress。
    • 好的,我在评论中进行了更新,显示了一个来自 BackgroundWorker 的派生类,该类将其进度更新为您在构造函数中提供的进度条。通常你只会从另一个对象提供'OnProgressChanged'函数来更新位于任何地方的进度条,但这应该也可以工作
    猜你喜欢
    • 2012-01-26
    • 2016-05-08
    • 1970-01-01
    • 2015-09-13
    • 2020-05-03
    • 1970-01-01
    • 2012-12-29
    • 2012-01-06
    • 2022-11-11
    相关资源
    最近更新 更多