Devexpress Quantumgrid

Тема в разделе "Delphi - Компоненты", создана пользователем Kapacb, 16 авг 2005.

Статус темы:
Закрыта.
  1. Kapacb

    Kapacb Гость

    Добрый вечер!
    очень нужна помощь, бьюсь уже четвертый день.
    У меня есть две таблицы interbase, связанные отношением один-ко-многим с помощью целых ключей.
    Первая проблема: мне нужно их занести в grid в виде двухуровневого дерева. Делаю я это в unbound mode только по одной причине - чтобы было возможным редактировать значения полей прямо в ячейках сетки, так как ibx ibquery не поддерживает редактирования себя. Загвоздка в том, что я не могу в рантайме получить доступ к detail-view каждой строки из master-view, так как клоны создаются в памяти только при разворачивании строки из master-view. Поэтому мне приходится делать вот что:
    Код (Text):
    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, способный обеспечить обновление записей прямо в сетке? Чтобы я не парился :)
    ЗЫ Поиск в яндексе не дал результатов, как и трехкратное штудирование хелпа и примеров к компоненту.
     
Статус темы:
Закрыта.

Поделиться этой страницей