Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Progressbar durante o While (C#)


Ricardo T. do Prado

Pergunta

Senhores,

Estou com o seguinte problema, tenho um progressbar que precisa ser carregada completamente durante um loop, só que não to conseguindo fazer isso, pela lógica o valor MÁXIMUM do progress bar seria definido pela quantidade de loops, mas dá um problema de tamanho (Range) fora do esperado. Segue código abaixo

StreamReader LerSQL2 = new StreamReader(this.txtCaminho.Text);

                //Declaro uma string vazia para servir como contador
                string SQL2 = "";

                int j = 0;
                //Uso o while para satisfazer a condição. Cada vez que ler uma linha delimitada por ";" executará um comando SQL
                while ((SQL2 = LerSQL2.ReadLine()) != null)
                {
                    j++;
                }

                progressBar1.Maximum = j;

                //Pego o arquivo que está no display do txtCaminho e abro e jogo para StreamReader
                StreamReader LerSQL = new StreamReader(this.txtCaminho.Text);

                //Declaro uma string vazia para servir como contador
                string SQL = "";

                int i = 0;

                //Uso o while para satisfazer a condição. Cada vez que ler uma linha delimitada por ";" executará um comando SQL
                while ((SQL = LerSQL.ReadLine()) != null)
                {
                    Dados.ExecuteSQL(SQL.ToString());
                    txtLoading.Text = "Loading: " + i++.ToString() + " - Linhas atualizadas!";
                    progressBar1.Value = i++;
                }

                
            }

            MessageBox.Show("Fim!","Informação!");

Editado por Ricardo T. do Prado
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Senhores, consegui resolver, não sei que diabos está acontecendo mas durante o primeiro while ele incrementa 1 a mais, ai dava erro, segue codigo resolvido abaixo

StreamReader LerSQL0 = new StreamReader(this.txtCaminho.Text);
                string SQL0 = "";
                int j = 0;
                while ((SQL0 = LerSQL0.ReadLine()) != null)
                {
                    j++;
                }
                int MaximunProgressBar = j - 1;

                progressBar1.Maximum = MaximunProgressBar;



                //Pego o arquivo que está no display do txtCaminho e abro e jogo para StreamReader
                StreamReader LerSQL = new StreamReader(this.txtCaminho.Text);
                string SQL = "";
                int i = 0;
                while ((SQL = LerSQL.ReadLine()) !=null)
                {
                    Dados.ExecuteSQL(SQL.ToString());
                    progressBar1.Value = i++;
                    //txtLer.Text = i++.ToString() + " - linhas já foram atualizadas";
                }

                int resultado = i - 1;
                MessageBox.Show(resultado.ToString() + " - linhas atualizadas", "Resultado");
                txtLer.Text = "Sucesso! dados atualizados.";

Link para o comentário
Compartilhar em outros sites

  • 0

Olha, que bom que você já resolveu o problema. Mas como parece que você não entendeu muito bem o porque, deixa eu tentar explicar.

Quando você utiliza ++ em um valor, ele automaticamente aumenta o valor em 1 correto? No seu loop, você definia o valor máximo utilizando ++. Então, se o loop fosse executado 20 vezes, o máximo seria de 20.

O problema é que no 2 loop, que preenche o value do progressbar, você incrementa o campo i duas vezes. Ou seja, no primeiro loop, i seria 2 ao invés de 1, no segundo loop 4 ao invés de 2 e assim por diante. Então, quando o loop estiver fazendo sua décima execução, o valor de i já será 20 e a próxima irá gerar erro.

Se você retirasse o ++ de i para escrever no textLer, provalmente funcionará.

while ((SQL = LerSQL.ReadLine()) !=null)
                {
                    Dados.ExecuteSQL(SQL.ToString());
                    progressBar1.Value = i++;
                    txtLer.Text = i.ToString() + " - linhas já foram atualizadas";
                }

Editado por Lucas Phillip
Link para o comentário
Compartilhar em outros sites

  • 0

Senhores,

Vou ressuscitar o post, pois, achei algo mais lógico e eficaz. Pode ser útil ai para quem quiser trabalhar com barra de progresso em suas aplicações. Segue código

private void button1_Click(object sender, System.EventArgs e)

{

label1.Text = "Loading... Please Wait";

Application.DoEvents();

// define os limites minimos e maximos

progressBar1.Minimum = 250;

progressBar1.Maximum = 25000;

progressBar1.Value = progressBar1.Minimum;

// faz a leitura do ficheiro

string fileUrl = new FileInfo(path).DirectoryName

+ @"\progressbar.txt";

int readcount = 0;

while (fileUrl.Read())

{

// faz o update do progressbar em cada 100 leituras

if ((++readcount % 100) == 0)

{

if (progressBar1.Value < progressBar1.Maximum)

progressBar1.Value += progressBar1.Minimum;

}

}

// tarefa completa

progressBar1.Value = progressBar1.Maximum;

label1.Text = "Complete!";

}

Editado por Ricardo T. do Prado
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...