2016-11-07 2 views
-3

응용 프로그램에서 진행률 막대를 구현하는 방법을 알아 내려고했습니다.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 
} 

감사합니다.

+0

어서요! 당신 downvote 적어도 왜 말을! – User

+2

Himmm. 많은 문제. 먼저 작업을 수행 할 백그라운드 작업자를 구현하십시오. 그런 다음 뷰와 작업자 로직을 분리하고 마지막으로 진행 값을 바인드합니다. – Ugur

+1

질문이 충분히 명확하다고 생각합니다. 때때로 사람들은 너무 질질 거리고 있습니다. –

답변

1

Progress<T> ClassTask을 사용해야합니다.

예 :이 방법으로 문제가 해결 될 경우

Async in 4.5: Enabling Progress and Cancellation in Async APIs

public partial class Window25 : Window 
{ 
    public Window25() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Task.Factory.StartNew(() => 
     { 
      Progress<long> progress = null; 
      progress = new Progress<long>((i) => 
      { 
       try 
       { 
        // Update ProgressBar 
        Dispatcher.Invoke(() => { PBar.Value = i; }); 
       } 
        // handle pre-mature closing of window (task cancellation) 
       catch { } 
      }); 

      Controller c = new Controller(progress); 
      c.Do(); 
     } 
     ); 
    } 
} 

public class Controller 
{ 
    Progress<long> _progress; 
    public Controller(Progress<long> progress) 
    { 
     _progress = progress; 
    } 

    public void Do() 
    { 
     for (long s = 0; s < 99999; ++s) 
      ((IProgress<long>)(_progress)).Report((long)s); 
    } 
} 

Progress class

참조.

+0

당신이 제안한대로 질문을 편집했지만 "다른 스레드가 소유하고 있기 때문에 호출하는 스레드가이 개체에 액세스 할 수 없습니다."라는 오류가 나타납니다. 다음 명령을 실행할 때 : "pendenciaController.PendenciaConsultar ((bool) chkFollowUp.IsChecked);". 나는 다른 스레드가 무엇인지 알아 내려고 시도했지만 couldn't. – User

+0

@Denis bool 값을 'bend checkedStatus = Dispatcher.Invoke (() => {return (bool) chkFollowUp.IsChecked;})'로 가져 와서 'pendenciaController.PendenciaConsultar (checkedStatus)'와 같이 전달하십시오 – AnjumSKhan

+0

고맙습니다 @AnjumSKhan it 완벽하게 일했습니다! – User

1

제 생각에는 진도 이벤트를 PendenciaController에서 발생시키고 PendenciaConsulta으로 처리하여 ProgressBar를 업데이트해야합니다.

+0

감사합니다 Ignacio. 나는 네 답을 받아 들일 수 있었으면 좋겠고 Anjum의 답은 맞지만 나는 할 수 없다. 그래서 나는 그의 원인이 더 완전하다는 것을 받아 들였다. 어쨌든 나는 그것이 도움이 되었기 때문에 당신의 답을 upvoted. – User

+0

그게 좋습니다. 걱정 마. –