2016-11-07 3 views
-3

Я пытаюсь выяснить, как реализовать индикатор выполнения в моем приложении.WPF C# Progress Bar другое окно

Я прочитал некоторые статьи, подобные этому How to correctly implement a BackgroundWorker with ProgressBar updates?, и я понял, как это работает. Я сомневаюсь, как я вызову и обновить progressbar.xaml, так как я выполняю sql в PendenciaController.cs.

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

Да ладно! Если вы понижаете голос, по крайней мере, почему! – User

+2

Himmm. Много проблем. Сначала выполните фоновый рабочий для выполнения задания. Затем, отдельная логика вида и рабочего и, наконец, связать значение прогресса – Ugur

+1

Я думаю, что вопрос достаточно ясен. Иногда люди слишком нервничают. –

ответ

1

Вы должны использовать Progress<T> Class и Task.

Пример:

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

Async in 4.5: Enabling Progress and Cancellation in Async APIs

Смотрите, если это решит вашу проблему.

+0

Я отредактировал вопрос, как вы и предложили, но я получаю сообщение об ошибке «Вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток». при выполнении следующей команды: «pendenciaController.PendenciaConsultar ((bool) chkFollowUp.IsChecked);». Я попытался выяснить, какая будет другая тема, но не может. – User

+0

@Denis Получить значение bool как 'bool checkedStatus = Dispatcher.Invoke (() => {return (bool) chkFollowUp.IsChecked;});' и передать его как 'pendenciaController.PendenciaConsultar (checkedStatus)' – AnjumSKhan

+0

Спасибо @AnjumSKhan it отлично работал! – User

1

По моему мнению, вы должны поднять прогрессные события от PendenciaController и обработать их в PendenciaConsulta, чтобы обновить ProgressBar.

+0

Спасибо Игнасио. Хотелось бы, чтобы я мог принять 2 ответа, чтобы отметить ваш и ответ Анджума, как правильный, но я не могу, поэтому я принял его дело более полным. В любом случае я поддержал ваш ответ, так как он мне тоже помог. – User

+0

Отлично. Не беспокойся. –