【发布时间】:2017-08-01 16:11:30
【问题描述】:
我需要有关我的应用程序的帮助,我的应用程序中的一切都正常,但我想添加最后一个细节,以帮助用户使用该应用程序。
我有一个组合框,其中包含三个用户将使用的选项,每个选项都有不同的仓库数据库环境。因此,如果他们在组合框warehouse1 中选择,那么会将数据库 1 表数据加载到 datagridview,但是当他们选择应用程序时正在加载以显示数据,因此何时执行此操作取决于数据量有时需要 5 到 15 秒才能加载或更多我想添加一个进度条,以便让用户知道等到进度达到 100%。
因此,我需要有关如何在 datagridview 加载数据时使进度条正常工作的帮助。如果您需要更多信息,请告诉我。
更改后请检查,但我收到错误消息 [![在此处输入图片描述][1]][1]
//the issue I am having is the progress bar to while the datagridview is loading, the datagridview will load after the user selects the combobox selection
//the combobox event handler will fill the datagridview and the forms loads and I want while loading the progress bar to show the percentage that is loading 1 to 100%
更新代码: //全局变量 //datagridview, bindingsource, data_aapter 全局对象变量 私有 DataGridView dataGridView = new DataGridView(); 私有 BindingSource bindingSource = new BindingSource(); 私有 SqlDataAdapter dataAdapter = new SqlDataAdapter();
//class objects
Databases lemars = new Databases();
Databases schuyler = new Databases();
Databases detroitlakeskc = new Databases();
/*
* The GetLeMarsConnectionDatabaseConnection method starts the database string connection for warehouse LeMars21St
*/
private void GetLeMarsConnectionDatabaseConnection(string selectCommand, Databases database)
{
try
{
//Create the connection string, data adapter and data table.
String connectionString = database.LeMarsConnectionString;
// Specify a connection string. Replace the given value with a
// valid connection string for a Northwind SQL Server sample
// database accessible to your system.
// Create a new data adapter based on the specified query.
dataAdapter = new SqlDataAdapter(selectCommand, connectionString);
// Create a command builder to generate SQL update, insert, and
// delete commands based on selectCommand. These are used to
// update the database.
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);
// Populate a new data table and bind it to the BindingSource.
System.Data.DataTable table = new System.Data.DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
dataAdapter.Fill(table);
bindingSource.DataSource = table;
// Resize the DataGridView columns to fit the newly loaded content.
dataGridView_ShowAllData.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
}
//catch the error if cannot get a database connection
catch (SqlException)
{
MessageBox.Show("FootPrint-LEMARS Database couldn't received a connection ***ERROR***");
}
}
private void cmb_DatabaseSelection_SelectedIndexChanged(object sender, EventArgs e)
{
//Boolean selection statements to Fill the DataGridView based on the user selecction
if (cmb_DatabaseSelection.SelectedItem == "LeMars21St")
{
dataGridView_ShowAllData.DataSource = bindingSource;
//query with 11 columns
GetLeMarsConnectionDatabaseConnection("Select * from dbo.AllInvoicesInReadyStatus", lemars);
}
private void bgnWorker_LoadingForm_DoWork(object sender, DoWorkEventArgs e)
{
// TODO: query your database
// for easier reading I assume that your query-result has only one column
//string query = @"Select * from dbo.AllInvoicesInReadyStatus";
//** did you strip your sql-execution-code? have a look at https://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlcommand.aspx
var queryResult = new List<object>();
bgnWorker_LoadingForm.ReportProgress(10);
var table = new System.Data.DataTable();
// TODO: create matching columns for your query-result in the datatable
// https://msdn.microsoft.com/de-de/library/system.data.datatable.newrow(v=vs.110).aspx
// Create new DataTable and DataSource objects.
// Declare DataColumn and DataRow variables.
DataColumn column;
DataRow row;
DataView view;
// Create new DataColumn, set DataType, ColumnName, and add to DataTable.
column = new DataColumn();
column.DataType = typeof(string);
column.ColumnName = "invoice";
table.Columns.Add(column);
// Create second column.
column = new DataColumn();
column.DataType = typeof(string);
column.ColumnName = "shipment";
table.Columns.Add(column);
// Create third column.
column = new DataColumn();
column.DataType = typeof(string);
column.ColumnName = "Project";
table.Columns.Add(column);
// Create fourth column.
column = new DataColumn();
column.DataType = typeof(DateTime);
column.ColumnName = "invoiceDateTB";
table.Columns.Add(column);
// Create fifth column.
column = new DataColumn();
column.DataType = typeof(DateTime);
column.ColumnName = "CreatedDate";
table.Columns.Add(column);
// Create sixth column.
column = new DataColumn();
column.DataType = typeof(string);
column.ColumnName = "typeName";
table.Columns.Add(column);
// Create seventh column.
column = new DataColumn();
column.DataType = typeof(string);
column.ColumnName = "statusName";
table.Columns.Add(column);
// Create eighth column.
column = new DataColumn();
column.DataType = typeof(decimal);
column.ColumnName = "total";
table.Columns.Add(column);
// Create ninth column.
column = new DataColumn();
column.DataType = typeof(string);
column.ColumnName = "import_status";
table.Columns.Add(column);
// Create tenth column.
column = new DataColumn();
column.DataType = typeof(DateTime);
column.ColumnName = "Time_Completed";
table.Columns.Add(column);
// Create eleventh column.
column = new DataColumn();
column.DataType = typeof(string);
column.ColumnName = "ERROR_DESCRIPTION";
table.Columns.Add(column);
for (var i = 0; i < queryResult.Count; i++)
{
var progress = 10 + (int)((float)i / queryResult.Count) * 90;
bgnWorker_LoadingForm.ReportProgress(progress);
//** dont know whats going on here
//** but normally you should iterate your data-reader here and transfer the data of your query result to the created row... like this: https://msdn.microsoft.com/de-de/library/haa3afyz(v=vs.110).aspx
row = table.NewRow();
row["invoice"].ToString();
row["shipment"].ToString();
row["Project"].ToString();
row["invoiceDateTB"] = typeof(DateTime);
row["CreatedDate"] = typeof(DateTime);
row["typeName"].ToString();
row["statusName"].ToString();
row["total"] = typeof(decimal);
row["import_status"].ToString();
row["Time_Completed"] = typeof(DateTime);
row["ERROR_DESCRIPTION"].ToString();
table.Rows.Add(row);
// TODO: add the row data to the table
// same link as before: https://msdn.microsoft.com/de-de/library/system.data.datatable.newrow(v=vs.110).aspx
}
//**begin: move this stuff to worker completed
// Create a DataView using the DataTable. .
view = new DataView(table);
//**end
// Set a DataGrid control's DataSource to the DataView.
dataGridView_ShowAllData.DataSource = view;
e.Result = table;
}
private void bgnWorker_LoadingForm_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
System.Data.DataTable table = (System.Data.DataTable)e.Result;
// TODO: Check for errors
// TODO: Assign the table to your grid
// TODO: unlock your ui, hide progress dialog
}
private void bgnWorker_LoadingForm_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// TODO: update your progress dialog/progressbar, f.e.
prgBar_DataGridViewLoading.Value = e.ProgressPercentage;
}
private void button1_Click(object sender, EventArgs e)
{
if (bgnWorker_LoadingForm.IsBusy) return;
bgnWorker_LoadingForm.RunWorkerAsync();
// TODO: lock your ui, show progress dialog or progressbar...
}
【问题讨论】:
-
您无法使用填充方法来执行此操作,因为您无法控制循环。您必须调整查询和代码以获取记录计数,然后循环通过记录以使用单独的线程填充您的表。或者只是将进度条设置为标记样式。
-
我明白了,你能举例说明在填充 datadridview 或进度条标记样式时进行控制
-
progressBar1.Style = ProgressBarStyle.Marquee; -
你能展示一个完整的代码它是如何工作的吗?我对进度条或datagridview的控制做得不多
-
你的代码根本无法做到这一点。您必须编写不同的 sql 来获取数据块,并在执行每个查询后增加进度条。这会增加大量复杂性并使整个过程变慢。
标签: c# sql-server c#-4.0