• 0
dmdel

Удаление записи из таблицы БД связанной с ListView

Вопросы

Delphi xe7, SQLite под ANDROID

Соединяю таблицу БД с компонентом ListView через Bind Visually, все нормально, показывает записи.

Пытаюсь удалить запись с помощью стандартного удаления записи (с помощью DeleteButton). Запись из ListView удаляется. С этим проблем нет. 

Пытаюсь теперь удалить эту запись из базы данных.

На событие OnDeleteItem пытаюсь поймать значение первичного ключа (ID) для этой таблицы, чтобы скриптом типа delete from dairy where id=:id удалить запись.

На показ кнопки delete исчезает выделенная строка, т.е. ListView.Selected=nil. Значение первичного ключа ID не соответствует текущей записи в этот момент.

Получается, scroll автоматом не срабатывает, выделенной записи нет. Как узнать ID записи, по которой нажали кнопку Delete, чтобы ее (запись) удалить из БД?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 ответов на этот вопрос

  • 1

попробуйте OnDeletingItem

у меня к примеру такая конструкция норм работает: (правда Bind Visually не юзаю... а в таг каждого итема засовываю нужный ключ)

procedure TFVisitPhotoComment.ListView1DeletingItem(Sender: TObject;
  AIndex: Integer; var ACanDelete: Boolean);
begin
  ...
  ...'delete bla-bla-bla where Id = :Id';
  ...ParamByName('Id').Value:= ListView1.items[AIndex].Tag;
  ...
  
  //не забываем ...
  ACanDelete := True;
  //ну или отмена удаления при необходимости
  ACanDelete := False;
end;

 

Изменено пользователем beklexx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Можете показать, как программно засовываете данные в ListView + данные в Tag?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 13.08.2016 в 20:26, dmdel сказал:

На событие OnDeleteItem пытаюсь поймать значение первичного ключа (ID) для этой таблицы, чтобы скриптом типа delete from dairy where id=:id удалить запись.

Как-то не понятно что вы ловите, если в запросе нет SELECT ID... то что должно подставиться в  where id=:id

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
12 минут назад, GASCHE сказал:

Как-то не понятно что вы ловите, если в запросе нет SELECT ID... то что должно подставиться в  where id=:id

Почему нет то? Есть! Я же проверяю его значение!?!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Реализовал заполнение ListView вручную, т.е. без Bind Visually, как советовал beklexx. Заработало, беру ID из Tag.

Но неужели это никак не сделать автоматически с использованием Bind VisuallyДолжно же это быть предусмотрено

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
13 часов назад, dmdel сказал:

Реализовал заполнение ListView вручную, т.е. без Bind Visually, как советовал beklexx. Заработало, беру ID из Tag.

Но неужели это никак не сделать автоматически с использованием Bind VisuallyДолжно же это быть предусмотрено

имхо... Bind Visually противоречит шаблонам MVC, и полезен скорее для "HelloWord" проектов,

да и с СУБД лучше воевать вручную, хотя SQLite - "недобаза", однако лучше сразу "по-взрослому".

Bind Visually работает в блокирующем режиме? - неясно, скорее всего блокирует интерфейс;

насколько корректно работает AutoCommit? - неясно, видимо на каждое действие проходит commit;

какая будет ситуация с уровнями изоляции? - непонятно... слишком много потенциальных проблем.

Изменено пользователем Камышев Александр

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 14.08.2016 в 17:34, dmdel сказал:

Можете показать, как программно засовываете данные в ListView + данные в Tag?

для заполнения листвью юзаю подобное решение

procedure TFVisit.bListViewFill(LV: TListView; FDSource: TFDQuery; TextField, DetailField, TagField: string; IsClear: boolean);
var i, index: integer;
    item: TListViewitem;
begin
  if LV.Selected <> nil
    then index:= LV.Selected.Index
    else index:= -1;
    
  if FDSource.IsEmpty then
    begin
//      ShowMessage('Нет данных!');
      LV.Items.Clear;
      exit;
    end;
  if IsClear then LV.Items.Clear;
  LV.BeginUpdate;
  try
  for i:= 1 to FDSource.RecordCount do
    begin
      FDSource.RecNo:= i;
      item:= LV.Items.Add;
      item.Text:= FDSource.FieldByName(TextField).AsString;
      item.Detail:= FDSource.FieldByName(DetailField).AsString;
//      item.Bitmap.Assign(...)  
      item.Tag:= FDSource.FieldByName(TagField).AsInteger;
    end;
  finally
    LV.EndUpdate;
  end;

  if index = -1 then exit;
  if (LV.Items.Count >= index) then LV.ItemIndex:= index;
end;

ну и заполняю

tbPriceList: TFDQuery; 
.
.
.
tbPriceList.Open; //фильтрованный по необходимым условиям
bListViewFill(ListView1, tbPriceList, 'Name', 'LCP_Qty', 'ProductId', True);
tbPriceList.Close;

Мне часто приходится работать с листвью где text, detail и tag... но иногда приходится юзать остальной функционал листвью: хидеры-шмидеры, имейджи и т.д. но это уже другой вопрос

Изменено пользователем beklexx

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

И все-таки, хотелось бы понять, перемещение по набору данных не происходит при перемещении по ListView?

Вот тут написано, что в  FireDAC это возможно настроить, а в ClientDataSet?

Конечно, можно это перемещение организовать, но неужели не предусмотрено?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вопрос снимаю, разобрался. Надо другой линк использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


  • Похожий контент

    • От gresaggr
      Добрый день.
      Как под FMX в ListView сделать подчеркивание Detail в рантайме?
      Пытался делать так:
      LV.ItemAppearanceObjects.ItemObjects.Detail.Font.Style := [TFontStyle.fsUnderline]
      но не срабатывает.
      P.S. Возможно это применить не ко всем строкам, а только к некоторым?
    • От ice donkey
      Заполняю ListView в рантайме:
       
       
      LiveBindings не подходит, поэтому есть вопрос: а как задать фиксированный заголовок - чтобы в списке все Items, начинающиеся с буквы А были как бы объединены под одним заголовком А? Который  в свою очередь смещался бы только заголовком Б (с Items, которые на букву Б) и так далее.
       
      Пример:
       
    • От Olexander Sagaydak
      Летом 2016 вопрос отображения объектов в ListView при создании Items уже обсуждался. Хочу ещё раз обсудить этот вопрос. А именно:
      Простой код 
      ListViewItem := ListView.Items.Add;
      ListViewItem.Objects.AccessoryObject.Visible := false; (или true, не важно)
      вторая строка не работает если до выполнения, ListView ни одного раза не отображался. Если же отображался хотя бы один раз - всё нормально.
      В предыдущих обсуждениях Krapotkin рекомендовал Resize и OnUpdateObjects. Если нет идей проще, то, конечно, воспользуюсь.  
       
    • От x11
      Если у элементов, идущих подряд одинаковый текст, то текст скрывается.
      Как это это отключить?
       
    • От x11
      Не понять, ни в справке найти, ни примеров, как получить текст из header.
      Как получить текст из какого-то элемента, есть пример:
      lvContacts.Items[li.Index].Objects.FindObjectT<TListItemText>('textTel').Text; а для заголовка ил подвала не нахожу примеров
    • От Erlan_krg
      Всем привет! Встретился с одной проблемой. Удаляю Item у ListView по нажатию кнопки, которая находится на ListViewItem
      procedure TfmAppointment.lvSelectedServicesButtonClick(const Sender: TObject;
        const AItem: TListItem; const AObject: TListItemSimpleControl);
      begin
          lvSelectedServices.BeginUpdate;
          if lvSelectedServices.ItemCount > 0 then
              lvSelectedServices.Items.Delete(AItem.Index);
          lvSelectedServices.EndUpdate;
      end;
      итем удаляется, но потом выскакивает ошибка Access violation at address 60BCB318 и то се бо се
       
      у ListView ItemAppearance выставлен на DynamicAppearance
      помимо родного объекта Text добавил еще один объект Text и кнопку
       
      но фишка в чем, если убрать дополнительный объект Text с ListWiewItem и удалить итем то ошибка не выскакивает)
       
      что за прикол?
    • От sinuke
      Доброго дня, форумчане
      Возникла проблема с тем, чтобы поменять местами два итема в ListView. ListView.Items не имеет метода Exchange, сами итемы не имеют метода Assign чтобы можно было один итем клонировать в другой / удалить / вставить
      У кого какие мысли? Как реализовать?
      Delphi 10.2 Tokyo
       
    • От x11
      Не могу понять, как записать текст в Footer text
       
       

    • От Mars M
      Загружаю большой список в ListView, время загрузки где то 5-7 секунд.
      Это много, по этому переделал что бы список загружался динамически, как к концу пролистывается, подгружаются новые данные.
      Все бы хорошо, но вот ScrollBar при загрузке новых данных меняет размер и позицию. 
      Это не очень нравиться
      Можно как то заранее настроить его размер под конечное число итемов?
      Или может как то по другому сделать.
    • От Rusland
      Delphi Tokyo
      ListView->ItemAppearance->ItemAppearance=DynamicAppearance
      Есть ImageList c 3 картинками.
      Добавляю item-ы в ListView:
      procedure TForm1.Button1Click(Sender: TObject); var i:integer; Lvi: TListViewItem; begin LsvObjects.BeginUpdate; LsvObjects.Items.Clear; try for i:=0 to 100 do begin Lvi := LsvObjects.Items.Add; Lvi.Tag := i; Lvi.Data['ObjectText'] := 'ObjectText '+i.ToString; Lvi.Data['StateText'] := 'StateText '+i.ToString; Lvi.Data['ConnectText'] := 'ConnectText '+i.ToString; end; finally LsvObjects.EndUpdate; end; end; в UpdateObjects рандомно выбираю картинку:
      procedure TForm1.LsvObjectsUpdateObjects(const Sender: TObject; const AItem: TListViewItem); var ... oConnectImage: TListItemImage; r: integer; begin r:=Random(ImageList1.Count); oConnectImage:=aItem.Objects.FindDrawable('ConnectImage') as TListItemImage; if (oConnectImage<>nil) then oConnectImage.ImageIndex:=r; ... end; В Windows все нормально. А вот что я вижу на планшетах:
      На Dexp:   
      На Lenovo:
       
      Картинки могут появиться, а могут и нет. Как исправить ситуацию? Вот сам проект.
      Про Berlin добавлю вопрос позже.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу