Dynami c Введите маску, используя графство DA C на экране клиента - PullRequest
0 голосов
/ 29 января 2020

Добрый день

Я пытаюсь установить маску ввода во время выполнения в соответствии с выбранной страной.

Я создал следующий DA C для сохранения маски ввода:

namespace PX.Objects.CS
{
  public class CountryExt : PXCacheExtension<PX.Objects.CS.Country>
  {
    #region UsrPhoneMask
    [PXDBString(50)]
    [PXUIField(DisplayName="Phone Mask")]

    public virtual string UsrPhoneMask { get; set; }
    public abstract class usrPhoneMask : PX.Data.BQL.BqlString.Field<usrPhoneMask> { }
   #endregion
  }
}

Часть, с которой я борюсь, это когда я перезаписываю атрибут на уровне экрана, это поле Phone1 на экране клиента:

namespace PX.Objects.AR
{
  public class CustomerMaint_Extension : PXGraphExtension<CustomerMaint>
  {
    #region Event Handlers

    [PXDBString(50, IsUnicode = true,
    InputMask = Search<CountryExt.usrPhoneMask, Where<Country.countryID,Equal<Current<Country.countryID>>>>]

    [PXUIField(DisplayName = "Phone 1", Visibility = PXUIVisibility.SelectorVisible)]
    // [PhoneValidation()]
    [PXMassMergableField]
    [PXPersonalDataField]
    protected virtual void Contact_Phone1_CacheAttached(PXCache cache){ }
  }
}

Я знаю, что это поиск Я неправильно понимаю, просто не знаю, как это исправить.

Я также пытался установить его с помощью const

    public const string Masknum = PXSelect<CountryExt.usrPhoneMask, Where<Country.countryID, Equal<Current<Country.countryID>>>>;
    public class masknum : PX.Data.BQL.BqlString.Constant<masknum>
    {
        public masknum() : base(Masknum) {; }
    }
    PXSelect<CountryExt.usrPhoneMask, Where<Country.countryID,Equal<Current<Country.countryID>>>>;

    [PXDBString(50, IsUnicode = true, InputMask = Masknum)]
    [PXUIField(DisplayName = "Phone 1", Visibility = PXUIVisibility.SelectorVisible)]
    // If you do not remove below attribute the mask will not be set
    // [PhoneValidation()]
    // [PXMassMergableField]
    [PXPersonalDataField]
    protected virtual void Contact_Phone1_CacheAttached(PXCache cache)
    {

    }

1 Ответ

0 голосов
/ 31 января 2020

Значения свойств, объявленные в атрибуте DA C, не являются динамическими c, поскольку они должны быть постоянными значениями. NET Компиляторами Framework. Чтобы изменить маску во время выполнения, вы должны исследовать свойство ReturnState событий CacheAttached и FieldSelecting.

На странице Source Code (SM204570) вы можете найти OrderSiteSelectorAttribute, который реализует динамическую маску c, используя эти методы. enter image description here

Другие примеры, поставляемые в исходном коде продукта, могут быть более полезны для вашего случая использования, поэтому вы также можете выполнить широкий поиск для ReturnState. Вот соответствующий код, показанный на снимке экрана выше:

public override void CacheAttached(PXCache sender)
{
    base.CacheAttached(sender);

    PXDimensionAttribute attr = new PXDimensionAttribute(SiteAttribute.DimensionName);
    attr.CacheAttached(sender);
    attr.FieldName = _FieldName;
    PXFieldSelectingEventArgs e = new PXFieldSelectingEventArgs(null, null, true, false);
    attr.FieldSelecting(sender, e);

    _InputMask = ((PXSegmentedState)e.ReturnState).InputMask;
}

public override void SubstituteKeyFieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
{
    base.SubstituteKeyFieldSelecting(sender, e);
    if (_AttributeLevel == PXAttributeLevel.Item || e.IsAltered)
    {
        e.ReturnState = PXStringState.CreateInstance(e.ReturnState, null, null, null, null, null, _InputMask, null, null, null, null);
    }
}

РЕДАКТИРОВАТЬ:

Из соответствующего события DA C RowSelected, попробуйте вызвать SetInputMask метод. Если это дает ожидаемые результаты, это самый простой способ получить динамическую c маску ввода:

PXStringAttribute.SetInputMask<DAC.field>(sender, inputMaskValue);
...