Как обновить IWDBGrid - PullRequest
       51

Как обновить IWDBGrid

0 голосов
/ 13 октября 2019

С Intraweb v14 я использовал эту процедуру для обновления содержимого IWDBGrid:

procedure RefreshIWGrid(zGrid: TIWDBGrid; Self: TIWAppForm);
var 
  zPageContext: TIWBasePageContext; 
  LControlRenderData: TIWHTMLTag; 
  LControlContext: TIWCompContext; 
  LContainerContext: TIWContainerContext; 
begin 
  zPageContext := Self.PageContext; 
  LContainerContext := HTML40ContainerInterface(TIWDBGrid(zGrid)).ContainerContext; 
  //2010-05-12 if you get A/v here, it is because renderinvisible controls on th eform is set to false! 
  LControlContext := TIWCompContext.Create(zGrid, LContainerContext, zPageContext); 
  LControlRenderData := IIWHTML40Component(zGrid).RenderHTML(LControlContext); 
  try 
    LControlRenderData.AddParmsList(zGrid.ExtraTagParams); 
    LControlContext.HTMLTag := LControlRenderData; 
    zGrid.RefreshData(LControlContext, LControlRenderData); 
  finally 
    //if assigned(LControlRenderData) then//Don't free this, the controlcontext frees it 
      //LControlRenderData.Free; 
    if assigned(LControlContext) then//2011-01-25 Memory leak 
      LControlContext.Free; 
  end; 
end;

end;

Теперь с Intraweb v15 я получаю AV на линии:

LControlRenderData := IIWHTML40Component(zGrid).RenderHTML(LControlContext);

и кажется, что LControlContext не инициализирован должным образом. LControlContext загружается в строке:

LControlContext := TIWCompContext.Create(zGrid, LContainerContext, PageContext);  

Есть идеи, почему это происходит с Intraweb v15? Я попытался с IWDBGrid.refresh, но данные обновляются, но я не могу получить доступ к некоторому TIWEDit, который у меня есть в ячейках некоторых столбцов, которые я добавил в IWDBGrid.OnRenderCell, чтобы редактировать некоторые данные, потому что обновление не передает введенные данные в эти TIWEditв Intraweb.

Мой IWDBGrid OnRenderCell:

procedure TIWForm1.IWDBGrid1RenderCell(ACell: TIWGridCell; const ARow, AColumn: Integer);
begin 
  if ARow > 0 then
  begin
case AColumn of 
  2: 
  if Not Assigned(ACell.Control) then 
  begin 
    ACell.Control := TIWEdit.Create(Self); 
    with TIWEdit(ACell.Control) do 
     begin 
        Name := 'MyEdit1'; // Nome único para cada linha 
        Tag := fdmemtable1.FieldByName('codigo').AsInteger; 
        OnAsyncExit := AsyncExitEvent; 
     end; 
  end; 
end;

Мой AsyncExitEvent выглядит так:

procedure TIWForm1.AsyncExitEvent(Sender: TObject; EventParams: TStringList); 
var 
  FieldQtName: String; 
begin 
  FieldQtName := EventParams.Values['IW_Action']; 
  fdmemtable1.Locate('codigo', tiwedit(sender).tag); 
  fdmemtable1.Edit; 
  fdmemtable1.FieldByName('nome').AsString := EventParams.Values[FieldQtName]; 
  fdmemtable1.Post; 
  //IWDBGrid1.DoRefreshControl := True; // Also tried this way 
  IWDBGrid1.Refresh; 
end;

Мне нужен доступ к значению, которое я ввелопределенный TIWEdit, чтобы я мог обновить определенный столбец / поле в моей таблице базы данных.

...