Devexpress Quantumgrid

  • Автор темы Kapacb
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

Kapacb

#1
Добрый вечер!
очень нужна помощь, бьюсь уже четвертый день.
У меня есть две таблицы interbase, связанные отношением один-ко-многим с помощью целых ключей.
Первая проблема: мне нужно их занести в grid в виде двухуровневого дерева. Делаю я это в unbound mode только по одной причине - чтобы было возможным редактировать значения полей прямо в ячейках сетки, так как ibx ibquery не поддерживает редактирования себя. Загвоздка в том, что я не могу в рантайме получить доступ к detail-view каждой строки из master-view, так как клоны создаются в памяти только при разворачивании строки из master-view. Поэтому мне приходится делать вот что:
Код:
with q_Main do begin
 close;
 {отбор всех записей из главное таблицы}
 SQL.Text := 'select * from Main ';
 open; first;
 {обход датасета}
 while not eof do begin
  {добавление новой строки в MainView}
  MainView.DataController.RecordCount := MainView.DataController.RecordCount+1;
  {занесение в неё значения из датасета}
  MainView.DataController.Values[MainView.DataController.RecordCount-1,0] := fieldByname('name').AsString;
  {разворачиваем поддерево этой строки, создавая, таким образом, клон DetailView}
  MainView.ViewData.Rows[MainView.DataController.RecordCount-1].expanded := true; 
  {g = только что созданный клон}
  g :=DetailView.clones[MainView.DataController.RecordCount-1];
  with q_poz do begin
   close;
   {отбор записей из подчиненной таблицы}
   SQL.Text := 'select * from detail where out = '+ q_Main.fieldByname('id').AsString;
   open;  first;
   {обход подчиненного датасета с занесением значений в клон}
   while not eof do begin
    g.DataController.RecordCount := g.DataController.RecordCount+1;
    g.DataController.Values[g.DataController.RecordCount-1,0] := q_poz.fieldByname('name').AsString;;
    next;
   end; // while
  end; // with
  {сворачивание текущей строки MasterView}
  razdView.ViewData.Rows[razdView.DataController.RecordCount-1].expanded := false;
  next;
 end; // while
end; //with
как видно, мне пришлось пойти жутко кривой дорогой, и я надеюсь на Вашу помощь :)

Проблема номер два: после того, как пользователь что-то поменял в гриде, я должен сохранить изменения в базе. Для этого я очищаю обе приведенные таблица и заново заполняю их с помощью обхода MasterView и соответствующих клонов DetailView. Но я не могу этого сделать!! Я не могу получить доступ к клонам с сохранением целостности ключей - ведь не обязательно клон DetailView для строки MainView с индексом i, будет иметь индекс i !! То есть, проблема сводится к банальному обходу дерева таблиц.

И проблема номер три: существует ли компонент связи с базой interbase, способный обеспечить обновление записей прямо в сетке? Чтобы я не парился :)
ЗЫ Поиск в яндексе не дал результатов, как и трехкратное штудирование хелпа и примеров к компоненту.
 
Статус
Закрыто для дальнейших ответов.