zoukankan      html  css  js  c++  java
  • c# progressbar

    最近仿佛跟Thread很有缘,时间倒计时可以用它,今天发现可以使用线程了模拟进度条的进度。在我实现了小demo之后,又发现了很多实现进度条效果的方法,真是条条大路通罗马,怎样写都可以实现,暗爽不行不行的。

    1.使用Timer实现


      1.1插入一个timer控件,属性false,interval 100。插入button,插入textbox如下图。

     

         

       1.2 代码实现


    public void output(string log)
    {
    if (textBox1.GetLineFromCharIndex(textBox1.Text.Length)>100)
    {
    textBox1.Text = "";
    }
    textBox1.AppendText (DateTime.Now.ToString ("HH:mm:ss "+log +" "));

    }

    private void timer1_Tick(object sender, EventArgs e)
    {
    if (progressBar1.Value<progressBar1.Maximum)
    {
    progressBar1.Value++;
    output("进度进行中 [" + progressBar1.Value.ToString() + "/" + progressBar1.Maximum + "]....");
    }
    else
    {
    output ("进度已完成!");
    timer1.Enabled = false;
    }

    }
            private void button1_Click(object sender, EventArgs e)
            {
                output("进度开始!");
                progressBar1.Value = 0;
                progressBar1.Minimum = 0;
                progressBar1.Maximum = 100;
                timer1.Enabled = true;
                }


      1.3 实现效果

     

    2.用Thread和委托实现模拟processBar效果


        2.1 用一个label,一个button,一个进度条如下图。

     

        2.2  代码实现


    private void button1_Click(object sender, EventArgs e)
    {
    Worker worker = new Worker();

    /// 订阅事件
    worker.OnStartWorkEvent += new WorkEventHandler(this.OnStartWorkEventHandler);
    worker.OnDoWorkEvent += new WorkEventHandler(this.OnDoWorkEventHandler);
    worker.OnEndWorkEvent += new WorkEventHandler(this.OnEndWorkEventHandler);

    Thread thread = new Thread(new ThreadStart(worker.Work));
    thread.Start();
    }
    /// <summary>
    /// 线程开始事件,设置进度条最大值,需要一个委托来替我完成
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void OnStartWorkEventHandler(object sender, WordEventArgs e)
    {
    maxValueDelegate max = new maxValueDelegate(SetMaxValue);
    this.Invoke(max, e);
    }

    /// <summary>
    /// 线程执行中的事件,设置进度条当前进度,需要一个委托来替我完成
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void OnDoWorkEventHandler(object sender, WordEventArgs e)
    {
    nowValueDelegate now = new nowValueDelegate(SetNowValue);
    this.Invoke(now, e);
    }
    /// <summary>
    /// 线程完成事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void OnEndWorkEventHandler(object sender, WordEventArgs e)
    {
    endValueDelegate end = new endValueDelegate(SetEndValue);
    this.Invoke(end, e);
    }
    /// <summary>
    /// 被委托调用,专门设置进度条最大值的
    /// </summary>
    /// <param name="maxValue"></param>
    private void SetMaxValue(WordEventArgs e)
    {
    this.probar_Test.Maximum = e.Position;
    lbl_Info.Text = e.Info;
    }

    /// <summary>
    /// 被委托调用,专门设置进度条当前值的
    /// </summary>
    /// <param name="nowValue"></param>
    private void SetNowValue(WordEventArgs e)
    {
    this.probar_Test.Value = e.Position;
    lbl_Info.Text = e.Info;
    }

    /// <summary>
    /// 被委托调用,专门设置进度条结束后的处理
    /// </summary>
    /// <param name="nowValue"></param>
    private void SetEndValue(WordEventArgs e)
    {
    this.probar_Test.Value = e.Position; ;
    lbl_Info.Text = e.Info;
    MessageBox.Show(e.Info);

    }


      2.3实现效果

     

    3.总结收获
      

      3.1 实现方法有很多,不怕不知道,就怕不知道

      3.2 权衡利弊用最适合你系统的方法

      3.3 把功能抽离环境之后,做了好几个小DEMO实现都没有问题,当加入到正在开发的项目中时,就出现了问题。测试环境要真实!开发环境和部署环境要提前做了充分的了解,不要开发了半天才发现框架版本不一致,那就没地方哭了。。


    ————————————————

    原文链接:https://blog.csdn.net/zhou2s_101216/article/details/50288061

  • 相关阅读:
    计时器
    练习
    实现跨层组件通信(Vue3___defineComponent)
    微信内置浏览器h5监听手机返回键
    ECharts柱状图线形图
    easyui日期到月份
    uni-app传参
    js浏览器唯一标识
    知网论文查重如何查呢,免费的是真的吗?
    淘宝检测论文查重可靠吗?怎么检验?
  • 原文地址:https://www.cnblogs.com/chinayixia/p/11862785.html
Copyright © 2011-2022 走看看