• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Datagridview, как ускорить обработку?

  • Автор темы Serrr
  • Дата начала
S

Serrr

уважаемые, чё-т не получается у меня..
есть datagridview, связанный с БД (*.mdb)
запросы к ней делал заранее в конструкторе, в тексте программы только применял уже заготовленные запросы.
эта БД - учёт работников, находящихся в отвлечении (отпуск, больничный...), ну и соответственно замысел был такой - кто в отвлечении, у того в datagridview ячейка с фамилией меняет свой цвет. Раскраску ячеек поставил на событие databindingcomplete. Когда в базе 10-20 человек, то обрабатывается она более-менее (скорость), но человек-то 900.. Как только всех в базу загнал - начала тормозить. А на работе компы вообще лом сплошной. Помогите пож. кто чем может, а? Вот текст обработки databindingcomplete.
Код:

Private Sub T1DGV_DataBindingComplete _
(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) _
Handles T1DGV.DataBindingComplete
Dolzhnik.Visible = False
Dim cel As DataGridViewRow
For Each cel In T1DGV.Rows
If cel.Cells(8).Value Then ' маркированые (поле со значением Boolean)
cel.DefaultCellStyle.ForeColor = Color.Black
cel.DefaultCellStyle.SelectionForeColor = Color.Black
cel.DefaultCellStyle.Font = Fnt ' fnt - стиль font-а
cel.HeaderCell.Style.BackColor = Color.PaleTurquoise
If Not flag Then
flag = True
End If
End If
Dim cd = OtvTableAdapter.TnS(ZupDS.otv, cel.Cells.Item(0).Value) ' если в табл отвлеч-х есть такой ТН
If cd = 1 Then
Call PainCell(cel.Cells.Item(0), Color.Yellow, Color.Black, Color.Black)
End If
Dim ce = KosTableAdapter.SelQ(ZupDS.Kos, cel.Cells.Item(0).Value) ' если в табл косяков есть такой tn
If ce = 1 Then
Call PainCell(cel.Cells.Item(1), Color.Gold, Color.Red, Color.Red)
'непосредственная окраска заданным цветом (столбец, backcolor, forecolor, selection backcolor, selectionforecolor)
End If
Next
DelMark.Visible = flag ' delmark - кнопка для снятия всех true в boolean столбце

End Sub ' раскраска отвлечённых (сюда же и прочих)
Код:
 
S

Serrr

Уважаемый, надеялся на Ваш ответ :)
Теперь по порядку:
п.1 - попробовал следующее
Код:
Private Sub T1DGV_RowPrePaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowPrePaintEventArgs) Handles T1DGV.RowPrePaint
Dim cel = T1DGV.CurrentRow
If Not IsDBNull(cel.Cells(8).Value) Then ' в 9м столбце дата начала отвлечения
e.Graphics.FillRectangle(Brushes.Yellow, cel.Cells(1).GetContentBounds(cel.Index))
End If

End Sub
Код:

красит, но не ячейку, а rowheader (и часть 1го столбца), и то временно, пока колесо мыши не крутанешь...
 
S

Serrr

А закрашиваю правильно или по-другому надо? Не хочет закрашиваться чё-т
 
S

Serrr

Дело в том, что при "моузе энтэр" на строку, я сделал "Селект" этой строки, чтобы она текущей была. А после "Моузэ леаве" сел паинт будет происходить? (А то выделение текущей строки у меня с другим фоном)
 
S

Serrr

Код:
Dim cel = T1DGV.CurrentRow

If Not IsDBNull(cel.Cells(8).Value) Then

e.Graphics.FillRectangle(Brushes.Yellow, cel.Cells(1).GetContentBounds(cel.Index))

End If[/CODE]

Dim cel = T1DGV.CurrentRow я написал для того, чтобы обозначить при раскраске нужную ячейку,
т.к. если писать e.rowindex, то fillrectangle меня не поймёт

оператор
e.Graphics.FillRectangle(Brushes.Yellow, cel.Cells(1).GetContentBounds(cel.Index))
будет правильно понимать, что я от него хочу?

а e.handled в постпаинте нет, или это в другом месте надо писать?
 
S

Serrr

извиняюсь. в постпаинте он есть. переставил туда - жёлтым не раскрашивает.

Немного истории:
при ров моузе энтер у меня, по замыслу, выделяется вся строка.

теперь, что вышло:
нажал на строку с отпускником - тишина (выделена вся строка)
перемещаю мышь - тишина (моузе энтер не работает)
нажимаю на другую строку - выделяется ячейка столбца, который я нажимал до handled=true цветом выделения
перемещаю мышь - снова выделяется вся строка
и после этого моузе энтер работает
 
S

Serrr

дико извиняюсь - сам запутался уже :mellow:

в-общем:
есть таблица со списком людей. Их в этой таблице надо отправлять в отвлечение или выводить из него.
Те люди, которые в отвлечении, их ячейка с табельным номером должна быть жёлтого цвета. Т.е. учитывать и то, что при постановке отвлечения на человека, ячейка с табельным номером в его строке сразу окрашивается в жёлтый цвет.
Выделенная строка (под курсором) имеет, скажем, синий цвет. То есть, чтобы после прохождении курсора по строке жёлтый цвет у отвлечённого оставался.
 
S

Serrr

мона вопрос:

то, что я изобразил выше насчёт раскрашивания ячейки - это правильно?
 
S

Serrr

я потому и спрашиваю, т.к. не раскрашивает. Не подскажете верное направление?
 
S

Serrr

Так я расписал алгоритм.

если я всё понял правильно, то

Код:
If e.ColumnIndex = 1 Then
Dim cel = T1DGV.CurrentRow
If Not IsDBNull(cel.Cells(8).Value) Then
Call PainCell(cel.Cells(1), Color.Yellow, Color.Black, Color.Black)
e.Handled = True
End If
End If[/CODE]

должно работать..
но раскрашивает только при нажатии мыши на строку с отвлечённым :mellow:
 
S

Serrr

При чем тут это?

ну а как мне брать значение из восьмой ячейки, где дата начала отвлечения? (я раньше не ведал про left join)

Добавлено:
ну а как мне брать значение из восьмой ячейки, где дата начала отвлечения? (я раньше не ведал про left join)

покурил и дошло! Работает

Код:
Private Sub T1DGV_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles T1DGV.CellPainting

If e.ColumnIndex = 1 Then
Dim cel = T1DGV.Rows.Item(e.RowIndex)
If Not IsDBNull(cel.Cells(8).Value) Then
Call PainCell(cel.Cells(1), Color.Yellow, Color.Black, Color.Black)
'e.Handled = True
End If
End If

End Sub[/CODE]
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!