У меня есть приложение windows, в котором по нажатию кнопки оно извлекает данные из запроса Oracle, а при привязке источника данных gridview к таблице данных для загрузки 3500 записей требуется почти 5 минут.
Окончательный вид сетки выглядит следующим образом, который снова зависит от данных в нижней форме. При щелчке любой строки в первой сетке данные второй сетки также должны измениться, но теперь это занимает огромное время и кажется, что это своего рода любая фоновая задача, которую я не могу получить, так как я довольно новичок в winforms n ее событиях.
Таким образом, единственное, что осталось сделать, это сделать нумерацию страниц с 50 строками данных в первой сетке и теми же 50 строками для вторая сетка, которая будет затем меняться в соответствии с следующей кнопкой для извлечения данных до количества строк в datatable.
Прикреплен PI c того, как теперь выглядит окончательный вид таблицы данных -
Начальное попадание кода здесь -
[CommandMethod(Constants.CommandViewJobHistory, CommandFlags.Interruptible | CommandFlags.NoInternalLock | CommandFlags.Session | CommandFlags.Redraw)]
public static void ViewJobHistoryCmd()
{
try
{
ViewJobData.ViewJobHistory(WorkspaceManager.map3DApplication);
}
catch (System.Exception ex)
{
Constants.LogError.Info(CommonResource.LoggerTitle, ex);
throw;
}
}
Затем дело доходит до метода ViewJobHistory-
public static void ViewJobHistory(Autodesk.Map.IM.Forms.Application m3dApplication)
{
try
{
if (m3dApplication != null && m3dApplication.Documents != null && m3dApplication.Documents.Count > 0 && m3dApplication.Documents.Active != null)
{
Document imDocument = m3dApplication.Documents.Active;
if (imDocument.Connection.IsJobEnabled)
{
Job selectedJob = imDocument.Connection.Jobs.Selected;
if (selectedJob != null)
{
if (selectedJob.Name == "Live")
MessageBox.Show("Active job name is Live. Please select the job & Continue", JobResource.MessageBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Information);
else if (selectedJob.Name == "Pending")
MessageBox.Show("Active job name is Pending. Please select the job & Continue", JobResource.MessageBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Information);
else
{
ViewSelectedJobHistory(imDocument, selectedJob);
}
}
}
else
MessageBox.Show("Current model is not job enabled, Please enable job and Continue");
}
}
catch (System.Exception ex)
{
ErrorHandlerDelegate.DisplayError(ex, logger);
}
}
После этого он обращается к методу ViewSelectedJobHistory -
private static void ViewSelectedJobHistory(Document imDocument, Job selectedJob)
{
DataTable dataTable = new DataTable();
try
{
if (imDocument != null && selectedJob != null)
{
string query =JobResource.QueryJobHistory;
using (Command imCommand = new Command(query, imDocument.Connection))
//using (Command imCommand = new Command(string.Format("SELECT FID,F_CLASS_NAME,JOB_OPERATION_TYPE,OPERATION_DATE FROM JOB_EXPLORER_FETCH WHERE JOB_ID={0}", selectedJob.ID), imDocument.Connection))
//using (Command imCommand = new Command(query, imDocument.Connection))
{
imCommand.Parameters.Add(new DataParameter("1", DbDataType.String, selectedJob.ID.ToString(), ParameterDirection.Input));
using (DataAdapter dataAdapter = new DataAdapter(imCommand))
{
dataAdapter.Fill(dataTable);
if (dataTable != null && dataTable.Rows.Count > 0)
{
if (instanceJob == false)
{
ViewSelectedJobHistory viewSelectedJobHistory = new ViewSelectedJobHistory(imDocument, dataTable, selectedJob);
viewSelectedJobHistory.Show();
instanceJob = true;
}
}
else
MessageBox.Show("No data edited in selected job", JobResource.MessageBoxTitle, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
catch (System.Exception)
{
throw;
}
finally
{
if (dataTable != null)
dataTable.Dispose();
}
}
Теперь этот метод используется из (ViewSelectedJobHistory viewSelectedJobHistory = new ViewSelectedJobHistory (imDocument, dataTable, selectedJob);), который устанавливает таблицу данных в объект и проверяет соединение -
public ViewSelectedJobHistory(Document im3DDocument, DataTable dataTable, Job selectedJob)
{
//ViewSelectedJobHistory viewSelectedJobHstry = SCE.TDBU.Map3D.JobManagement.ViewSelectedJobHistory.insCreation(imApplication);
InitializeComponent();
dataTableJobHistory = dataTable;
imJob = selectedJob;
imCurrentDocument = im3DDocument;
GetLiveConnection(imCurrentDocument);
}
После этого это переходит к viewSelectedJobHistory.Show (); он использует другой метод, но не уверен, каким образом -
private void ViewSelectedJobHistory_Load(object sender, EventArgs e)
{
string path = @"c:\Temp\MyTest.txt";
DateTime time1 = DateTime.Now;
try
{
this.Cursor = Cursors.WaitCursor;
if (dataTableJobHistory != null && dataTableJobHistory.Rows.Count > 0)
{
dgvJobEditsHistory.DataSource = null;
//dgvJobEditsHistory.AutoSizeColumnsMode = 0;
//dgvJobEditsHistory.AutoSizeRowsMode = 0;
dgvJobEditsHistory.ColumnHeadersVisible = false;
dgvJobEditsHistory.DataSource = dataTableJobHistory;
dgvJobEditsHistory.ColumnHeadersVisible = true;
dgvJobEditsHistory.RowHeadersWidth = 30;
dgvJobEditsHistory.Columns[1].Width = 130;
dgvJobEditsHistory.Columns[2].Width = 140;
dgvJobEditsHistory.Columns[3].Width = 130;
jobId.Text += imJob.ID.ToString();
jobName.Text += imJob.Name.ToString();
CreatedBy.Text += imJob.UserCreated;
CreatedDate.Text += imJob.DateCreated.ToString();
this.Cursor = Cursors.Default;
}
}
catch (System.Exception ex)
{
this.Cursor = Cursors.Default;
ErrorHandlerDelegate.DisplayError(ex, logger);
}
Здесь при назначении источника данных gridview для datable (dgvJobEditsHistory.DataSource = dataTableJobHistory;), это то, что занимает так много времени для выполнения, и хотя я приостанавливаю решение и смотрю на «dataTableJobHistory», он выдает следующее сообщение об ошибке -
Cannot evaluate expression because a thread is stopped at a point where garbage collection is impossible, possibly because the code is optimized.
Я не уверен, является ли это проблемой или нет, но когда она попадает в dgvJobEditsHistory.DataSource = dataTableJobHistory; когда я нажимаю f11, он приходит сюда -
private void dgvJobEditsHistory_SelectionChanged(object sender, EventArgs e)
{
try
{
if (dgvJobEditsHistory != null && dgvJobEditsHistory.Rows.Count > 0 && dgvJobEditsHistory.SelectedRows != null)
{
int index = dgvJobEditsHistory.CurrentCell.RowIndex;
DataGridViewRow drgRow = dgvJobEditsHistory.Rows[index];
if (drgRow != null)
{
if (dgvJobEditsHistory.SelectedRows.Count > 1)
{
Console.WriteLine(DateTime.UtcNow + " entered if rowcount grtr than 1");
dicCollection = new Dictionary<long, string>();
foreach (DataGridViewRow row in dgvJobEditsHistory.SelectedRows)
{
dicCollection.Add((Convert.ToInt64(row.Cells[JobResource.FieldFID].Value)), (row.Cells[JobResource.FieldFClassName].Value.ToString()));
}
Console.WriteLine(DateTime.UtcNow + " exited if rowcount grtr than 1");
}
else
{
Console.WriteLine(DateTime.UtcNow + " entered if rowcount not grtr than 1");
dicCollection = new Dictionary<long, string>();
dicCollection.Add((Convert.ToInt64(drgRow.Cells[JobResource.FieldFID].Value)), (drgRow.Cells[JobResource.FieldFClassName].Value.ToString()));
Console.WriteLine(DateTime.UtcNow + " exited if rowcount not grtr than 1");
}
oldValue = index;
fidFeature = drgRow.Cells[JobResource.FieldFID].Value.ToString();
string featureClassName = drgRow.Cells[JobResource.FieldFClassName].Value.ToString();
string jobOperationType = drgRow.Cells[JobResource.FieldJobOperationType].Value.ToString();//INSERT, UPDATE, DELETE
activeJob = imJob;
Job liveJob = imCurrentDocument.Connection.Jobs[JobResource.JobStateLive];
Console.WriteLine(DateTime.UtcNow + " entered if feature edits not null");
using (dtFeatureEditHistory = GetFeatureEditHistory(liveJob, activeJob, fidFeature, featureClassName, jobOperationType))
{
if (dtFeatureEditHistory != null)
{
dataGridViewFeatureEdits.DataSource = dtFeatureEditHistory;
}
}
Console.WriteLine(DateTime.UtcNow + " exited if feature edits not null");
if (dataGridViewFeatureEdits.Rows.Count > 0)
{
lst = new ArrayList();
attributeCount = new ArrayList();
Console.WriteLine(DateTime.UtcNow + " entered for loop featureedits greater than 0");
for (int iRow = 0; iRow < dataGridViewFeatureEdits.Rows.Count; iRow++)
{
attributeCount.Add(dataGridViewFeatureEdits.Rows.Count);
DataGridViewCell activeJobValue = dataGridViewFeatureEdits.Rows[iRow].Cells[1];
DataGridViewCell liveJobValue = dataGridViewFeatureEdits.Rows[iRow].Cells[2];
if (activeJobValue.Value.ToString() != liveJobValue.Value.ToString())
{
dataGridViewFeatureEdits.Rows[iRow].Cells[1].Style.ForeColor = Color.Red;
lst.Add(iRow);
activeJobValue.Style.ForeColor = Color.Red;
liveJobValue.Style.ForeColor = Color.Red;
}
}
Console.WriteLine(DateTime.UtcNow + " exited for loop featureedits greater than 0");
Console.WriteLine(DateTime.UtcNow + " entered setting column width");
dataGridViewFeatureEdits.RowHeadersWidth = 30;
dataGridViewFeatureEdits.Columns[0].Width = 130;
dataGridViewFeatureEdits.Columns[1].Width = 157;
dataGridViewFeatureEdits.Columns[2].Width = 157;
Console.WriteLine(DateTime.UtcNow + " exited setting column width");
}
}
}
}
catch (Exception ex)
{
ErrorHandlerDelegate.DisplayError(ex, logger);
}
finally
{
//multipleFids.Clear();
}
}
Наконец, чтобы подвести итог, я попытался найти проблему, но не смог найти проблему, почему это занимает так много времени, и теперь я хочу знать, хочу ли я сделать пользовательская нумерация страниц для этого, как бы я это сделал, так как я не уверен, с чего начать и где внести изменения.
Любая помощь будет высоко ценится.