Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 27 апр 2024, 08:23

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Отработка Lookupcashe
СообщениеДобавлено: 27 авг 2015, 13:01 
Не в сети

Зарегистрирован: 27 авг 2015, 09:26
Сообщений: 7
Обновил версию 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;


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB