Добавление большого количества строк в DataGridView вызывает System.OutOfMemoryException - PullRequest
1 голос
/ 28 февраля 2011

Я использую этот код для добавления строк в мой DataGridView из отформатированной строки через запятую.

public void addRows(ArrayList keywords)
{
    try
    {
        foreach (string keyword in keywords)
        {
            bool already_exists = false;

            string[] row = keyword.Split(',');

            foreach (DataGridViewRow row2 in keywords_grid.Rows)
            {
                string keyword2 = keywords_grid.Rows[row2.Index].Cells[0].Value.ToString().Trim();

                if (row[0] == keyword2)
                {
                    already_exists = true;
                    continue;
                }
            }

            if (already_exists) continue;

            int n = keywords_grid.Rows.Add();

            keywords_grid.Rows[n].Cells[0].Value = row[0];
            keywords_grid.Rows[n].Cells[1].Value = row[1];
            keywords_grid.Rows[n].Cells[2].Value = getSourceIcon(row[2]);
            keywords_grid.Rows[n].Cells[2].ToolTipText = row[2].Trim().ToUpper();

            gridChanged = true;
        }
    }
    catch (Exception ex){}
}

private Icon getSourceIcon(string _color)
{
    string color = _color.ToLower();

    switch (color)
    {
        case "red":
            return Properties.Resources.red_icon;
        case "yellow":
            return Properties.Resources.yellow_icon;
        case "green":
            return Properties.Resources.green_icon;
        case "user input":
            return Properties.Resources.user_input_icon;
        default:
            return Properties.Resources.user_input_icon;
    }
}

Я получаю ошибку:

An unhandled exception of type 'System.OutOfMemoryException' occurred in System.Windows.Forms.dll

Additional information: Out of memory.

Когда количество строк> 4000.

Я прокомментировал каждую часть кода и обнаружил, что когда я комментирую эту часть:

    /*int n = keywords_grid.Rows.Add();

    keywords_grid.Rows[n].Cells[0].Value = row[0];
    keywords_grid.Rows[n].Cells[1].Value = row[1];
    keywords_grid.Rows[n].Cells[2].Value = getSourceIcon(row[2]);
    keywords_grid.Rows[n].Cells[2].ToolTipText = row[2].Trim().ToUpper();*/

Ошибка не возникает.

Почему происходит эта ошибка и как я могу ее избежать?

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

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

1 голос
/ 28 февраля 2011

Обычно большая сетка должна обрабатываться с использованием режима виртуальных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...