我使用下面的代码从数据库中获取数据并在dataGrid上显示数据如何在从数据库中获取数据时显示自定义进度条?
private void ReadRecords(){
using (SqlConnection c = new SqlConnection(Properties.Settings.Default.Database1ConnectionString)) {
try{
c.Open();
if (c.State == ConnectionState.Open) {
using (SqlDataAdapter a = new SqlDataAdapter("SELECT * FROM Items ORDER BY item_id", c)) {
try {
DataTable t = new DataTable();
a.Fill(t);
dataGridView1.DataSource = t;
}
catch(Exception ex){
MessageBox.Show("Failed Fill Data :." + ex);
return;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show("Failed To Open Connection :." + ex);
return;
}
}
}
答案 0 :(得分:1)
这里的“技巧”是适当地使用UI线程,如果您使用UI线程从数据库加载数据(通常由点击或加载事件产生),那么任何动画或进度指示器都将被冻结,因为UI线程忙于数据操作。您需要做的是线程输出或通过TPL“任务”完成数据加载操作,并在该操作完成时Invoke
关闭进度指示器的方法。
通过将数据操作线程化为非UI线程,UI线程可用于执行动画。这是一个详细说明如何调用UI线程的链接:
答案 1 :(得分:0)
最简单的解决方案是显示没有任何进度值的加载指示器。
ShowProgressIndicator();
ReadRecords()
HideProgressIndicator();
如果要显示实际进度,则必须确定工作量。例如,让我们说总行数是整个工作。您可以通过除fetched rows / total rows count
来计算进度百分比。您应该向数据库发出多个请求以实现此类进度条。
首先 - 请求总行数。 然后 - 按部分获取行,比如每个请求500行,直到获取所有行。