【问题标题】:WPF C# Progress Bar different Window [closed]WPF C#进度条不同的窗口[关闭]
【发布时间】:2016-11-07 13:46:44
【问题描述】:

我正在尝试弄清楚如何在我的应用程序中实现进度条。

我读过一些类似How to correctly implement a BackgroundWorker with ProgressBar updates? 的文章,我了解了它的工作原理。我的疑问是我将如何调用和更新 progressbar.xaml,因为我正在执行 PendenciaController.cs 中的 sql。

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
}

谢谢。

【问题讨论】:

  • 加油!如果您投反对票,请至少说明原因!
  • 嘿嘿。很多问题。首先实现一个后台工作者来做工作。然后,分离view和worker逻辑,最后绑定progress值
  • 我认为这个问题已经很清楚了。有时人们太吹毛求疵了。
  • 我不同意,因为提供的代码中没有任何实现显示@Denis 部分尝试使用任何BackgroundWorker,也没有任何引用我看到的任何ProgressBar,尽管他说他“了解它是如何工作的。” 提供的代码与问题/问题无关。
  • @gravity 正如我们所见,这是主观的,因为 Ignacio 的观点与您的不同。他的回答比仅仅否决我的问题更有用,而且他让我了解了如何实现进度条。

标签: c# wpf progress-bar backgroundworker


【解决方案1】:

您应该使用Progress&lt;T&gt; ClassTask

例子:

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

看看这是否能解决你的问题。

【讨论】:

  • 我按照您的建议编辑了问题,但我收到错误消息“调用线程无法访问此对象,因为不同的线程拥有它。”执行以下命令时:“pendenciaController.PendenciaConsultar((bool)chkFollowUp.IsChecked);”。我试图找出另一个线程是什么,但找不到。
  • @Denis 获取 bool 值为bool checkedStatus = Dispatcher.Invoke(() =&gt; { return (bool)chkFollowUp.IsChecked; }); 并像pendenciaController.PendenciaConsultar(checkedStatus ) 一样传递它
  • 感谢@AnjumSKhan,它运行良好!
【解决方案2】:

在我看来,您应该从PendenciaController 引发进度事件并将它们处理到PendenciaConsulta 以更新ProgressBar。

【讨论】:

  • 谢谢伊格纳西奥。我希望我可以接受 2 个答案来将您的答案和 Anjum 的答案标记为正确,但我不能,所以我接受了他的原因更完整。无论如何,我赞成你的回答,因为它对我也有帮助。
  • 太好了。不用担心。
猜你喜欢
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 2016-01-22
相关资源
最近更新 更多