Как заблокировать редактирование Детали в зависимости от значения логического поля в основном реестре
Как сделать так , чтобы при переходе по записям основного реестра, кнопки редактирования на Детали меняли свою доступность(Enabled) в зависимости от значения логического поля записи в основном реестре
Если у записи установлен флаг Заблокирован, то менять содержимое Детали нельзя
1 ая мысль: по событию "Активная строка сменена" в основном реестре в скрипте обращаться к кнопкам редактирования Детали и менять их состояние на неактивное
Нравится
Здравствуйте, Ольга!
Я бы рекомендовала попробовать выполнить эту доработку следующим образом:
В странице раздела подписаться на событие DetailsTabPanelTabChange, вычитывать на этом этапе активную деталь:
var detailsTabPanel = Page.PageContainer.FindPageControlByName("DetailsTabPanel") as Terrasoft.UI.WebControls.Controls.TabPanel; var activeTab = detailsTabPanel.Tabs[detailsTabPanel.ActiveTabIndex];
и если это Ваша - отключать контролы:
var detailButtonContainer = (detailPageContainer.FindPageControlByName("ButtonsControlLayout")); detailButtonContainer.Enabled = false; //или так // script += string.Format("{0}.setEnabled(false);", detailButtonContainer .ClientID);
Анна, спасибо,воспользовалась вашим кодом, но сделала чуть по другому:
В странице раздела подписалась на событие GridActiveRowChanged, в скрипт вставила ваш код
var treeGrid = Page.Grid.FindPageControlByName("TreeGrid") as TreeGrid; bool bl = treeGrid.DataSource.ActiveRow.GetTypedColumnValue<bool>("IsBlocked"); var detailsTabPanel = Page.PageContainer.FindPageControlByName("DetailsTabPanel") as Terrasoft.UI.WebControls.Controls.TabPanel; int activetabindex = detailsTabPanel.ActiveTabIndex; if(activetabindex==1) { var activeTab = detailsTabPanel.Tabs[detailsTabPanel.ActiveTabIndex]; var detailButtonContainer = (activeTab.FindPageControlByName("AddButton")); if(bl) detailButtonContainer.Enabled = false;else detailButtonContainer.Enabled = true; }
Но когда начинаю обращаться к активной строке,
bool bl = treeGrid.DataSource.ActiveRow.GetTypedColumnValue<bool>("IsBlocked");
к конкретному полю, вылетает NullReferenceException
Как в этом случае правильно обратиться к значению, возможно из параметров события
Здравствуйте, Илья!
Уточните, пожалуйста, на каком событии Вы пытаетесь это сделать и для какой страницы? Возможно, в момент, когда Вы обращаетесь к Page.DataSource.ActiveRow данные в реестр еще не загружены.
Попыток делалось много.
1. Страница раздела. событие RefreshDetails
var treeGrid = Page.Grid.FindPageControlByName("TreeGrid") as TreeGrid; if (treeGrid.DataSource.ActiveRow == null) { return true; }
или так
var dataSource = GetActiveDataSource(); if (dataSource .ActiveRow == null) { return true; }
2. Страница реестра. событие DataSourceActiveRowChanged, Button1Click (добавил кнопку для теста)
if (Page.DataSource.ActiveRow == null) { return true; }
во всех этих случаях ActiveRow = null
Илья, у меня заработало следующим образом
var treeGrid = Page.Grid.FindPageControlByName("TreeGrid") as TreeGrid; bool b = (bool)treeGrid.SelectedNodes[0].Values["IsBlocked"];
т.е. обращаться к выбранной строке грида
Вот реализовал таким образом:
var dataSource = GetActiveDataSource(); var select = new Select(UserConnection) .Column("Affiliation","AffiliationTypeId") .From("Affiliation") .Where("Affiliation", "Id").IsEqual(Column.Const(dataSource.ActiveRowPrimaryColumnValue)) as Select; var affType = select.ExecuteScalar<Guid>(); var userID = UserConnection.CurrentUser.Id; var isEdit = false; switch (affType.ToString()) { case //Gruppa klientov --All users isEdit = true;//everybody can edit break; case //Struktura --ORM only isEdit = IsUserInGroup(userID, ORmid); break; default: isEdit = IsUserInGroup(userID, Sid); break; } Page.DetailsTabPanel.SetVisible(isEdit); return true;