У меня есть страница с элементом управления PXTab
и хочу показывать или скрывать отдельные вкладки на странице динамически. Как я могу контролировать видимость вкладок во время выполнения?Скрывать вкладку из пользовательского интерфейса динамически
ответ
Вы можете сделать это в одном из следующих двух способов:
- Установив свойство VisibleExp на PXTabItem в ASPX странице
- По включение/отключение AllowSelect свойство зрения, которое служит в качестве DataMember сетки, которая отображается на этой вкладке
метод 1 - VisibleExp В этом методе, вы d непосредственно напишите условия, при которых вкладка должна быть видимой в коде ASPX экрана.
<px:PXTabItem Text="Tax Agency Settings" BindingContext="tab"
VisibleExp="DataControls["chkTaxAgency"].Value = 1">
Обратите внимание, что связывание контекста важен, так как он определяет, какой DataControls элемента вы хотите получить доступ в VisibleExp. Также DataControls - это набор значений для полей пользовательского интерфейса, поэтому вам нужно указать идентификаторы элементов управления (а не поля класса доступа к данным).
Однако этот способ крайне ограничен несколькими способами:
- Проверка состояния ограничивается управления, доступных в пользовательском интерфейсе, так что это не возможно состояние видимости при внутреннем состоянии системы ,
- Иногда этот метод требует, чтобы вы включили «поддельные» элементы управления данными в ASPX, который будет проверяться только в VisibleExp, но на самом деле его никогда не увидит.
- Кажется, что нет поддержки сложных условий, включая AND/OR.
- Ugly
"
Объекты вместо обычных котировок в выражении - не особенно читабельны.
Самое главное, если вам нужно отключить вкладку для определенного типа документа, нет никакого способа жесткого кодирования константы в VisibleExp. Вы бы явно писать что-то вроде: VisibleExp = "! DataControls [" edDocumentType "] .Value = CHK"
жесткого кодирования, как правило, считается очень плохой практикой развития. Это создает значительную угрозу для ремонтопригодности кода: возможно, вышеприведенный код сломает что-то в будущем. Например, если вы решили переименовать коды документов из CHK в CHQ.
В дополнение к этому это решение не просто обобщается на ситуации, когда вы вдруг обнаруживаете необходимость скрывать вкладку не только для проверок, но и для других типов документов. Это связано с отсутствием сложных условных выражений, упомянутых выше.
Метод 2 - AllowSelect Идея этого метода - если вы скрыть все элементы управления из вкладки элемента, чем Acumatica автоматически скрыть вкладку без видимых элементов управления.
Давайте делать пример: предположим, что вам нужно, чтобы скрыть вкладку с именем приложения в зависимости от типа документа, выбранного в SO303000 (Счета-фактуры):
Вкладка, что мы заинтересованы в имеет контроль сетки с данными член установлена Регулировка:
<px:PXTabItem Text="Applications" RepaintOnDemand="false">
<Template>
<px:PXGrid ID="detgrid" DataSourceID="ds" SkinID="Details">
<Levels>
<px:PXGridLevel DataMember="Adjustments">
............
</px:PXGridLevel>
</Levels>
</px:PXGrid>
</Template>
</px:PXTabItem>
И не то, что эта вкладка элемент имеет только один элемент управления - PXGrid
. Также обратите внимание на требуемое свойство здесь - RepaintOnDemand="false"
. Это свойство указывает, будет ли элемент обновления элемента управления обновлять содержимое элемента (и выбирать данные) после того, как элемент станет видимым. К сожалению, установка этого параметра на false приводит к определенным потерям производительности. В частности, просмотр настроек «Выбор» будет отображаться гораздо чаще.
В настоящее время вкладка «умна» в том смысле, что она понимает, что когда дочерний элемент управления (PXGridLevel
) не может выполнить выбор в своем элементе данных; в этом случае вкладка скрывается от пользовательского интерфейса. Именно поэтому вы можете контролировать видимость вкладки, установив AllowSelect
свойство кэша, что соответствует Регулировки:
Adjustments.Cache.AllowSelect =
doc.DocType != ARDocType.CashSale
&& doc.DocType != ARDocType.CashReturn;
Приведенный выше код записывается в ARInvoice_RowSelected
обработчик графика, где ARInvoice
является основным ЦАП и тип основных записей страницы. Таким образом, каждый раз, когда ARInvoice
выбирается вкладка элемент становится видимым или невидимым в зависимости от типа документа.
Этот метод имеет свои ограничения тоже:
- Вы всегда должны помнить, что это не достаточно, чтобы отключить AllowSelect, вы должны также включить его в случае необходимости. Так что вам нужно оценить это свойство каждый раз, когда событие вызывается.
- Этот метод, кажется, не работает без установки
RepaintOnDemand
свойство PXTabItem к ложным (см. Выше)
Источник: http://asiablog.acumatica.com/2016/05/hiding-tab-from-user-interface.html