【发布时间】:2018-02-27 17:35:45
【问题描述】:
在加载 datagridview 时,我需要一些帮助来添加进度条。我已经有了加载 datagridview 的代码,但我们知道加载需要时间来完成加载,具体取决于记录。所以,我想添加一个进度条加载和一个计数从 1 到 100 的标签来完成。
我知道有一种使用后台工作句柄事件的方法,但不确定它是如何工作的。我想要一些简单但可以完成我需要的工作。
我的代码效果很好,可以根据需要填充 datagridview。但我需要在加载 datagridview 时添加进度条。
更改代码请查看并告诉我是否遗漏了什么。
所以我进行了更改,现在似乎可以工作,但是有一个问题是进度条不能立即工作,需要几秒钟,然后我可以看到进度条移动到 100%。为什么这样做?
加载 datagridview 后的第二个问题,当我单击消息 MessageBox.Show("Successful Completion."); 后,进度条颜色消失了;
这是我的组合框选择我们想要的值并显示数据网格视图后的测试图像
在这里我对程序进行了新的更改,但由于某种原因,在我选择了组合框后,datagridview 会正确填充,但是我有时会再试一次它会失败并给我这个错误
namespace DatagridViewProgressBar
{
public partial class Form1 : Form
{
//datagridview, bindingsource, data_apapter global objects variables
private DataGridView dataGridView = new DataGridView();
private BindingSource bindingSource = new BindingSource();
private SqlDataAdapter dataAdapter = new SqlDataAdapter();
DataTable dt = new DataTable();
//class objects
Databases lemars = new Databases();
Databases schuyler = new Databases();
Databases detroitlakeskc = new Databases();
public Form1()
{
InitializeComponent();
// To report progress from the background worker we set this property
dbWorker = new BackgroundWorker();
dbWorker.DoWork += new DoWorkEventHandler(dbWorker_DoWork);
dbWorker.ProgressChanged += new ProgressChangedEventHandler(dbWorker_ProgressChanged);
dbWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(dbWorker_RunWorkerCompleted);
dbWorker.WorkerReportsProgress = true;
dbWorker.WorkerSupportsCancellation = true;
}
private void btn_Exit_Click(object sender, EventArgs e)
{
this.Close();
}
private void comboBox_Database_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox_Database.SelectedItem.ToString() == "LeMars21St")
{
if (dbWorker.IsBusy != true)
{
dbWorker.RunWorkerAsync();
}
}
}
private void GetTableToDataGridView()
{
//prgBar_DataGridViewLoading
DatabaseColumns Obj = new DatabaseColumns();
String SqlcmdString = @"SELECT invoice, shipment, Project, invoiceDateTB, CreatedDate, typeName, exportedDate, statusName, total, import_status, Time_Completed, ERROR_DESCRIPTION FROM dbo.AllInvoicesInReadyStatus";
SqlDataReader reader;
int progress;
using (SqlConnection conn = new SqlConnection(lemars._LeMarsConnectionString))
{
reader = null;
SqlCommand Sqlcmd = new SqlCommand(SqlcmdString, conn);
conn.Open();
reader = Sqlcmd.ExecuteReader();
if (reader.HasRows)
{
try
{
dt.Load(reader);
for (int i = 0; i < dt.Rows.Count; i++)
{
Obj.Invoice = dt.Rows[i]["invoice"].ToString();
Obj.Shipment = dt.Rows[i]["shipment"].ToString();
Obj.Project = dt.Rows[i]["Project"].ToString();
Obj.InvoiceDateTB = Convert.ToDateTime(dt.Rows[i]["invoiceDateTB"]);
Obj.CreatedDate = Convert.ToDateTime(dt.Rows[i]["CreatedDate"]);
Obj.TypeName = dt.Rows[i]["typeName"].ToString();
Obj.ExportedDate = Convert.ToDateTime(dt.Rows[i]["exportedDate"]);
Obj.StatusName = dt.Rows[i]["statusName"].ToString();
Obj.Total = Convert.ToDecimal(dt.Rows[i]["total"]);
Obj.ImportStatus = dt.Rows[i]["import_status"].ToString();
if (!Convert.IsDBNull(dt.Rows[i]["Time_Completed"]))
{
Obj.TimeCompleted = Convert.ToDateTime(dt.Rows[i]["Time_Completed"]);
}
Obj.ErrorDescription = dt.Rows[i]["ERROR_DESCRIPTION"].ToString();
progress = i * 100 / dt.Rows.Count;
dbWorker.ReportProgress(progress);
Thread.Sleep(500);
}
}
finally
{
conn.Close();
}
}
}
}
private void dbWorker_DoWork(object sender, DoWorkEventArgs e)
{
GetTableToDataGridView();
dbWorker.ReportProgress(100);
}
private void dbWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar_GetTasks.Value = e.ProgressPercentage;
// eg: Set your label text to the current value of the progress bar
lbl_PercentageCount.Text = (progressBar_GetTasks.Value.ToString() + "%");
}
private void dbWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
dataGridView_ShowAllData.DataSource = dt;
if (e.Cancelled)
{
MessageBox.Show("Process Cancelled.");
}
else if (e.Error != null)
{
MessageBox.Show("Error occurred: " + e.Error.Message);
}
else
{
MessageBox.Show("Successful Completion.");
}
//progressBar_GetTasks.Value = 0;
}
private void btn_CancelOperation_Click(object sender, EventArgs e)
{
if (dbWorker.IsBusy)
{
dbWorker.CancelAsync();
}
}
}
}
【问题讨论】:
-
如果您不希望进度条在最后消失,请删除将值设置为 0 的行。
progressBar_GetTasks.Value = 0 -
声明一个新变量:
int progress;在for循环中添加两行:progress = i * 100 / dt.rows.count; dbWorker.ReportProgress(progress); -
最新的错误是因为你没有移动
GetTableToDataGridView()函数调用...你已经复制了!在您的事件处理程序comboBox_Database_SelectedIndexChanged中,删除GetTableToDataGridView()行。否则,您将启动一个新线程来进行处理,以及在主线程上进行处理。有时你会很幸运,这两个过程会重叠。有时你不会那么幸运,其中一个进程会先完成,你会得到一个异常。 -
没关系,你是对的,谢谢兄弟的帮助!!!!学到了很多。一切正常,我相信,如果不是,我会回复你。谢谢。 @PeterAbolins。
标签: c# sql-server c#-4.0