MSHFlexGrid - проблема с первой строкой

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

MSHFlexGrid - проблема с первой строкой

Сообщение Dummiel » 31.07.2007 (Вт) 17:47

Хай, други мои!
Долго меня не было, надеюсь все живы-здоровы.

При первичной загрузке грида все ОК.
Я хочу, чтобы при появлении еще одного исследования у клиента грид "перерисовывался" заново, чтобы это исследование появлялось в гриде. Тут начинаются закавыки - не выполняется hflIss.AddItem в первой строке, т.е., она остается пустой, без фамилии. Иногда и вторая-третья строка не заполняются, уже с исследованиями. Иногда все строки добавляются. Какой-либо закономерности не выявил. В чем дело - не пойму.
Процедуру issLoad вызываю из других форм (ввод результатов исследований) следующим образом:

Код: Выделить всё
With rsEKG
    .AddNew
     '***************** сохранение значений в полях в БД
    .Update
    .Close
End With

frmList.issLoad 'frmList - форма, на которой лежит грид


Просветите, меня, пожалуйста.
Приложение (48кБ): Рисунок Grid1 - первичная прорисовка грида, Grid2 - прорисовка грида после добавления нового исследования (вернее, непрорисовка) :(

Код: Выделить всё
Public Sub issLoad() 'загрузка и форматирование таблицы
Dim rsBAK As New ADODB.Recordset, rsEKG As New Recordset, rsOAK As New Recordset, _
    rsOAM As New Recordset, rsUZI As New Recordset, rsOth As New Recordset

hflIss.Clear 'очищаем грид
hflIss.Rows = hflIss.FixedRows + 1   'убираем все пустые строки

sSQL = "SELECT nBol, Fam, Name, Otch FROM Pasp ORDER BY Fam"
rsIss.Open sSQL, cnDB, adOpenStatic, adLockReadOnly

If rsIss.RecordCount <> 0 Then 'если есть записи клиентов, то начинаем заполнять грид
   
   Do While Not rsIss.EOF 'пока не конец таблицы БД

      'добавляем в грид строку с фамилией
      hflIss.AddItem "-" & vbTab & rsIss.Fields("nBol") & vbTab & rsIss.Fields("Fam") & " " & _
                     IIf(Trim(rsIss.Fields("Name")) = "", "", Left(rsIss.Fields("Name"), 1) & ".") & _
                     IIf(Trim(rsIss.Fields("Otch")) = "", "", Left(rsIss.Fields("Otch"), 1) & ".")

      'добавляем строки с исследованиями из других таблиц БД     
      sSQL = "SELECT nIssl, DateIs, TimeIs, Zakl FROM BAK WHERE BAK.nBol = " & _
             rsIss.Fields("nBol") & " ORDER BY nIssl, DateIs, TimeIs"
      rsBAK.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
       
      If rsBAK.RecordCount <> 0 Then 'если есть записи в таблице "BAK"
         Do While Not rsBAK.EOF      'пока не конец таблицы
            hflIss.AddItem vbTab & "БАК" & vbTab & vbTab & _
                   rsBAK.Fields("nIssl") & vbTab & rsBAK.Fields("DateIs") & vbTab & _
                   Format(rsBAK.Fields("TimeIs"), "hh:mm") & vbTab & rsBAK.Fields("Zakl")
            rsBAK.MoveNext
         Loop
      End If
      rsBAK.Close
      '******************
     
      sSQL = "SELECT nIssl, DateIs, TimeIs, Zakl FROM UZI WHERE UZI.nBol = " & rsIss.Fields("nBol") & _
             " ORDER BY nIssl, DateIs, TimeIs"
      rsUZI.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
       
      If rsUZI.RecordCount <> 0 Then
         Do While Not rsUZI.EOF
            hflIss.AddItem vbTab & "УЗИ" & vbTab & vbTab & _
                   rsUZI.Fields("nIssl") & vbTab & rsUZI.Fields("DateIs") & vbTab & _
                   Format(rsUZI.Fields("TimeIs"), "hh:mm") & vbTab & rsUZI.Fields("Zakl")
            rsUZI.MoveNext
         Loop
      End If
      rsUZI.Close
      '******************
     
      sSQL = "SELECT nIssl, DateIs, TimeIs, Zakl FROM OAM WHERE OAM.nBol = " & rsIss.Fields("nBol") & _
             " ORDER BY nIssl, DateIs, TimeIs"
      rsOAM.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
       
      If rsOAM.RecordCount <> 0 Then
         Do While Not rsOAM.EOF
            hflIss.AddItem vbTab & "ОАМ" & vbTab & vbTab & _
                   rsOAM.Fields("nIssl") & vbTab & rsOAM.Fields("DateIs") & vbTab & _
                   Format(rsOAM.Fields("TimeIs"), "hh:mm") & vbTab & rsOAM.Fields("Zakl")
            rsOAM.MoveNext
         Loop
      End If
      rsOAM.Close
      '******************
     
      sSQL = "SELECT nIssl, DateIs, TimeIs, Zakl FROM OAK WHERE OAK.nBol = " & rsIss.Fields("nBol") & _
             " ORDER BY nIssl, DateIs, TimeIs"
      rsOAK.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
       
      If rsOAK.RecordCount <> 0 Then
         Do While Not rsOAK.EOF
            hflIss.AddItem vbTab & "ОАК" & vbTab & vbTab & _
                   rsOAK.Fields("nIssl") & vbTab & rsOAK.Fields("DateIs") & vbTab & _
                   Format(rsOAK.Fields("TimeIs"), "hh:mm") & vbTab & rsOAK.Fields("Zakl")
            rsOAK.MoveNext
         Loop
      End If
      rsOAK.Close
      '******************
      sSQL = "SELECT nIssl, DateIs, TimeIs, Zakl FROM EKG WHERE EKG.nBol = " & rsIss.Fields("nBol") & _
             " ORDER BY nIssl, DateIs, TimeIs"
      rsEKG.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
       
      If rsEKG.RecordCount <> 0 Then
         Do While Not rsEKG.EOF
            hflIss.AddItem vbTab & "ЭКГ" & vbTab & vbTab & _
                   rsEKG.Fields("nIssl") & vbTab & rsEKG.Fields("DateIs") & vbTab & _
                   Format(rsEKG.Fields("TimeIs"), "hh:mm") & vbTab & rsEKG.Fields("Zakl")
            rsEKG.MoveNext
         Loop
      End If
      rsEKG.Close
      '******************
     
      sSQL = "SELECT DateIs, TimeIs, Zakl FROM OthIss WHERE OthIss.nBol = " & rsIss.Fields("nBol")
      rsOth.Open sSQL, cnDB, adOpenStatic, adLockReadOnly
       
      If rsOth.RecordCount <> 0 Then
         Do While Not rsOth.EOF
            hflIss.AddItem vbTab & "Прочие" & vbTab & vbTab & vbTab & rsOth.Fields("DateIs") & vbTab & _
                   Format(rsOth.Fields("TimeIs"), "hh:mm") & vbTab & rsOth.Fields("Zakl")
            rsOth.MoveNext
         Loop
      End If
      rsOth.Close
      '******************
     
      rsIss.MoveNext
  Loop

End If
rsIss.Close

With hflIss

    .RemoveItem 1    'удаляем верхнюю пустую строку грида

    For i = .Rows - 1 To 0 Step -1 'выделяем строку с фамилией, инициалами
        If .TextArray(i * .Cols) = "-" Then
           .Row = i: .Col = 1
           .ColSel = .Cols - 1
           .CellFontBold = True
        ElseIf .TextArray(i * .Cols + 1) = "УЗИ" Then '"закрашиваем" фон строк по определенному признаку
           .Row = i: .Col = 1
           .ColSel = .Cols - 1
           .CellBackColor = &HC0FFC0
        ElseIf .TextArray(i * .Cols + 1) = "БАК" Then
           .Row = i: .Col = 1
           .ColSel = .Cols - 1
           .CellBackColor = &HFFFFC0
        ElseIf .TextArray(i * .Cols + 1) = "ОАК" Then
           .Row = i: .Col = 1
           .ColSel = .Cols - 1
           .CellBackColor = &HC0FFFF
        ElseIf .TextArray(i * .Cols + 1) = "ОАМ" Then
           .Row = i: .Col = 1
           .ColSel = .Cols - 1
           .CellBackColor = &HFFC0C0
        ElseIf .TextArray(i * .Cols + 1) = "ЭКГ" Then
           .Row = i: .Col = 1
           .ColSel = .Cols - 1
           .CellBackColor = &HC0C0FF
        ElseIf .TextArray(i * .Cols + 1) = "Прочие" Then
           .Row = i: .Col = 1
           .ColSel = .Cols - 1
           .CellBackColor = &HC0E0FF
        End If
    Next i
   
    .FormatString = "^|№/Вид |Фамилия, И.О.|№ |Дата |Время |Заключение/Комментарий" 'заголовки столбцов
    .ColWidth(0) = 250:   .ColWidth(1) = 650
    .ColWidth(2) = 2500:  .ColWidth(3) = 300
    .ColWidth(4) = 900:   .ColWidth(5) = 600
    .ColWidth(6) = 4500
    .ColAlignment(1) = flexAlignLeftCenter:     .ColAlignment(2) = flexAlignLeftCenter
    .ColAlignment(3) = flexAlignCenterCenter:   .ColAlignment(4) = flexAlignCenterCenter
    .ColAlignment(5) = flexAlignCenterCenter
    .MergeCells = flexMergeFree:                .MergeCol(1) = True 'разрешаем слияние ячеек

End With

End Sub


С уважением и благодарностью - Dummiel

P.S. В приложении дополнительная инфа по другим процедурам, использующих сворачивание/разворачивание этого грида.

P.P.S. Пожалуйста, не спрашивайте меня, почему я заполняю грид циклами ("вручную"). Меня эстетически не устраивают ленты по SQL-выборке, и не устраивает привязка к БД по DataSource. Пробовал. Вот такая блажь. :) И потом, как "разукрасить" строки с различными исследованиями, если пользуешь привязки DataSource? Вот и я о том же... :)
Вложения
Grid.rar
(48.05 Кб) Скачиваний: 83

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 05.08.2007 (Вс) 9:52

Я так понимаю, мыслей нет ни у кого... Или никто не сталкивался с этим?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 05.08.2007 (Вс) 10:19

Просто никто обычно не пользуется этим гридом для визуализации рекордсетов, для этого есть DataGrid, который сам заботится о строках. А копаться в тонкостях поведения MSHFlexGrid просто в лом.
Лучший способ понять что-то самому — объяснить это другому.

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 08.08.2007 (Ср) 18:35

М-да! А еще помощь обещают! :(
А если это просто интересно? Ведь кроме тупой обработки данных и визуализации есть еще и понятие "удобство для юзера" и "просто эстетизм".

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 09.08.2007 (Чт) 8:54

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

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 09.08.2007 (Чт) 18:12

Я пару месяцев назад делал прогу и использовал там MSHFlexGrid каким-то боком. Так я добавлял строки путем увеличения количества строк Fg.Rows = Fg.Rows + 1.. Проблем не возникало.
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 92

    TopList