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

Тема в разделе "Visual Basic", создана пользователем Serrr, 24 июл 2010.

  1. Serrr

    Serrr Гость

    уважаемые, чё-т не получается у меня..
    есть datagridview, связанный с БД (*.mdb)
    запросы к ней делал заранее в конструкторе, в тексте программы только применял уже заготовленные запросы.
    эта БД - учёт работников, находящихся в отвлечении (отпуск, больничный...), ну и соответственно замысел был такой - кто в отвлечении, у того в datagridview ячейка с фамилией меняет свой цвет. Раскраску ячеек поставил на событие databindingcomplete. Когда в базе 10-20 человек, то обрабатывается она более-менее (скорость), но человек-то 900.. Как только всех в базу загнал - начала тормозить. А на работе компы вообще лом сплошной. Помогите пож. кто чем может, а? Вот текст обработки databindingcomplete.
    Код (LotusScript):
     
    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 ' раскраска отвлечённых (сюда же и прочих)
    Код ( (Unknown Language)):
     
     
  2. Serrr

    Serrr Гость

    Уважаемый, надеялся на Ваш ответ :)
    Теперь по порядку:
    п.1 - попробовал следующее
    Код (LotusScript):
     
    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
    Код ( (Unknown Language)):
     
    красит, но не ячейку, а rowheader (и часть 1го столбца), и то временно, пока колесо мыши не крутанешь...
     
  3. Serrr

    Serrr Гость

    e.RowIndex - это Integer. А как тогда указывать Cell для закраски? Может, закрашивать не тем пытаюсь?
     
  4. Serrr

    Serrr Гость

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

    Serrr Гость

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

    Serrr Гость

    Код (LotusScript):
     
    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 в постпаинте нет, или это в другом месте надо писать?
     
  7. Serrr

    Serrr Гость

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

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

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

    Serrr Гость

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

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

    Serrr Гость

    мона вопрос:

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

    Serrr Гость

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

    Serrr Гость

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

    Код (LotusScript):
     
    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:
     
  12. Serrr

    Serrr Гость

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

    Добавлено:
    покурил и дошло! Работает

    Код (LotusScript):
     
    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]
     
Загрузка...

Поделиться этой страницей