Проблема производительности C # ReoGrid при привязке данных с формулой - PullRequest
0 голосов
/ 20 ноября 2018

Я заполнил свою таблицу данных случайными значениями и формулой, такой как = SUM (A1: A2) , когда в таблице данных имеется 150 столбцов и 4000 строк, тогда ReoGrid занимает около 20 минут.

когда я заполняю ReoGrid без формулы, тогда заполнение ReoGrid занимает несколько секунд, но в тот момент, когда многие формулы SUM присваиваются ячейке динамически, тогда ReoGrid занимает много времени для заполнения.

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

, скажите, пожалуйста, как я могу упростить логику для заполнения сетки формулой.Есть ли способ увеличить производительность моего кода с формулой, в результате ReoGrid может быть заполнен в течение нескольких секунд или нескольких минут.

Ищете предложения и рекомендации.ReoGrid - бесплатный компонент для приложения winform https://reogrid.net/.

Вот мой код

private void btnBindTable_Click(object sender, EventArgs e)
{
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    string strSum = "", strColName, strImmediateOneUp = "", strImmediateTwoUp = "";

    int startsum = 0;
    int currow = 0;
    bool firstTimeSum = true;

    int NumRows = 4000;
    int NumColumns = 150;

    var sheet = reoGrd.CurrentWorksheet;
    sheet.Resize(NumRows, NumColumns);  // resize 

    DataTable dt = new DataTable();

    for (int col = 0; col < NumColumns; col++)
    {
        strColName = GenerateColumnText(col);
        DataColumn datacol = new DataColumn(strColName, typeof(string));
        dt.Columns.Add(datacol);
    }


    for (int row = 0; row < NumRows; row++)
    {
        dt.Rows.Add();

        for (int col = 0; col < NumColumns; col++)
        {
            if (row < 2)
            {
                dt.Rows[row][col] = new Random().Next(1, NumRows).ToString("D2"); 
            }
            else
            {
                if (firstTimeSum)
                {
                    if (row - currow == 2)
                    {
                        currow = row;
                        startsum = 0;
                        firstTimeSum = false;
                    }
                    else
                    {
                        startsum = 1;
                    }
                }
                else
                {
                    if (row - currow == 3)
                    {
                        currow = row;
                        startsum = 0;
                    }
                }


                if (startsum == 0)
                {
                    strColName = GenerateColumnText(col);
                    strImmediateOneUp = strColName + ((row + 1) - 1).ToString();
                    strImmediateTwoUp = strColName + ((row + 1) - 2).ToString();
                    dt.Rows[row][col] = strSum; 

                    string cellname = GenerateColumnText(col) + (row + 1).ToString();
                    var cell = sheet.Cells[cellname];
                    cell.Style.BackColor = Color.LightGoldenrodYellow;
                }
                else
                {
                    dt.Rows[row][col] = new Random().Next(1, NumRows).ToString("D2"); 
                }
            }

        }

        startsum = 1;
    }

    sheet["A1"] = dt;

    stopwatch.Stop();
    TimeSpan timeSpan = stopwatch.Elapsed;

    MessageBox.Show(string.Format("Time elapsed: {0}h {1}m {2}s {3}ms", timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds));

}
...