私のアプリケーションでプログレスバーを実装する方法を解明しようとしています。WPF C#プログレスバーの別ウィンドウ
私はこのようないくつかの記事を読んでいます。How to correctly implement a BackgroundWorker with ProgressBar updates?、それがどのように動作するかを知りました。私はPendenciaController.csでSQLを実行しているので、progressbar.xamlをどのように呼び出して更新するのか疑いがあります。
PendenciaConsulta.xaml.cs
Task.Factory.StartNew(() =>
{
Progress<long> progress = null;
progress = new Progress<long>((i) =>
{
try
{
Dispatcher.Invoke(() => { PBar.Value = i; });
}
catch { }
});
pendenciaController = new PendenciaController(progress);
pendenciaController.PendenciaConsultar((bool)chkFollowUp.IsChecked); //The error occurs here
pendenciaController.PopularListas();
StatusController statusController = new StatusController();
ObservableCollection<Status> ListaStatus = null;
dataContext = new DataContext();
this.listaPendencia = this.pendenciaController.ListaPendencia;
ListaStatus = statusController.StatusConsultar();
this.DataContext = dataContext;
dtgPendencia.ItemsSource = this.listaPendencia;
lblQuantidadeRegistros.Content = "Quantidade de registros: " + this.listaPendencia.Count;
PopularCombos();
});
PendenciaController.cs
private Progress<long> _progress;
public PendenciaController(Progress<long> progress)
{
_progress = progress;
}
public void PendenciaConsultar(bool followUp)
{
OleDbConnection conn = null;
#region Select e conversão do DataSet
try
{
conn = new OleDbConnection(Conexao.getConexao());
conn.Open();
//Select da tabela tblPendencia
StringBuilder cmd = new StringBuilder();
cmd.Append("SELECT P.pendenciaId, " +
" P.contrato, " +
" P.adAm, " +
" P.diasDecorridos, " +
" P.corretora, " +
" P.produto, " +
" P.clienteNome, " +
" P.clienteCnpj, " +
" P.aberturaData, " +
" P.pendenciaTipo, " +
" P.lastro, " +
" P.garantiaDescricao, " +
" P.observacao, " +
" P.vencimentoData, " +
" P.liquidacaoData, " +
" P.rating, " +
" P.operacaoValor, " +
" P.pendenciaNivel, " +
" P.pendenciaValorFator, " +
" P.porContrato, " +
" P.officer, " +
" P.centroCusto, " +
" P.isCritico, " +
" P.statusId, " +
" P.clienteGrupo, " +
" P.followUp, " +
" P.carenciaInicio, " +
" P.carenciaFim, " +
" P.moeda, " +
" P.documentoTipo, " +
" P.tipo, " +
" (SELECT S.statusDescricao " +
" FROM tblStatus S " +
" WHERE S.statusId = P.statusId) as statusDescricao" +
" FROM tblPendencia P");
if (!followUp)
{
cmd.Append(" WHERE ((P.followUp <= NOW()) " +
" OR (P.followUp IS NULL))");
}
else
{
cmd.Append(" WHERE ((P.followUp <= NOW()) " +
" OR (P.followUp >= NOW()) " +
" OR (P.followUp IS NULL))");
}
OleDbDataAdapter da = new OleDbDataAdapter(cmd.ToString(), conn);
DataSet ds = new DataSet();
da.Fill(ds, "tblPendencia");
DataTable dt = new DataTable();
dt = ds.Tables["tblPendencia"];
Pendencia pendencia = null;
this.ListaPendencia = new List<Pendencia>();
if (ds.Tables != null && ds.Tables[0].Rows.Count > 0)
{
//foreach (DataRow dtRow in ds.Tables[0].Rows)
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow dtRow = ds.Tables[0].Rows[i];
pendencia = new Pendencia();
pendencia.AberturaData = dtRow["aberturaData"].ToString();
pendencia.AdAm = dtRow["adAm"].ToString();
pendencia.CentroCusto = dtRow["centroCusto"].ToString();
pendencia.ClienteCnpj = dtRow["clienteCnpj"].ToString();
pendencia.ClienteNome = dtRow["clienteNome"].ToString();
pendencia.Contrato = dtRow["contrato"].ToString();
pendencia.Corretora = dtRow["corretora"].ToString();
pendencia.DiasDecorridos = dtRow["diasDecorridos"].ToString();
pendencia.GarantiaDescricao = dtRow["garantiaDescricao"].ToString();
pendencia.Lastro = dtRow["lastro"].ToString();
pendencia.LiquidacaoData = dtRow["liquidacaoData"].ToString();
pendencia.Observacao = dtRow["observacao"].ToString();
pendencia.Officer = dtRow["officer"].ToString();
pendencia.OperacaoValor = dtRow["operacaoValor"].ToString();
pendencia.PendenciaId = Convert.ToInt32(dtRow["pendenciaId"]);
pendencia.PendenciaNivel = dtRow["pendenciaNivel"].ToString();
pendencia.PendenciaValorFator = dtRow["pendenciaValorFator"].ToString();
pendencia.StatusId = String.IsNullOrEmpty(dtRow["statusId"].ToString()) ? 0 : Convert.ToInt32(dtRow["statusId"]);
pendencia.Produto = dtRow["produto"].ToString();
pendencia.Rating = dtRow["rating"].ToString();
pendencia.PendenciaTipo = dtRow["pendenciaTipo"].ToString();
pendencia.VencimentoData = dtRow["vencimentoData"].ToString();
pendencia.ClienteGrupo = dtRow["clienteGrupo"].ToString();
pendencia.FollowUp = dtRow["followUp"].ToString();
pendencia.CarenciaInicioData = dtRow["carenciaInicio"].ToString();
pendencia.CarenciaFimData = dtRow["carenciaFim"].ToString();
pendencia.DocumentoTipo = dtRow["documentoTipo"].ToString();
pendencia.StatusDescricao = dtRow["statusDescricao"].ToString();
pendencia.PorContratoDescricao = dtRow["porContrato"].ToString();
pendencia.Moeda = dtRow["moeda"].ToString();
pendencia.Tipo = dtRow["tipo"].ToString();
pendencia.IsCritico = Convert.ToBoolean(dtRow["isCritico"]);
pendencia.StatusId = String.IsNullOrEmpty(dtRow["statusId"].ToString()) ? 0 : Convert.ToInt32(dtRow["statusId"]);
this.ListaPendencia.Add(pendencia);
((IProgress<long>)(_progress)).Report((long)i);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally { conn.Close(); }
#endregion
}
感謝。
よろしく!あなたがdownvote場合は、少なくとも理由を言う! – User
Himmm。たくさんの問題。最初に仕事をするバックグラウンドワーカーを実装します。次に、ビューとワーカーロジックを分離し、最後に進捗値をバインドします。 – Ugur
私はその質問が十分にはっきりしていると思います。時には人々はあまりにもニックピッキングしています。 –