Обновил версию ehlib с версии 5.4 до 8
При этом появилась проблема отработки Lookup полей, если LookupDataset для каждой строчки свой. То есть LookupDataset фильтруется в зависимости от строчки, которая редактируется.
В результате получается нехорошая картинка - когда при отображении таблицы LookupDataset отфильтрован для текущей строчки, но DbgridEh зачем то использует Lookup значения для всех строчек вместо одной, которая редактируется на данный момент, вместо того, чтобы чтобы просто взять значения полей из DataSet.
Предлагаю модифицировать процедуру примерно так, как приведено ниже. Ну или что то в этом роде, но надо учитывать то, что в DataSet уже есть понятие LookupCache и он уже там уже отрабатывается.
Основной смысл этой модификации заключается в том, что мы переопределяем механизм LookupCache только когда LookupCache в нашем dbGridEh активно. В противном случае используем стандартный механизм DataSet, а DataSet все сам отработает.
Скорее всего я тут не все учел, но я в свое время специально модифицировал Dataset и встроил в него нужную мне отработку Lookup полей, чтобы можно было фильтровать выпадающий список в зависимости от строки - которая редактируется. И у меня это работает и на стандартных компонентах и на старом dbGridEh. В новом dbGridEh принудительно включен механизм GetLookupValue - а мне нужно всего то навсего взять его из DataSet.
Код:
function TColumnEh.DisplayText: String;
var
ViewRow: Integer;
Index: Integer;
begin
if LookupParams.LookupActive then
begin
if Grid.MemTableSupport and
not Grid.FIntMemTable.MemTableIsTreeList and
(Grid.DataLink.DataSet.State in [dsBrowse, dsEdit, dsInsert, dsCalcFields, dsInternalCalc]) then
begin
ViewRow := Grid.FIntMemTable.InstantReadViewRow;
Index := Grid.FIntMemTable.InstantReadViewRow;
if (ViewRow >= 0) and (Length(LookupParams.FLookupValues) > Index) then
begin
if VarIsEmpty(LookupParams.FLookupValues[Index]) then
LookupParams.FLookupValues[Index] := GetLookupValue;
Result := VarToStr(LookupParams.FLookupValues[Index]);
end else if (ViewRow = -1) then
Result := VarToStr(GetLookupValue)
else
Result := '';
end else
if LookupParams.LookupCache then //Добавлено
Result := VarToStr(GetLookupValue) //Это то что было
else //Добавлено
Result := FormatFieldDisplayValue(Field, DisplayFormat); //Добавлено
end else
Result := inherited DisplayText;
end;