Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Grid - удаление записей


Автор: HOBu4OK 11.11.2007, 19:44
Возникла проблема с гридом, а именно с множественнным удалением. прога должна удалять выделенные строки. Пообщался с людьми, говорят можно сначала клонировать, а после удалять.
Или подскажите как установить AbsolutePosition на выделенную строку после удаления предидущей.
Спасибо.

Автор: Akina 11.11.2007, 21:53
Если Вы берете на себя смелость удалять записи из БД на основе того что юзер выделил в гриде - значит, каждая выделенная строка может быть однозначно идентифицирована в БД совокупностью данных, показываемых гридом (скажем, значением колонки ID, возможно неотображаемой).
Сохраните в массив эти идентифицирующие поля и на их основе выполняйте удаление безотносительно к источнику строк грида. После чего просто перезапросите данные.

Цитата(HOBu4OK @  11.11.2007,  20:44 Найти цитируемый пост)
подскажите как установить AbsolutePosition на выделенную строку после удаления предидущей

типичная ошибка - попытка работать с коллекцией или рекордсетом, ориентируясь на данные, которые относятся к другой коллекции или рекордсету.

Автор: HOBu4OK 13.11.2007, 12:37
Akina, идея более или менее понятна. Такой вариант решения задачи я слышал. Можно немного кода?

Цитата

типичная ошибка - попытка работать с коллекцией или рекордсетом, ориентируясь на данные, которые относятся к другой коллекции или рекордсету.

Насчет типичной ошибки тоже слышал!) С моим 2х месяч стажем это позволительно.

Автор: Akina 13.11.2007, 13:04
Цитата(HOBu4OK @  13.11.2007,  13:37 Найти цитируемый пост)
Можно немного кода?

Драфт - только для демонстрации идеи. Само собой, это ужасный код, но для понимания сути сойдет.

Код

Dim IDsToDelete(0)  As Long

For i = 0 To Grid.Recordset.RecordsCount - 1
  If Grid.Recordset.IsMarked Then
    IDsToDelete(UBound(IDsToDelete)) = Grid.Recordset!ID
    ReDim Preserve IDsToDelete(UBound(IDsToDelete)+1) 
  End If
Next

For i = 0 To UBound(IDsToDelete) - 1
  DoCMD.RunSQL "Delete * From MyTable Where ID = " & CStr(IDsToDelete(i))
Next

Grid.Recordset.Requery

ReDim IDsToDelete(0) 

Автор: HOBu4OK 13.11.2007, 19:28
Так то оно так. Все понятно, но вот такого как "IsMarked" vb не знает. Вот собственно в этом и вся проблема. Может как подругому можно условие записать?
А в целом код неплохой.

Автор: Akina 13.11.2007, 21:53
Цитата(HOBu4OK @  13.11.2007,  20:28 Найти цитируемый пост)
в целом код неплохой

Код безобразный. За такой код программиста могут и уволить.

Цитата(HOBu4OK @  13.11.2007,  20:28 Найти цитируемый пост)
такого как "IsMarked" vb не знает

А что если вместо тупого копирования применить интеллект и способности к поиску и анализу?

Автор: HOBu4OK 14.11.2007, 10:34
Вы меня не так поняли. Копировать код я и не собирался... Мне всего нужно было узнать как правильно обратиться к выделенной строке.

Автор: Akina 14.11.2007, 10:57
Тогда подтвердите, что используется именно Grid, а не DBGrid, DataGrid или еще какой-то другой.
Чтобы не ошибиться с терминологией - просто укажите имя референсной библиотеки.

Автор: HOBu4OK 15.11.2007, 16:08
Опааа... Простите, не думал что есть разница! 
Я использую dbGrid (контрол = Apex True dbgrid pro 6.0 (oledb)). Отображаю таблицу в гриде через ADODC. 

Автор: Akina 15.11.2007, 16:29
Ах, так еще и контрол - не из штатных... ну тогда смотрите в его описании, как получить список помеченных строк или проверить строку на помеченность.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)