制作进度条往往分为两种:
1. 真实的进度条,显示你进程的百分比。这样的话我的做法是给你的初始化函数里面设置几个点,分别取名是干什么的。然后在你跟新的时候进度条并会显示目前正在干什么。当然如果你的电脑很好,初始化很快的话就很难看出来,一闪而过,你可以设置System.Threading.Thread.Sleep(2000)停止两秒来看看效果。
例子如下:
/*****ProcessMesg为进度页面的一个label显示空间*******/
SetCurrentThreadCulture();
LoginProcess loginPro = new LoginProcess();
loginPro.Show();
loginPro.ProcessMesg.Text = "Data is initializing...";
loginPro.Refresh();
Messager.Instance.Start();
loginPro.ProcessMesg.Text = "Threads is initializing...";
loginPro.Refresh();
loginPro.ProcessMesg.Text = "Interface is initializing...";
loginPro.Refresh();
//Load plugin.dll
// PluginContent.Initialize();
loginPro.ProcessMesg.Text = "Login to the interface...";//进度的信息
loginPro.Refresh();//刷新界面,使Label显示最新的进度信息。
MainForm f = new MainForm();
Navigater.Inialize(f.TabControl);
loginPro.Close();// 最后关闭进度界面进入主程序。
Application.Run(f);
2. 另外一种是在你导入数据等待的时候,你需要显示进度条,往往我们使用一张Gif图片来替代。但是我们往往明明设置了让图片的Visible=true;但是在你导入的时候就是不出现这张图片(也就是没有效果),其中主要的原因是主线程被你数据处理占用了,所以图片显示不出来。其中的解决办法是创建一个新的线程用于处理数据,主线程用于显示图片。最后使用.NET的委托来调用界面的刷新程序。
示例代码如下:
public partial class ImportDomBondPriceForm : Form
{
private DataTable dt;
private Thread thread = null;
private delegate void SetProcessBarUnVisibleDel();
private SetProcessBarUnVisibleDel unvisibleDel;
public ImportDomBondPriceForm()
{
InitializeComponent();
unvisibleDel = new SetProcessBarUnVisibleDel(RunCompleted);
}
private DataTable LoadPreviewData(string fileName)
{
DataSet dataSet = ExcelReader.Read(fileName);
if (dataSet.Tables.Count > 0)
{
DataTable dTable = dataSet.Tables[0];
for (int i = 0; i < dTable.Columns.Count; i++)
{
if (dTable.Rows[0][i].ToString().Trim() == "")
{
dTable.Columns.RemoveAt(i);
--i;
}
}
dTable.Rows.RemoveAt(0);
dTable.Columns[0].ColumnName = "RecordDate";
dTable.Columns[1].ColumnName = "Brand Name";
dTable.Columns[2].ColumnName = "ISBN";
dTable.Columns[3].ColumnName = "Currency";
dTable.Columns[4].ColumnName = "Evaluation Price";
return dTable;
}
else
{
return null;
}
}
private void btnOpen_Click(object sender, EventArgs e)
{
if (DialogResult.OK == this.openFileDialog.ShowDialog())
{
this.txtFileName.Text = openFileDialog.FileName;
RunStart();
thread = new Thread(Run);
thread.Start();
}
}
private void RunCompleted()
{
this.pictureBox1.Visible = false;
GVBind(dt);
}
private void RunStart()
{
this.pictureBox1.BringToFront();
this.pictureBox1.Visible = true;
}
private void Run()
{
dt = LoadPreviewData(txtFileName.Text);
this.Invoke(unvisibleDel);
}
private void GVBind(DataTable dTable)
{
dataGridView1.DataSource = dTable;
dataGridView1.Columns[0].Width = 150;
dataGridView1.Columns[1].Width = 300;
dataGridView1.Columns[2].Width = 100;
dataGridView1.Columns[3].Width = 50;
dataGridView1.Columns[4].Width = 100;
}
}