Почему этот код вставить в компоненте datagridview так медленно?


string s = Clipboard.GetText().Replace("\r", " ");
string[] lines = s.Split('\n');
int row = dgView.CurrentCell.RowIndex;
int col = dgView.CurrentCell.ColumnIndex;
int linesCount = lines.Count();
if ((row + linesCount) - dgView.RowCount > 0) dgView.Rows.Add((row + linesCount) - dgView.RowCount);

asyncSqlResultsViewer.publicToolStripProgressBar.Maximum = linesCount;
asyncSqlResultsViewer.publicToolStripProgressBar.Step = 1;
asyncSqlResultsViewer.publicToolStripProgressBar.Visible = true;
dgView.ReadOnly = true;

foreach (string line in lines)
{
    if (line.Length > 0)
    {
        string[] cells = line.Split('\t');
        for (int i = 0; i < cells.GetLength(0); ++i)
        {
            if (col + i < dgView.ColumnCount)
            {
                dgView[col + i, row].Value = cells[i];
            }
            else
            {
                break;
            }
        }
        row++;
    }
    else
    {
        break;
    }
    asyncSqlResultsViewer.publicToolStripProgressBar.PerformStep();
}

Это невероятно медленно. Оклейка 500 строк, 5 столбцов занимает около 30 секунд. Пожалуйста, примите во внимание, что там может быть уже данные в элементе управления datagridview и я не обязательно хочу, чтобы переопределить его (все зависит от стартовой клетки). Поэтому я не знаю, как я могу использовать объект DataTable и назначить его в качестве источника данных в случае, если у вас эта идея.



3543
5
задан 23 апреля 2011 в 04:04 Источник Поделиться
Комментарии
1 ответ

Я не уверен, что код как таковой, кроме того, что можно сделать, чтобы улучшить его, так долго при "нормальных" обстоятельствах. Я думал, что я на самом деле проверить это сам перед сном и так бросил что-то вместе, вот что я сделал...

Я создал приложение WinForms с помощью соответствующих элементов управления и потом использовал секундомер, только изменив свой код (забывая имена элементов управления), поместив его в метод с именем PasteData , который вернулся lineCount:

private readonly Stopwatch stopWatch = new Stopwatch();

private int PasteData()
{
//Your code.
}

private void dataGridView_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.V)
{
int linesExisting = dataGridView.RowCount;
stopWatch.Restart();
int linesPasted = PasteData();
stopWatch.Stop();
TimeSpan timeElapsed = stopWatch.Elapsed;

//UI Updates.
}
e.Handled = true;
}

Я запустил Excel и создано 700+ строк данных; 5 столбцов случайными текст повторно вставлено:


Axdcfg vkhjbkljhgvf hghbjkl;jbhg vguyhjknjhbgvyhjknb hkghjlkh,njjk;олкм,nhn
ghvbnmkl;kknjbhvghcgv gbhnmkknkjhbghfvghjkljhgfvhjklhbgvhkjlmnjbhgfcfgyhjknlmnn
ghvjbkmjnhyuiytui89766890i09u8y675tfvghbjnmkl,;м,nbhh
tf678cfghjbkm,.g90u87ygybihuionjhgvfctfygyuhio;jolkkjnhbvfc
iouy43212345678987654321234567890009876543212w3erfghgfdffcv

Затем я скопировал всю коллекцию из буфера обмена и продолжил флуд наше приложение с это количество почти 300 000 строк, и вот результаты:

enter image description here

Снижение производительности было абсолютно незначительным. Если что, это количество памяти, которое должно было стать проблемой.

У вас есть более конкретная информация по вашей ситуации? Мы должны определить Вы "нормальных" обстоятельствах. Формат и характер проверки данных будет приятно знать, что, в идеале, образец может быть предоставлен. Можно определить ожидаемые объемы данных, которые могут содержать. Кроме того, некоторые детали оборудования, вот некоторые из моих основных информация:


  • ОПЕРАТИВНАЯ ПАМЯТЬ: 2,00 ГБ

  • Процессор: AMD Турион 64 Х2 ТЛ-60 2.0 ГГц

  • ОС: Windows 7 максимальная 64бит

3
ответ дан 24 апреля 2011 в 01:04 Источник Поделиться