Jump to content
Sign in to follow this  
PamkY

ProgressBar

Recommended Posts

PamkY

Boas,

Estou a tentar conseguir o código para que uma progressbar mostre o andamento de uma função, mas não estou a conseguir.

Então é assim:

Ao carregar num botão, o projecto envia um mail, mas como demora um pouco gostava de ter uma progressbar.

Acontece também que o programa chega a uma parte que deixa de responder, mas depois retorna e envia o email com sucesso.

Alguém?  :dontgetit:

Share this post


Link to post
Share on other sites
Caça

Para isso tens de ter um evento que te informe do progresso actual... Tens isso?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Caça

Para isso precisas de o ter...

Uma alternativa é colocares a progressbar como indeterminada, como a que aparece no iniciar do windows... Pelo menos dá para o utilizador ver aquilo a passar


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
PamkY

Sim, é mais para o utilizador não pensar que o programa não está a fazer nada.

Tem algum exemplo de como fazer a indeterminada?

Isto é, pô-la a andar ao clicar no botão e parar assim que concluido o processo.

Share this post


Link to post
Share on other sites
Caça

Só tens de alterar a propriedade Style para "Marquee"


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
PamkY

Está a funcionar já, tal como pretendia.

Obrigado!

Agora, acontece é que quando o e-mail é válido, como o programa fica sem responder durante uns 2 segundos a barra não faz nada logicamente, só não percebo o porquê do programa não responder e depois voltar a si e enviar numa boa o mail  😡

Share this post


Link to post
Share on other sites
Caça

Depois de iniciar a ProgressBar e antes de enviar o email coloca

DoEvents();


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
PamkY

Depois de iniciar a ProgressBar e antes de enviar o email coloca

DoEvents();

-> The name 'DoEvents' does not exist in the current context.

Share this post


Link to post
Share on other sites
PamkY

Desculpa eu pela ignorância  ;)

Continua a não responder, já começo a achar que o problema é do PDF que exporto, que será enviado em anexo nesse mesmo mail.

Estou a usar isto para exportar:

try
            {
                DGVEPdfExportSettings exportSettings = new DGVEPdfExportSettings();
                exportSettings.ExportFileName = ExportFile;
                exportSettings.OpenFileAfterGeneration = false;
                DGVEPdfExporter exporter = new DGVEPdfExporter();
                exportSettings.HeaderText = HeaderText;
                exportSettings.ExportHeaderTextOnEveryPage = true;
                exportSettings.ExportHeaderText = true;
                exportSettings.OpenFolderAfterGeneration = false;
                exportSettings.HeaderTextHorizontalAlignment = CompletIT.Windows.Forms.Export.Pdf.ParagraphHorizontalAlignment.Justified;
                exportSettings.TableHorizontalAlignment = CompletIT.Windows.Forms.Export.Pdf.TableHorizontalAlignment.Center;
                exporter.Export(dataGridView1, exportSettings);
            }
            catch (Exception e1)
            {
                MessageBox.Show(e1.ToString());
            }

EDIT:

Parece mesmo que o problema vem daqui.

Tentei agora o this.Close() após a exportação e o programa bloqueia e depois dá erro..

Share this post


Link to post
Share on other sites
Caça

Coloca essa linha antes disto

exporter.Export(dataGridView1, exportSettings);

Se continuar, tens de fazer através de outro Thread


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
PamkY

Agora fecha na boa mas continua a ficar sem responder ao enviar o mail.

Este é o código do envio do mail:

try
                {
                    System.Net.Mail.MailMessage Mail = new System.Net.Mail.MailMessage();
                    Mail.To.Add(GlobalVariavel.FacturaEMail);
                    System.Net.Mail.Attachment PDFOrcamento = new System.Net.Mail.Attachment("C:\\SalvAçor\\Orçamento\\ID" + GlobalVariavel.ID_OrcamentoActual + ".pdf");
                    Mail.Attachments.Add(PDFOrcamento);
                    Mail.Subject = "Orçamento";
                    Mail.From = new System.Net.Mail.MailAddress("mail@gmail.com");  
                    Mail.Body = GlobalVariavel.Mensagem;
                    System.Net.Mail.SmtpClient SMTP = new SmtpClient();
                    SMTP.Port = 587;
                    SMTP.Host = "smtp.gmail.com";
                    SMTP.EnableSsl = true;
                    SMTP.Credentials = new System.Net.NetworkCredential("mail@gmail.com", "passmail");
                    SMTP.Send(Mail);
                    FacturaEnvio = true;
                    MessageBox.Show("Orçamento enviado com sucesso.", "Operação concluída", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch (Exception e1)
                {
                    MessageBox.Show(e1.ToString());
                }

Share this post


Link to post
Share on other sites
Caça

Para evitar isso tens de executar esse código através de outro Thread


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
PamkY

Tanto o código de exportação como o do envio do mail estão numa classe, quando preciso de as chamar faço isto: NomedaClasse.NomedaFuncao() será por isso?

Como assim através de outro Thread?

Share this post


Link to post
Share on other sites
Caça

Tanto o código de exportação como o do envio do mail estão numa classe, quando preciso de as chamar faço isto: NomedaClasse.NomedaFuncao() será por isso?

Não.

Como assim através de outro Thread?

isto


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Caça

Onde é que estás a ter dificuldade?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
PamkY

Tentei fazer como o exemplo do link que me deu mas dá-me erros por isso não entendi ainda ao certo como funciona...

Vou pesquisar melhor sobre isso

EDIT:

Continua a dar erros. Estou a seguir por aqui: http://support.microsoft.com/kb/815804/pt

Erros:

Thread trd = new Thread(new ThreadStart(this.ThreadTask));
            trd.IsBackground = true;
            trd.Start();

No load em todas as linhas.

Thread.Sleep(100);

Na ThreadTask.

E estou a fazer como o exemplo...

EDIT:

Os erros desaparecem ao meter System.Threading antes do Thread na primeira linha que pus aqui e na da ThreadTask.

Mas dá este erro: A operação entre threads não é válida: controlo 'progressBar1' acedido a partir de um thread diferente do thread onde foi criado.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.