2016-11-07 4 views
-3

Ich versuche herauszufinden, wie Sie eine Fortschrittsleiste in meiner Anwendung implementieren.WPF C# Fortschrittsbalken anderes Fenster

Ich habe einige Artikel wie diese gelesen How to correctly implement a BackgroundWorker with ProgressBar updates?, und ich habe gefangen, wie es funktioniert. Mein Zweifel ist, wie ich die progressbar.xaml aufrufen und aktualisieren werde, da ich die sql in der PendenciaController.cs ausführe.

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 
} 

Dank.

+0

Komm schon! Wenn du Downvote sagst, warum zumindest! – User

+2

Himmm. Viele Probleme. Implementieren Sie zunächst einen Hintergrundarbeiter, um den Job zu erledigen. Dann separate Sicht und Arbeiterlogik und schließlich den Fortschrittswert – Ugur

+1

binden Ich denke, dass die Frage klar genug ist. Manchmal sind Leute zu pingelig. –

Antwort

1

Sie sollten Progress<T> Class und Task verwenden.

Beispiel:

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

Sehen Sie, ob das Ihr Problem löst.

+0

Ich habe die Frage bearbeitet, wie Sie vorgeschlagen haben, aber ich bekomme den Fehler "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, weil ein anderer Thread es besitzt." wenn der folgende Befehl ausgeführt wird: "pendenciaController.PendenciaConsultar ((bool) chkFollowUp.IsChecked);". Ich versuchte herauszufinden, was der andere Thread wäre, konnte aber nicht. – User

+0

@Denis Holen Sie sich den Bool-Wert als 'bool checkedStatus = Dispatcher.Invoke (() => {return (bool) chkFollowUp.IsChecked;});' und übergeben Sie es wie 'pendenciaController.PendenciaConsultar (checkedStatus)' – AnjumSKhan

+0

Dank @AnjumSKhan es hat perfekt funktioniert! – User

1

Meiner Meinung nach sollten Sie Fortschritte Ereignisse von PendenciaController auslösen und sie in PendenciaConsulta behandeln, um die ProgressBar zu aktualisieren.

+0

Danke Ignacio. Ich wünschte, ich könnte zwei Antworten akzeptieren, um deine und Anjums Antwort als richtig zu markieren, aber ich kann nicht, also akzeptierte ich, dass seine Sache vollständiger ist. Wie auch immer, ich habe deine Antwort aufgewertet, da sie mir auch geholfen hat. – User

+0

Das ist großartig. Keine Bange. –