Мне нужно выполнить действие с выбранной в данный момент строкой сетки. Я могу сделать это, импортировав экран в проект настройки, но это единственное изменение, необходимое для экрана. Желая оставить как можно больше Acumatica нетронутым, за исключением случаев, когда это абсолютно необходимо (для облегчения возможности обновления с помощью новых выпусков), я стараюсь не втягивать экран в проект настройки только для включения синхронизации в сетке.
Я создал расширение графика для INSiteMaint, чтобы добавить мою кнопку действия. Я попытался создать объект INLocation, а затем установить его в обработчике события Events.RowSelected. При нажатии моей кнопки действия объект, кажется, всегда является 1-й строкой сетки.
public class INSiteMaint_Extension : PXGraphExtension<INSiteMaint>
{
INLocation location;
public override void Initialize()
{
base.Initialize();
Base.action.AddMenuAction(myAction);
}
protected void _(Events.RowSelected<INLocation> e)
{
INLocation row = e.Row;
if (row?.LocationID != null)
{
location = row;
}
}
#region Print Item Label
public PXAction<INSite> myAction;
[PXUIField(DisplayName = "My Action Label", MapEnableRights = PXCacheRights.Select)]
[PXButton]
protected virtual IEnumerable MyAction(PXAdapter adapter)
{
INSite site = Base.site.Current;
if (location?.LocationID != null)
{
...
Я также попытался создать представление INLocation для установки Current в обработчике события Events.RowSelected. Это не приводит к ошибкам компиляции, но при таком подходе экран не загружается полностью. Очевидно, что это небезопасный подход.
public class INSiteMaint_Extension : PXGraphExtension<INSiteMaint>
{
public PXSelect<INLocation> loc;
public override void Initialize()
{
base.Initialize();
Base.action.AddMenuAction(myAction);
}
protected void _(Events.RowSelected<INLocation> e)
{
INLocation row = e.Row;
if (row?.LocationID != null)
{
loc.Current = loc.Search<INLocation.locationID>(row.LocationID);
}
}
#region Print Item Label
public PXAction<INSite> myAction;
[PXUIField(DisplayName = "My Action Label", MapEnableRights = PXCacheRights.Select)]
[PXButton]
protected virtual IEnumerable MyAction(PXAdapter adapter)
{
INSite site = Base.site.Current;
INLocation location = loc.Current;
if (location?.LocationID != null)
{
...
Я подозреваю, что моя основная проблема заключается в том, что без синхронизации нет обратного вызова для запуска моих событий. Мне нужно добавить эту функцию на несколько экранов, и это небольшое изменение похоже на то, что добавление экрана в проект настройки серьезно излишне для удобства сопровождения во время обновлений.