Usuário com melhor resposta
Sincronização de um processo com um progressBar

Pergunta
-
Amigos desenvolvedores, tenho a seguinte situação:
Preciso sincronizar uma barra de progresso com um processo. Exemplo: ao clicar em um botão chamo um método que possui uma query que faz um SELECT no banco MSSQLSERVER e carrega um DataGridView. Devido à tabela possuir milhares de registros este processo demora um pouco. Por isso gostaria de mostrar uma barra de progresso mostrando o andamento do processo, para que o usuário não pense que o sistema travou. Desde já agradeço a todos.
Respostas
-
O problema maior é que a lentidão fica na carga do dataset... a menos que vc faça uma consulta com count para saber o numero de registros que vão ser retornados... fica difícil saber qual a quantidade total de registro antes da carga...
Se não for problema vc term um progress bar que vá sendo carregado varias veses... voce pode tentar algo desse jeito:
progressBar.Maximum = 100; progressBar.Value = 0; using (var conn = new SqlConnection()) { var command = new SqlCommand(); command.CommandText = "SELECT ..."; var adapter = new SqlDataAdapter(command); adapter.RowUpdating += (sender, e) => { if (progressBar.Value == progressBar.Maximum) progressBar.Value = 0; progressBar.Increment(1); }; }
- Sugerido como Resposta Eduardo Cury quarta-feira, 29 de junho de 2011 02:58
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 14 de julho de 2011 12:37
-
Vinícius,
Que eu saiba, o Fill do DataAdapter (que provavelmente o seu método SelecionaCliente está utilizando) não retorna o progresso atual... Portanto, o jeito seria fazer como o Rui indicou, criando uma ProgressBar que fica sendo preenchida várias vezes enquanto o método não finaliza a execução... Você tentou fazer como o Rui sugeriu?
Outra opção, também como o Rui sugeriu, é se você tiver a quantidade de linhas que serão retornadas (fazendo um count antes, por exemplo), você conseguiria fazer uma ProgressBar com o progresso real da carga utilizando o evento RowChanged da DataTable... Veja um exemplo disso no seguinte link:
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/88bf31ed-6e8d-4543-9201-244285f9b6a9
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima- Editado AndreAlvesLimaModerator segunda-feira, 4 de julho de 2011 19:13 complemento
- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 8 de julho de 2011 19:04
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 14 de julho de 2011 12:37
Todas as Respostas
-
Vinicius, veja se o link abaixo pode ajudar.
http://wiki.portugal-a-programar.org/dev_net:vb.net:progressbar_datagrid
Abraço
Estevam
**** Se a reposta foi útil, então não esqueça de marca-lá. *** -
Interessante o que esse post fala, mas ainda não é o que eu gostaria de fazer. Na verdade, pelo o que eu entendi neste post, ele está incrementando o progressBar conforme vai lendo uma linha da tabela, que foi carregada no dataset. O que estou tentando fazer é um sincronismo entre um método e um progressBar.
-
-
-
Vinícius,
Tudo depende de como você está fazendo a carga do seu DataGridView... Você poderia nos passar maiores detalhes?
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
O problema maior é que a lentidão fica na carga do dataset... a menos que vc faça uma consulta com count para saber o numero de registros que vão ser retornados... fica difícil saber qual a quantidade total de registro antes da carga...
Se não for problema vc term um progress bar que vá sendo carregado varias veses... voce pode tentar algo desse jeito:
progressBar.Maximum = 100; progressBar.Value = 0; using (var conn = new SqlConnection()) { var command = new SqlCommand(); command.CommandText = "SELECT ..."; var adapter = new SqlDataAdapter(command); adapter.RowUpdating += (sender, e) => { if (progressBar.Value == progressBar.Maximum) progressBar.Value = 0; progressBar.Increment(1); }; }
- Sugerido como Resposta Eduardo Cury quarta-feira, 29 de junho de 2011 02:58
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 14 de julho de 2011 12:37
-
... this.dsClientes = repCli.SelecionaCliente(); this.bsClientes.DataSource = this.dsClientes; this.bsClientes.DataMember = this.dsClientes.Tables[0].TableName; this.gridClientes.DataSource = this.bsClientes; FormataGrid(); ...
dsClientes é o meu DataSet. O método FormataGrid() edita as colunas e modifica a cor de alguns registros especificos.Quando a tabela chegar em torno de 1.000.000.000 de registros, a consulta irá demorar um pouco. Por isso eu coloquei uma barra de progresso para ficar carregando enquanto processa a query do método SelecionaCliente(). O sincronismo seria este.
Desde já agradeço pela colaboração de tosdos.
-
Vinícius,
Conseguiu solucionar essa questão?
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
-
Vinícius,
Que eu saiba, o Fill do DataAdapter (que provavelmente o seu método SelecionaCliente está utilizando) não retorna o progresso atual... Portanto, o jeito seria fazer como o Rui indicou, criando uma ProgressBar que fica sendo preenchida várias vezes enquanto o método não finaliza a execução... Você tentou fazer como o Rui sugeriu?
Outra opção, também como o Rui sugeriu, é se você tiver a quantidade de linhas que serão retornadas (fazendo um count antes, por exemplo), você conseguiria fazer uma ProgressBar com o progresso real da carga utilizando o evento RowChanged da DataTable... Veja um exemplo disso no seguinte link:
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/88bf31ed-6e8d-4543-9201-244285f9b6a9
André Alves de Lima
Microsoft MVP - Client App Dev
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima- Editado AndreAlvesLimaModerator segunda-feira, 4 de julho de 2011 19:13 complemento
- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 8 de julho de 2011 19:04
- Marcado como Resposta AndreAlvesLimaModerator quinta-feira, 14 de julho de 2011 12:37