首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# [progressBar]进度条显示有关问题

2013-11-26 
C# [progressBar]进度条显示问题如下一个方法,分别用DataGridView,ProgressBar,Label的对象作为参数。实现

C# [progressBar]进度条显示问题
如下一个方法,分别用DataGridView,ProgressBar,Label的对象作为参数。实现导出datagridview时显示进度条。


/// <summary>
        /// 将datagridview导出为excel文件,导出过程中显示进度条
        /// </summary>
        /// <param name="dgv">DataGridView</param>
        /// <param name="pb">progressBar</param>
        /// <param name="ll">Label</param>
        public static void ExportToExcel(DataGridView dgv, ProgressBar pb, System.Windows.Forms.Label ll)
        {
            System.Data.DataTable dt = dgv.DataSource as System.Data.DataTable;
            if (dt == null) return;
            Microsoft.Office.Interop.Excel.Application xlapp = new Microsoft.Office.Interop.Excel.Application();
            if (xlapp == null)
            {
                MessageBox.Show("无法创建Excel对象,可能您的电脑未安装Excel");
                return;
            }
            System.Windows.Forms.SaveFileDialog saveDia = new SaveFileDialog();
            saveDia.Filter = "Excel|*xls";
            saveDia.Title = "导出为Excel文件";
            saveDia.FileName = string.Format("{0}.xls", DateTime.Now.ToString("yyyyMMddHHmmss"));
            if (saveDia.ShowDialog() == System.Windows.Forms.DialogResult.OK && !string.Empty.Equals(saveDia.FileName))
            {
                Microsoft.Office.Interop.Excel.Workbooks workbooks = xlapp.Workbooks;
                Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
                Microsoft.Office.Interop.Excel.Range range = null;
                long totalCount = dt.Rows.Count;
                pb.Visible = true;//进度条显示
                ll.Visible = true;//进度label显示
                pb.Maximum = (int)totalCount;
                long rowRead = 0;
                float percent = 0;
                string fileName = saveDia.FileName;
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
                    range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];
                    range.Font.Bold = true;
                    range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
                    range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);
                }


                for (int r = 0; r < dt.DefaultView.Count; r++)
                {
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        worksheet.Cells[r + 2, i + 1] = dt.DefaultView[r][i];
                        range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r + 2, i + 1];
                        range.Font.Size = 9;
                        range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null);
                        range.EntireColumn.AutoFit();
                    }
                    rowRead++;
                    pb.Value = (int)rowRead;
                    percent = ((float)(100 * rowRead)) / totalCount;
                    ll.Text = percent.ToString("0.00").Trim() + "%";
                   
                    System.Windows.Forms.Application.DoEvents();
                }
                range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
                if (dt.Columns.Count > 1)
                {
                    range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;
                }
                try
                {
                    workbook.Saved = true;
                    workbook.SaveCopyAs(fileName);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("导出文件时出错,文件可能正被打开!\n'" + ex.Message);
                    return;
                }
                workbook.Close();
                if (xlapp != null)
                {
                    xlapp.Workbooks.Close();
                    xlapp.Quit();
                    int generation = System.GC.GetGeneration(xlapp);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlapp);


                    xlapp = null;
                    System.GC.Collect(generation);
                }
                GC.Collect();//强行销毁
                #region 强行杀死最近打开的exce进程
                System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName("EXCEL");
                System.DateTime startTime = new DateTime();
                int m, killId = 0;
                for (m = 0; m < excelProc.Length; m++)
                {
                    if (startTime < excelProc[m].StartTime)
                    {
                        startTime = excelProc[m].StartTime;
                        killId = m;
                    }
                    if (excelProc[killId].HasExited == false)
                    {
                        excelProc[killId].Kill();
                    }
                #endregion
                    pb.Visible = false;
                    ll.Visible = false;
                    MessageBox.Show("导出成功!");
                }
            }
}


问题描述:
progressBar没走完,可label就显示100%,找了好久都没找出来原因,请教分析这个方法,该如何修改,可以使progressBar走完时才使label显示100%。
C# [progressBar]进度条显示有关问题 progressBar
[解决办法]
pb.Value = r+1;
[解决办法]
rowRead++;
pb.Value = (int)rowRead;
percent = ((float)(100 * rowRead)) / totalCount;
ll.Text = percent.ToString("0.00").Trim() + "%";
追踪一下上面三行代码;
建议去掉long rowRead = 0;    float percent = 0;直接用i .也不要进行浮点转换和计算了,浪费时间,还容易出错
[解决办法]
设置pb.Step=0;


Pbar.PerformStep();
Pbar.Value =(int)rowRead;
[解决办法]
pb.Value = (int)rowRead;这个不对

应该是0~100之间的数字代表进度。
[解决办法]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {


            progressBar1.Maximum=int.Parse(textBox1 .Text );
            for (int i = 0; i < int.Parse(textBox1.Text)+1; i++)
            {
                progressBar1.Value = i;
                label1.Text = ((100 * i) / (int.Parse(textBox1.Text))).ToString() + "%";
                label1.Refresh();
                

            }

        }
    }
}

[解决办法]
这个进度条是什么控件,看起来不错
[解决办法]
用 BackgroundWorker不多好哈,以前我纠结一段时间,后来有网友推荐用,蛮好用的.
[解决办法]

引用:
用 BackgroundWorker不多好哈,以前我纠结一段时间,后来有网友推荐用,蛮好用的.

是,这个无论使用多线程或者其他似乎好点,不太确定是不是Application.DoEvents引起的

热点排行