Member 14588284 Ответов: 2

Ускорение коды писать текстовое поле элемента управления datagridview


Привет как я могу ускорить свои коды при записи данных richtextbox в datagridview

у меня есть 35000 строк в richtextbox

я проверил свои коды ;
но только 1000 строк пишут 1 минуту

так что когда все записи данных закончены вставлено 35 минут

Что я уже пробовал:

With STOK_LIST

          .Rows.Clear()
          For x = 0 To RichTextBox1.Lines.Count - 1
              Dim tx = RichTextBox1.Lines(x).ToString
              If tx <> "" Then
                  Dim i = STOK_LIST.Rows.Add
                  Label1.Text = +i
                  .Rows(i).Cells(0).Value = tx.Split(vbTab)(0)
                  .Rows(i).Cells(1).Value = tx.Split(vbTab)(1)
                  .Rows(i).Cells(2).Value = tx.Split(vbTab)(2)
                  .Rows(i).Cells(3).Value = tx.Split(vbTab)(3)
                  .Rows(i).Cells(4).Value = tx.Split(vbTab)(4)
                  .Rows(i).Cells(5).Value = tx.Split(vbTab)(5)
                  .Rows(i).Cells(6).Value = tx.Split(vbTab)(6)
                  .Rows(i).Cells(7).Value = tx.Split(vbTab)(7)
                  .Rows(i).Cells(8).Value = tx.Split(vbTab)(8)
                  .Rows(i).Cells(9).Value = tx.Split(vbTab)(9)
                  .Rows(i).Cells(10).Value = tx.Split(vbTab)(10)

              End If
          Next

      End With

0x01AA

Первое, что я бы попробовал, - это разделить исходную строку _one_ time и использовать один результат для присвоения ячейке 0 значения 10.

Вот также некоторые намеки относительно BeginUpdate ... .net - BeginUpdate / EndUpdate для запроса DataGridView - переполнение стека[^]

Member 14588284

я не могу открыть сайт переполнения стека для наших правил прокси-сервера компании
можете ли вы помочь подготовить код example

0x01AA

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

0x01AA

Я только что сделал небольшой тест на c#.
а) заполнение RichtTextBox 35'000 строк
b.) цикл над RichTextBox-линиями и только доступ построчно без дальнейшей обработки.

И это требует времени.... похоже, 30 минут. Для меня это выглядит так, как будто RichTextBox-это узкое место.

Откуда изначально берутся данные для RichTextBox? Из досье? Если да, то я предлагаю обойти RichTextBox.

Member 14588284

я копирую строки из файла excel, а затем вставляю их в richtextbox
затем я хочу заполнить таблицы datagridview из строк richbox
я использую этот способ потому что я не нашел ничего вставляющего прямой datagridview

0x01AA

Хорошо. Я не могу ввести тебе код VB.NET потому что я этого не знаю. Но в c# первое копирование строк richtext в список строк значительно ускоряет процесс:

List<string> lns = richTextBox1.Lines.ToList<string>();
int lnCount = lns.Count;
for (int i = 0; i < lnCount; i++)
{
string ln = lns[i];
}

Member 14588284

Спасибо за все советы
возможно, я возьму директ в файле excel.

0x01AA

Добро пожаловать.
"наверное, я возьму директ в файле excel.": или прямо из буфера обмена. Вы найдете много примеров с google для этого. Но опять же, скопируйте строки RichTextBox в список строк, которые, как я думаю, вам очень помогут. После того, как вы это сделали, вы все еще можете оптимизировать шаг за шагом, чтобы обойти richtextbox.

2 Ответов

Рейтинг:
0

OriginalGriff

Начните с выполнения разделения один раз за цикл, а не 11 - Split делает много выделения объектов, поэтому это не быстро.

Второй звонок Контроль.Метод SuspendLayout (System.Окна.Формы) | Microsoft Docs[^] на вашем DGV, прежде чем вы начнете добавлять какие-либо строки, а затем вызовите Метод Control.ResumeLayout (System.Окна.Формы) | Microsoft Docs[^] на нем после того, как ваша петля закончится.

Это должно все исправить.


Garth J Lancaster

+5, приятно

Member 14588284

Начните с выполнения разделения один раз за цикл, а не 11 - Split делает много выделения объектов, поэтому это не быстро.

как я могу это сделать?

OriginalGriff

Вызовите его один раз в верхней части цикла и используйте возвращаемый массив вместо повторного вызова ...

Member 14588284

я ничего не понял :(

OriginalGriff

Чего ты не понимаешь?
Я не пытаюсь быть назойливым или тупым - я получаю только то, что вы печатаете для работы, я не получаю никакого другого контекста.

Member 14588284

я не понимал, как я могу изменить свои коды?

OriginalGriff

Вы знаете, что делает метод разделения, да?
Что он возвращает?

Member 14588284

конечно
но это займет 30 минут

OriginalGriff

О, боже мой ...
Вы знаете, что он делает, вы знаете, что он возвращает.
И вы не можете решить, как использовать это возвращаемое значение?

0x01AA

Небольшая подсказка

Dim splitted_once_per_loop= tx.Split(vbTab)
Dim i= STOK_LIST.Rows.Add ...

OriginalGriff

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

0x01AA

Успокойтесь, он пытается помочь!

Поэтому, если разбиение только один раз за цикл не сильно улучшается, попробуйте далее использовать этот материал "SuspendLayout" и, возможно, также "BeginUpdate"

Member 14588284

он всегда принимает самодовольные позы

0x01AA

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

OriginalGriff

Я собираюсь уйти от этого дела и оставить его тебе, или я буду груб с ним, а это нечестно...

0x01AA

К вашему сведению: ОП удалил пост, где он был зол.

OriginalGriff

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

Member 14588284

ладно я сори
Я говорю что не понимаю но он смеется
я начинаю в VBnet

Member 14588284

я говорю всегда, потому что он написал перед всеми членами "идиоты"

https://yadi.sk/i/TwCHrXOX67ehkA


https://www.codeproject.com/Questions/5261795/Get-data-access-with-hour-condititon

Richard Deeming

Если кто-то пишет код с уязвимостью SQL-инъекции, когда он только учится, это нормально. Мы все должны были учиться в какой-то момент.

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

И если они собираются возражать более опытному разработчику, пытающемуся помочь им, потому что они не хотят слышать об уязвимостях в своем коде, то я был бы склонен назвать их хуже, чем это! На ум приходят такие слова, как "опасно" и "ответственность"...

Member 14588284

вы знаете все очень много но никто не читает в вашем мозгу

Member 14588284

С STOK_LIST
' Пробовать
.Грядки.Четкий()
Для x = 0 в RichTextBox1.Lines.Отсчет - 1 Шаг 1000

Дим Техас = richtextbox1 отображение.Линии(х).Метод toString.Сплит(vbTab)
Дим я = STOK_LIST.Строк.Добавить
В Резюме Об Ошибке Следующий
Для s = от 0 до 9
.Ряды(я).Ячейки(ы).значение = tx(ы)
Рядом с
Следующий
Конец С

я так изменился

0x01AA

Взгляните на мой последний комментарий к вашему вопросу.

0x01AA

Я только что сделал тест на c# (я не знаю VB.NET). Узким местом, по-видимому, является доступ к RichTextBox.Lines (см. Также мой комментарий к этому вопросу). Если я переберу 35 000 строк из RichtTextBox и получу к ним доступ, это займет некоторое время. Я остановил его примерно через 5 минут.

Если я сначала скопирую строки из RichTextBox следующим образом: "List<string> lns = richTextBox1.Lines.ToList<string>();" Все резко ускоряется. Но к сожалению я не могу помочь ОПУ потому что не знаю VB.NET-да.

И да, все предложения в вашем ответе имеют смысл.

Рейтинг:
0

0x01AA

Пожалуйста, также примите во внимание предложения из решения 1.

Кроме того я думаю что вместо того чтобы обращаться к строкам richtextbox вы должны сначала получить их что то вроде этого:

Dim textLines As List(Of String) = RichTextBox1.Lines.ToList()
и продолжайте свою обработку с помощью textLines

Конечно, вы можете оптимизировать гораздо больше. Вы можете пропустить RichTextBox, реализовав вставку непосредственно из буфера обмена. Кроме того, использование DataTable в качестве хранилища данных вместо DGV может привести к улучшению и также является более чистым.

Я надеюсь, что это поможет, и еще раз, пожалуйста, примите во внимание, что я не знаю VB.NET поэтому обратите внимание на приведенный выше фрагмент кода.


[Edit 1] Простите меня, что я не знаю VB.NET-да. Во всяком случае я попробовал это сделать с ним

Занимает около 15 минут для 35'000 линий (i7/ 3,4 ГГц):
Private Sub ButtonProcessByRTBLines_Click(sender As Object, e As EventArgs) Handles ButtonProcessByRTBLines.Click

  Dim len = RichTextBox1.Lines.Count
  For i = 0 To len - 1
      Dim ln = RichTextBox1.Lines(i)
      If i Mod 500 = 0 Then
          Label1.Text = i.ToString()
          Application.DoEvents()
      End If
  Next
End Sub

Занимает менее 0,5 секунды для 35'000 строк:
Private Sub ButtonProcessByStringList_Click(sender As Object, e As EventArgs) Handles ButtonProcessByStringList.Click
  Dim textLines As List(Of String) = RichTextBox1.Lines.ToList()
  Dim len = textLines.Count

  For i = 0 To len - 1
      Dim ln = textLines(i)
      If i Mod 500 = 0 Then
          Label1.Text = i.ToString()
          Application.DoEvents()
      End If
  Next
End Sub


[Edit 2] наконец, этот неоптимизированный код будет обработан менее чем за 15 секунд. 35'000 линий на i7/ 3,4 ГГц:

Private Sub ButtonProcessToDGV_Click(sender As Object, e As EventArgs) Handles ButtonProcessToDGV.Click
    Dim textLines As List(Of String) = RichTextBox1.Lines.ToList()
    Dim textLinesCount = textLines.Count
    With STOK_LIST
        .Rows.Clear()
        For x = 0 To textLinesCount - 1
            Dim tx = textLines(x).ToString
            If tx <> "" Then
                Dim splittedLn = textLines(x).Split(vbTab)
                Dim i = STOK_LIST.Rows.Add
                Label1.Text = +i
                .Rows(i).Cells(0).Value = splittedLn(0)
                .Rows(i).Cells(1).Value = splittedLn(1)
                .Rows(i).Cells(2).Value = splittedLn(2)
                .Rows(i).Cells(3).Value = splittedLn(3)
                .Rows(i).Cells(4).Value = splittedLn(4)
                .Rows(i).Cells(5).Value = splittedLn(5)
                .Rows(i).Cells(6).Value = splittedLn(6)
                .Rows(i).Cells(7).Value = splittedLn(7)
                .Rows(i).Cells(8).Value = splittedLn(8)
                .Rows(i).Cells(9).Value = splittedLn(9)
                .Rows(i).Cells(10).Value = splittedLn(10)

            End If
            If x Mod 500 = 0 Then
                Label1.Text = x.ToString()
                Application.DoEvents()
            End If
        Next

    End With
End Sub


Member 14588284

еще раз большое спасибо за все.

0x01AA

Вы заметили мою последнюю правку в ответе? Я думаю, что это решит вашу просьбу.