Member 12742983 Ответов: 2

Мой индикатор выполнения не работает должным образом он заполняется после получения сообщения success но я хочу показать индикатор выполнения с процентом а затем сообщение success


мой индикатор выполнения не работает должным образом он заполняется после получения сообщения success но я хочу показать индикатор выполнения с процентом а затем сообщение success

Что я уже пробовал:

private void btnsendmail_Click(object sender, EventArgs e)
        {
            
            progressBar1.Visible = true;

            int i;

            progressBar1.Minimum = 0;
            progressBar1.Maximum = dgvData.Rows.Count;

            for (i = 0; i <= dgvData.Rows.Count; i++)
            {
                progressBar1.Value = i++;
             
            }

              if (isTwoFilesCompleted)
            {
 bool isSent = SendMail("Test Mail", "Mail with Attachments");
                        if (isSent)
                        {
                            lblMails.Text = "Completed Row : " + lCount;
                           // Application.DoEvents();
                        }

        }

King Fisher

Можете ли вы сделать так, чтобы ваша нить спала 2/3 секунды?
Thread.Sleep(2000);

2 Ответов

Рейтинг:
5

OriginalGriff

Проблема в том, что вы обновляете прогресс в том же потоке, который должен отображать текущие значения; и он не может этого сделать до тех пор, пока ваш метод не вернет управление системе, чтобы она могла обрабатывать сообщения, которые запускаются "за кулисами", чтобы фактически изменить отображение.

То, что вам нужно сделать, это посмотреть на использование второго потока для выполнения вашей обработки, я предлагаю вам попробовать Класс BackgroundWorker (System.ComponentModel)[^], который обеспечивает встроенный механизм отчетности о ходе работы.


Рейтинг:
13

Peter Leow

Проверить и адаптировать Прогрессбар[^]
Или посмотрите мой пример, обратите внимание, что messagebox должен отображаться только по завершении потока backgroundworker:

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // get the backgroundworker to report the progress
            backgroundWorker1.WorkerReportsProgress = true;
            // Start the BackgroundWorker.
            backgroundWorker1.RunWorkerAsync();
        }


        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 1; i <= 100; i++)
            {
                // Wait 100 milliseconds.
                Thread.Sleep(100);
                // Report progress.
                backgroundWorker1.ReportProgress(i);
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("Completed.");
        }
    }
}


Member 12742983

это также не показывает процент прогресса это будет wotks так же как мой код prevoius после suceess он показывает