Мастер / подробности синхронизации Delphi/DevExpress о состоянии флажка
Информация о версии: Delphi 2010, Express Quantum GridSuite 6.56
Я унаследовал некоторый код, в котором у программиста есть две сетки в отношении master/detail (Customers->Devices), и он сделал эту работу следующим образом:
- Он связывает свое основное свойство источника данных TCXGrid с источником данных Customer, который, в свою очередь, ссылается на таблицу Customer.
- Он связывает свой подробный источник данных TCXGrid с источником данных устройства, который затем связывается с базовой таблицей устройств.
- Чтобы реализовать магию Master/Detail, он подключается к событию AfterScroll таблицы Customer и устанавливает фильтр в наборе данных Device на основе ключа в текущей записи таблицы Customer.
Код:
procedure TdmData.tblCustomerAfterScroll(DataSet: TDataSet);
begin
if tblDevices.Active then
begin
tblDevices.filter := 'DCKEY=' +
inttostr(DataSet.FieldbyName('CKEY').AsInteger)
{+ ViewInactiveString}; //my addition
tblDevices.Filtered:=True;
end;
end;
Это работает. (То есть, когда пользователь щелкает по клиенту сетку Customer, сетка Devices изменяется, отображая только устройства этого клиента.)
Моей задачей было добавить дополнительный (глобальный) фильтр для неактивных устройств. Поэтому на этой главной странице / странице сведений я установил флажок, ссылающийся на глобальную таблицу настроек, связанную с полем с именем view_inactive. Я добавил фильтр, описанный в шаге 3.
function TdmData.ViewInactiveString: String;
begin
if not tblSettingsVIEW_INACTIVE.AsBoolean
then Result := ' AND ACTIVE <> FALSE'
else Result := '';
end;
Это также работает в том смысле, что когда пользователь нажимает на сетку Клиента, сетка Устройства отображается на устройствах этого клиента, которые не являются неактивными. Но сетка устройства не обновляется, пока пользователь не нажмет на сетку клиента, и я хочу, чтобы она обновилась сразу.
Я подключился к флажку OnClick, чтобы вызвать метод AfterScroll клиента, но это не обновляет детальную сетку. Я заметил, что это происходит потому, что связанное поле view_inactive все еще возвращает старое состояние. Я полагаю, что события происходят не в том порядке, в котором я ожидал, поэтому мне придется подключиться к таблице глобальных настроек. Я пытаюсь использовать следующие события:
- Таблица настроек AfterPost
- Настройки источника данных OnDataChange
- Источник данных настроек OnUpdateData
- Данные настройки набора AfterPost
В каждом случае, независимо от того, запущено событие или нет, результат один и тот же. Базовая таблица view_inactive еще не установлена. Но если я нажму на сетку клиента, это как-то так.
Куда я иду не так?
1 ответ
Похоже, ты слишком усложняешься. Игнорировать таблицу глобальных настроек. Поместите что-то вроде этого в новую процедуру и вызовите ее из AfterScroll для tblCustomer, OnClick для флажка и когда tblDevices станет активным.
if tblDevices.Active then
begin
tblDevices.filter := 'DCKEY=' + inttostr(DataSet.FieldbyName('CKEY').AsInteger);
if not CheckboxViewInActive.checked then Devices.filter := theDevices.Filter +' AND ACTIVE <> FALSE';
tblDevices.Filtered:=True;
end;
Если вы хотите загрузить / сохранить этот параметр в таблице глобальных настроек, сделайте это отдельно.