Revit二次开发之Winform ProgressBar(二)自动启动并关闭

参考个人文章:https://blog.csdn.net/sinat_37519884/article/details/80495828


版本

VS2015

Revit2018

实现功能

可视化当前程序执行进度,并在完成后自动关闭

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace FormTest
{
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public class Program : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            int size = 7;
            string progressMsg = "正在执行第 {0}/{1} 剪切对...";
            string progressFormText = "自动剪切";
            Worker a = new Worker(progressFormText, progressMsg, size);
            a.Show();

            return Result.Succeeded;
        }
    }
}

Winform

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;




namespace FormTest
{
    public partial class Worker : Form
    {
        private string fT = null;
        private string pMsg = null;
        private int Maximum = 0;


        public Worker(string formText, string progressMsg, int progressMaximum)
        {
            InitializeComponent();
            fT = formText;
            pMsg = progressMsg;
            Maximum = progressMaximum;
            //放在此处直接自动启动程序
            Text = fT;//修改窗体Title
            Thread fThread = new Thread(new ThreadStart(SleepT));
            fThread.Start();
        }


        private delegate void SetPos(int ipos, string vinfo); //代理    


        //public Worker()
        //{
        //    InitializeComponent();
        //}




        //控制button
        //private void button1_Click_1(object sender, EventArgs e)
        //{
        //    Thread fThread = new Thread(new ThreadStart(SleepT));
        //    fThread.Start();
        //}


        //控制textbox
        private void SleepT()
        {
            for (int i = 0; i <= Maximum; i++) //记得加等号,不然ProgressBar无法到100% 【修改】 Maximum
            {
                System.Threading.Thread.Sleep(1000);
                SetTextMesssage(i, i.ToString() + "\r\n"); //此处全用i【修改】
            }
        }


        //控制progressBar
        private void SetTextMesssage(int ipos, string vinfo)
        {
            if (this.InvokeRequired)
            {
                SetPos setpos = new SetPos(SetTextMesssage);
                this.Invoke(setpos, new object[] {ipos, vinfo});
            }
            else
            {
                string a = ipos.ToString();
                string b = Maximum.ToString();
                //this.label1.Text = $"正在执行第 {a}/{b} 剪切对...";
                this.label1.Text = string.Format(pMsg, a, b);
                //this.label1.Text = ipos.ToString() + "/"+Maximum; //只是字符串显示:"/"+Maximum【修改】
                progressBar1.Maximum = Maximum; //修改progressBar1.Maximum 【修改】
                this.progressBar1.Value = Convert.ToInt32(ipos);
                this.textBox1.AppendText(vinfo);




                if (progressBar1.Value == progressBar1.Maximum)
                {
                    this.Close();
                }
            }
        }


        //中途关闭会报错。。。当前无法解决
        private void Worker_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;    // 取消关闭操作  
        }
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_37519884/article/details/80506183
今日推荐