zoukankan      html  css  js  c++  java
  • C# ToolStripProgressBar

    ToolStripProgressBar 将所有 ToolStrip控件的移动和渲染功能和其典型的进程跟踪功能结合在一起。ToolStripProgressBar通常放在StatusStrip中,偶尔放在ToolStrip中。

    ToolStripProgressBar通常在执行复制文件或打印文件等任务时使用,由于执行任务的时间较长,如果没有视觉提示,用户可能会任务应用程序没有响应。

    ToolStripProgressBar的重要成员如下:

    名称 说明
    MarqueeAnimationSpeed 获取或设置Marquee每次更新进度之间的延迟(以毫秒为单位)
    Maximum 进度条上限
    Minimum 进度条下限
    Style 进度条显示的样式
    Value 进度条的当前值
    PerformStep 根据Step属性值增加当前进度条值

    Maximum和Minimum属性用于表示任务进度的最大和最小值。Minimum通常设置为0,Maximum通常为任务完成时的值。 例如,若要正确显示复制一组文件的进度,Maximum可以设置为需要复制的文件个数。Value属性表示当前的进度。

    除了直接修改Value属性之外,还有许多方法可以修改由ToolStripProgressBar显示的值,如为Step属性指定Value每次递增的值,然后调用PerformStep使其递增。如果要修改递增的值,可以用Increment方法。

    示例

    下面的代码通过计算Fibonacci数列演示ToolStripProgressBar

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.ComponentModel;
    
    class FibonacciNumber : Form
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new FibonacciNumber());
        }
    
        private StatusStrip progressStatusStrip;
        private ToolStripProgressBar toolStripProgressBar;
        private NumericUpDown requestedCountControl;
        private Button goButton;
        private TextBox outputTextBox;
        private BackgroundWorker backgroundWorker;
        private ToolStripStatusLabel toolStripStatusLabel;
        private int requestedCount;
    
        public FibonacciNumber()
        {
            Text = "Fibonacci";
            
            // Prepare the StatusStrip.
            progressStatusStrip = new StatusStrip();
            toolStripProgressBar = new ToolStripProgressBar();
            toolStripProgressBar.Enabled = false;
            toolStripStatusLabel = new ToolStripStatusLabel();
            progressStatusStrip.Items.Add(toolStripProgressBar);
            progressStatusStrip.Items.Add(toolStripStatusLabel);
    
            FlowLayoutPanel flp = new FlowLayoutPanel();
            flp.Dock = DockStyle.Top;
    
            Label beforeLabel = new Label();
            beforeLabel.Text = "Calculate the first ";
            beforeLabel.AutoSize = true;
            flp.Controls.Add(beforeLabel);
            requestedCountControl = new NumericUpDown();
            requestedCountControl.Maximum = 1000;
            requestedCountControl.Minimum = 1;
            requestedCountControl.Value = 100;
            flp.Controls.Add(requestedCountControl);
            Label afterLabel = new Label();
            afterLabel.Text = "Numbers in the Fibonacci sequence.";
            afterLabel.AutoSize = true;
            flp.Controls.Add(afterLabel);
            
            goButton = new Button();
            goButton.Text = "&Go";
            goButton.Click += new System.EventHandler(button1_Click);
            flp.Controls.Add(goButton);
    
            outputTextBox = new TextBox();
            outputTextBox.Multiline = true;
            outputTextBox.ReadOnly = true;
            outputTextBox.ScrollBars = ScrollBars.Vertical;
            outputTextBox.Dock = DockStyle.Fill;
    
            Controls.Add(outputTextBox);
            Controls.Add(progressStatusStrip);
            Controls.Add(flp);
    
            backgroundWorker = new BackgroundWorker();
            backgroundWorker.WorkerReportsProgress = true;
            backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
            backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
            backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
            
        }
    
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            // This method will run on a thread other than the UI thread.
            // Be sure not to manipulate any Windows Forms controls created
            // on the UI thread from this method.
            backgroundWorker.ReportProgress(0, "Working...");
            Decimal lastlast = 0;
            Decimal last = 1;
            Decimal current;
            if (requestedCount >= 1)
            { AppendNumber(0); }
            if (requestedCount >= 2)
            { AppendNumber(1); }
            for (int i = 2; i < requestedCount; ++i)
            {
                // Calculate the number.
                checked { current = lastlast + last; }
                // Introduce some delay to simulate a more complicated calculation.
                System.Threading.Thread.Sleep(100);
                AppendNumber(current);
                backgroundWorker.ReportProgress((100 * i) / requestedCount, "Working...");
                // Get ready for the next iteration.
                lastlast = last;
                last = current;
            }
    
    
            backgroundWorker.ReportProgress(100, "Complete!");
        }
    
        private delegate void AppendNumberDelegate(Decimal number);
        private void AppendNumber(Decimal number)
        {
            if (outputTextBox.InvokeRequired)
            { outputTextBox.Invoke(new AppendNumberDelegate(AppendNumber), number); }
            else
            { outputTextBox.AppendText(number.ToString("N0") + Environment.NewLine); }
        }
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            toolStripProgressBar.Value = e.ProgressPercentage;
            toolStripStatusLabel.Text = e.UserState as String;
        }
    
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error is OverflowException)
            { outputTextBox.AppendText(Environment.NewLine + "**OVERFLOW ERROR, number is too large to be represented by the decimal data type**"); }
            toolStripProgressBar.Enabled = false;
            requestedCountControl.Enabled = true;
            goButton.Enabled = true;
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            goButton.Enabled = false;
            toolStripProgressBar.Enabled = true;
            requestedCount = (int)requestedCountControl.Value;
            requestedCountControl.Enabled = false;
            outputTextBox.Clear();
            backgroundWorker.RunWorkerAsync();
        }
    }

    界面如下:

    image

  • 相关阅读:
    数据库必知知识
    Shiro+easyUI+SpringMVC实现登录认证
    Java设计模式总结
    MyBatis之分页插件(PageHelper)工作原理
    Redis应用之[限制访问频率]
    Oracle最新的Sql笔试题及答案
    Shiro源码分析之SecurityManager对象获取
    Spring之BeanFactory和FactoryBean接口的区别
    Spring中使用的设计模式
    Spring之事件监听(观察者模型)
  • 原文地址:https://www.cnblogs.com/jiawei-whu/p/4332690.html
Copyright © 2011-2022 走看看