С 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, чтобы я мог обновить определенный столбец / поле в моей таблице базы данных.