【问题标题】:DataGridView takes a long time to update using OracleDataAccess.Fill(datatable)使用 OracleDataAccess.Fill(datatable) 更新 DataGridView 需要很长时间
【发布时间】:2021-12-25 13:34:08
【问题描述】:

我的应用程序中有一个 DataGridView 也有一个执行 oracle 函数并带来数据的函数。但是当这个返回很大时,每次刷新需要20到40秒来处理和填充表,直到数据量减少。这些表大约有 12 列,当处理超过 50~60 行时会出现问题。

oracle 中的查询很简单,不会出现这么慢的情况。 是否有任何替代方法或任何方法来优化此过程?当应用程序在第一个位置一次使用一个数据时,我会更新表。

获取函数:

        public DataTable GetWorkList(int ordenamiento)
        {
            DataTable dtTemp = new DataTable();            

            OracleConnection oraConn = new 
            OracleConnection(this.mesParameters.DBConnectionString);
            OracleCommand oraComm = new OracleCommand();
            OracleDataAdapter oraDA = new OracleDataAdapter();
            OracleParameter oraParam;
            OracleParameter oraParamReturn;

            //Logger.Info("Procedure GETWORKLIST BEGIN");

            try
            {
                oraComm.Connection = oraConn;
                oraComm.BindByName = true;
                oraComm.CommandType = CommandType.StoredProcedure;                                

                oraComm.CommandText = "PG_SL_IPR_WORKLIST_RF3";

                oraParam = new OracleParameter("PR_ORDER", OracleDbType.Int32, ordenamiento, ParameterDirection.Input);
                oraComm.Parameters.Add(oraParam);

                oraParamReturn = new OracleParameter("RETURN", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
                oraComm.Parameters.Add(oraParamReturn);

                
                oraConn.Open();
                //Logger.Info("conexão aberta");
                //Logger.Info("oraDA Select BEGIN");
                oraDA.SelectCommand = oraComm;
                //Logger.Info("oraDA Select END");

                //Logger.Info("FILL BEGIN");
                oraDA.Fill(dtTemp);
                //Logger.Info("FILL END");
            }
            catch (Exception ex)
            {
                this.mesMessages.OKButtonMessage("GetWorkList\r\n" + ex.Message, "MES", System.Windows.Forms.MessageBoxIcon.Error);
            }
            finally
            {
                if(oraConn.State == ConnectionState.Open)
                {
                    oraConn.Close();
                    //Logger.Info("conexão fechada");
                }
            }
            //Logger.Info("Procedure GETWORKLIST END");
            return dtTemp;
        }

设置数据网格视图

public void SetDataGridView(Parameters prParameters, DataTable prTableInfo, String prTableConfigName)
        {
            DataGridViewColumn dgvColumn;
            String[] strConfigColumnValues;

            try
            {
                this.Columns.Clear();

                for (Int16 i = 0; i < prTableInfo.Columns.Count; i++)
                {
                    // Get the config values for each column in order according the query
                    strConfigColumnValues = prParameters.GetParameter(prTableConfigName, prTableInfo.Columns[i].ColumnName.Trim().Replace(' ', '_').ToUpper()).Split('-');

                    dgvColumn = new DataGridViewTextBoxColumn();

                    dgvColumn.DataPropertyName = prTableInfo.Columns[i].ColumnName;
                    dgvColumn.Name = prTableInfo.Columns[i].ColumnName.Trim().Replace(' ', '_').ToUpper();
                    dgvColumn.HeaderText = strConfigColumnValues[0].Trim();
                    dgvColumn.Width = Convert.ToInt32(strConfigColumnValues[1].Trim());
                    dgvColumn.ReadOnly = Convert.ToBoolean(strConfigColumnValues[2].Trim());
                    dgvColumn.Visible = Convert.ToBoolean(strConfigColumnValues[3].Trim());

                    dgvColumn.Resizable = DataGridViewTriState.False;
                    dgvColumn.SortMode = DataGridViewColumnSortMode.NotSortable;

                    this.Columns.Add(dgvColumn);
                }

                this.DataSource = prTableInfo;
            }
            catch (Exception ex)
            {                
                message.OKButtonMessage(ex.Message);
            }
        }

【问题讨论】:

  • 分析您的代码以找出哪个部分是耗时的过程。也不清楚您调用此代码的频率。
  • @GustavoMorilla 抛出异常(即使它们会被忽略)可能会导致非常糟糕的延迟。但是您应该检查 VS 中的输出窗口,确保显示异常消息,或者只需从“调试”菜单/“异常设置”中选择所有 CLR 异常。只是为了确保不涉及异常。
  • 对不起,我错过了您的回复……如果列没有改变,那么,在方法“外部”添加列并删除行……this.Columns.Clear(); 以及重新构建列的代码。您应该只需要更改网格数据源。更改数据源将自动删除现有行。
  • 当你有超过 50 行时你是否在测试这个(当你说它很慢时)?读取文本文件是您能做的最慢的事情之一。
  • 一开始就从文本文件中读取一次数据,并存储在列表或字典中(不知道你的文本文件长什么样子),然后在需要时参考信息。

标签: c# winforms datagridview


【解决方案1】:

将大量数据加载到 datagridview 中的最佳技术是使用“分页”技术

【讨论】:

  • 50-60行数据量不算大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多