Как сделать пользовательское разбиение на страницы в элементе управления сетки данных с настраиваемыми атрибутами, сопоставленными с нисходящей сеткой - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть приложение windows, в котором по нажатию кнопки оно извлекает данные из запроса Oracle, а при привязке источника данных gridview к таблице данных для загрузки 3500 записей требуется почти 5 минут.

Окончательный вид сетки выглядит следующим образом, который снова зависит от данных в нижней форме. При щелчке любой строки в первой сетке данные второй сетки также должны измениться, но теперь это занимает огромное время и кажется, что это своего рода любая фоновая задача, которую я не могу получить, так как я довольно новичок в winforms n ее событиях.

Таким образом, единственное, что осталось сделать, это сделать нумерацию страниц с 50 строками данных в первой сетке и теми же 50 строками для вторая сетка, которая будет затем меняться в соответствии с следующей кнопкой для извлечения данных до количества строк в datatable.

Прикреплен PI c того, как теперь выглядит окончательный вид таблицы данных - enter image description here

Начальное попадание кода здесь -

   [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();
            }

        }

Наконец, чтобы подвести итог, я попытался найти проблему, но не смог найти проблему, почему это занимает так много времени, и теперь я хочу знать, хочу ли я сделать пользовательская нумерация страниц для этого, как бы я это сделал, так как я не уверен, с чего начать и где внести изменения.

Любая помощь будет высоко ценится.

...