powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / True DBGrid Pro 7.0 - как в цикле прочитать значения unbound-столбца?
7 сообщений из 7, страница 1 из 1
True DBGrid Pro 7.0 - как в цикле прочитать значения unbound-столбца?
    #32966383
KuzVit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

В базе данных есть таблица с наименованиями параметров.

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

Исходный код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
dim tmpCellValue

Private Sub TDBGrid1_BeforeUpdate(Cancel As Integer)
    
    tmpCellValue = TDBGrid1.Columns(ColNameZnach).Value   ' Временно сохраняем значение из ячейки
    
    
End Sub

Private Sub TDBGrid1_UnboundColumnFetch(Bookmark As Variant, ByVal Col As Integer, Value As Variant)
    Value = tmpCellValue

End Sub


Проблема в том, что визуально все в порядке (т.е. введенные значения в ячейках остаются), но когда начинаешь в цикле перемещаться по гриду, для того, чтобы заполненные ячейки внести в БД, то каждый раз получаешь только последнее введенное значение.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Const ColNameZnach as String =  2    ' Столбец Значения
Dim val

    With TDBGrid1
        .MoveFirst
        While Not .EOF
        
            val = .Columns(ColNameZnach).Value
            MsgBox val
        
            .MoveNext
        Wend
    End With


Никак не могу понять, в чем проблема, такое ощущение, что перемещения по гриду не происходит.
Помогите, кто может...
...
Рейтинг: 0 / 0
True DBGrid Pro 7.0 - как в цикле прочитать значения unbound-столбца?
    #32966764
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Порядок работы с UnboundColumn следующий:

1. содзаем ДВА рекордсета: источник данных для грида (rs) и его клон (rsx)
2. Создаем или использем готовый массив для хранения подставляемых данных
3. UnboundColumnFetch обрабатываем так:
Код: plaintext
1.
2.
3.
4.
Private Sub TDBGrid1_UnboundColumnFetch(Bookmark As Variant, ByVal Col As Integer, Value As Variant)
 rsx.Bookmark = Bookmark 
 'Получаем идентификатор из rsx и и находим нужную строчку в нашем массиве подстановок
 'Variant = найденное значение (или Null если на найдена строка)
End Sub
Есть реальные примеры использования, но довольно сложные - с поиском подставляемого значения из "вторых рук" - второго рекордсета через первый.
...
Рейтинг: 0 / 0
True DBGrid Pro 7.0 - как в цикле прочитать значения unbound-столбца?
    #32966829
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправка:
Код: plaintext
'Value = найденное значение (или Null если на найдена строка)
...
Рейтинг: 0 / 0
True DBGrid Pro 7.0 - как в цикле прочитать значения unbound-столбца?
    #32966988
KuzVit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значения столбца "Значения" должны сохраняться в другую таблицу. TDBGrid1 к ней не привязан, он привязан к справочной таблице с наименованиями параметров.

С клонированием рекордсета кажется понятно: оно нужно только для определения текущей строки и вытаскивания ее идентификатора.

Спасибо, буду еще пробовать...
...
Рейтинг: 0 / 0
True DBGrid Pro 7.0 - как в цикле прочитать значения unbound-столбца?
    #32967943
KuzVit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При редактировании ячейки события выполняются в следующем порядке:
BeforeUpdate
UnboundColumnFetch
AfterUpdate

Почти все получилось, но есть один глюк: при редактировании последней строки события выполняются так:

BeforeUpdate
UnboundColumnFetch
AfterUpdate
UnboundColumnFetch

т.е. UnboundColumnFetch выполняется лишний раз, и это все портит.
Может, мне последнюю строку как-то особо обрабатывать?

И еще - после редактирования ячейки событие UnboundColumnFetch выполняется для всего столбца, начиная с текущей ячейки, т.е. если ниже еще несколько строк, то столько же раз оно выполняется.
...
Рейтинг: 0 / 0
True DBGrid Pro 7.0 - как в цикле прочитать значения unbound-столбца?
    #32968748
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Надо использовать другое событие: AfterColEdit

А такие события как AfterUpdate и BeforeUpdate относятся к строке, а не к ячейке. И привязаны к смене текущей строки или к принудительному обновлению (TDBGrid1.Update).

2. UnboundColumnFetch срабатывает асинхронно и порциями по 10 штук. Поэтому его можно использовать исключительно для представления данных. Или автоматического исправления (без пользовательского ввода) подставляемых данных (если вы достаточно сильны в программировании этого контрола).
...
Рейтинг: 0 / 0
True DBGrid Pro 7.0 - как в цикле прочитать значения unbound-столбца?
    #32970666
KuzVit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ура!!! Заработало!!!

Как только я понял, что событие UnboundColumnFetch нужно использовать только для вывода на экран, а BeforeUpdate - для запоминания значений, причем сразу в массиве, все сразу получилось.
Сразу удалил тонну ненужного кода, все оказалось намного проще...

Спасибо, Worobjoff

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    Dim rs_c As ADODB.Recordset   ' Клон
    
    Const ColNameZnach As Integer =  2    ' Имя/позиция столбца с ручным вводом
    Const ColNameId As String = "Potoki_id"
    Const ColNameName As String = "Name"
    
    Const MaxZnach =  200       ' Макс. кол-во значений ручного ввода. Знаю, нехорошо таким образом ограничивать массив, но пока так...
    Dim Znach(MaxZnach) As Double            ' массив значений


Private Sub TDBGrid1_BeforeUpdate(Cancel As Integer)
    
    rs_c.Bookmark = TDBGrid1.Bookmark
    Znach(rs_c.Fields(ColNameId)) = TDBGrid1.Columns(ColNameZnach).Value   'Запоминаем в массиве введенное значение
    
End Sub

Private Sub TDBGrid1_UnboundColumnFetch(Bookmark As Variant, ByVal Col As Integer, Value As Variant)
    
    rs_c.Bookmark = Bookmark    ' Передвинулись в клоне на этот же ряд
   
    Value = Znach(rs_c.Fields(ColNameId))        ' Присвоили ячейке значение из массива
    
End Sub

...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / True DBGrid Pro 7.0 - как в цикле прочитать значения unbound-столбца?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]