如何使用datagridview链接进度条 [英] How to link a progressbar with datagridview
本文介绍了如何使用datagridview链接进度条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Hi
我在点击按钮时尝试将进度条与datagridview链接。问题是在进度条开始运行之前获取了datagridview。
我如何编辑我的代码,以便在获取/填充datagridview时,进度条显示进度。
我正在使用背景工作者。
Hi
I'm trying to link a progressbar with datagridview when a button is clicked.The problem is that the datagridview is fetched before the progressbar starts to run.
How can i edit my code so that the progressbar show me the progress while the datagridview is fetch / filled.
I'm using a Backgroundworker.
/* Backgroundworker for the progressBar*/
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int sum = 0;
//for (int i = 1; i <= 100; i++)
for (int i = 0; i < datagridview1.Rows.Count - 1; i++)
{
Thread.Sleep(10);
sum = sum + i;
backgroundWorker1.ReportProgress(i);
if (backgroundWorker1.CancellationPending)
{
e.Cancel = true;
backgroundWorker1.ReportProgress(0);
return;
}
}
e.Result = sum;
}
按钮功能:
The Button function:
private void btnShow_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
if (cb1.SelectedItem != null && cb2.SelectedItem != null)
{
string C = ConfigurationManager.ConnectionStrings["D"].ConnectionString;
SqlConnection con = new SqlConnection(C);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = ("[dbo].[spData]");
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@Table_Name", cb1.SelectedValue.ToString());
cmd.Parameters.AddWithValue("@Table_Name2", cb2.SelectedValue.ToString());
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
if (cb1.SelectedValue.ToString() != null && cb2.SelectedValue.ToString() != null)
{
try
{
con.Open();
dt = new System.Data.DataTable();
adapter.Fill(dt);
//datagridview1.AutoGenerateColumns = true;
datagridview1.DataSource = dt;
lbtblCount.Text = cb1.Text + " Anzahl : " + datagridview1.Rows.Count.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
}
else
{
MessageBox.Show("Safety check");
}
// Check if the backgroundworker is already busy running the asynchronous operation
if (!backgroundWorker1.IsBusy)
{
//This method will start the execution asynchronously in the background
backgroundWorker1.RunWorkerAsync();
}
else
{
label7.Text = " Busy processing, please wait";
}
}
很乐意提供帮助
Would be glad for an help
推荐答案
请检查
初学者的BackgroundWorker类示例 [ ^ ]
您好,
这里有一个示例检查这个
Hi,
Here a sample check this
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
BackgroundWorker bw;
bool isGetDataFromDb = false;
int progressCount = 0;
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Clear();
dataGridView1.AutoGenerateColumns = false;
this.progressBar1.Value = 0;
bw = new BackgroundWorker();
bw.DoWork += (s, se) =>
{
se.Result = FillDatagRide();
isGetDataFromDb = true;
};
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.WorkerSupportsCancellation = true;
bw.WorkerReportsProgress = true;
bw.RunWorkerAsync();
//just to show progress bar till data get from db.
for (int i = 1; i < 50; i++)
{Thread.Sleep(50);
if (isGetDataFromDb)
{
break;
}
bw.ReportProgress(++progressCount);
}
}
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
ArrayList result = e.Result as ArrayList;
foreach (var item in result)
{
Thread.Sleep(100);
this.progressBar1.Value = ++progressCount;
Invoke((MethodInvoker)(() => dataGridView1.Rows.Add(item)));
}
this.progressBar1.Value=100;
}
private ArrayList FillDatagRide()
{
//Code Get data from db
Thread.Sleep(1000);
return new ArrayList();//contain data from db
}
}
这篇关于如何使用datagridview链接进度条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文