Как заблокировать редактирование Детали в зависимости от значения логического поля в основном реестре
Как сделать так , чтобы при переходе по записям основного реестра, кнопки редактирования на Детали меняли свою доступность(Enabled) в зависимости от значения логического поля записи в основном реестре
Если у записи установлен флаг Заблокирован, то менять содержимое Детали нельзя
1 ая мысль: по событию "Активная строка сменена" в основном реестре в скрипте обращаться к кнопкам редактирования Детали и менять их состояние на неактивное
Нравится
Здравствуйте, Ольга!
Я бы рекомендовала попробовать выполнить эту доработку следующим образом:
В странице раздела подписаться на событие DetailsTabPanelTabChange, вычитывать на этом этапе активную деталь:
[csharp]
var detailsTabPanel = Page.PageContainer.FindPageControlByName("DetailsTabPanel") as Terrasoft.UI.WebControls.Controls.TabPanel;
var activeTab = detailsTabPanel.Tabs[detailsTabPanel.ActiveTabIndex];
[/csharp]
и если это Ваша - отключать контролы:
[csharp]
var detailButtonContainer = (detailPageContainer.FindPageControlByName("ButtonsControlLayout"));
detailButtonContainer.Enabled = false;
//или так
// script += string.Format("{0}.setEnabled(false);", detailButtonContainer .ClientID);
[/csharp]
Анна, спасибо,воспользовалась вашим кодом, но сделала чуть по другому:
В странице раздела подписалась на событие GridActiveRowChanged, в скрипт вставила ваш код
[csharp]
var treeGrid = Page.Grid.FindPageControlByName("TreeGrid") as TreeGrid;
bool bl = treeGrid.DataSource.ActiveRow.GetTypedColumnValue("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;
}
[/csharp]
Но когда начинаю обращаться к активной строке,
[csharp]
bool bl = treeGrid.DataSource.ActiveRow.GetTypedColumnValue("IsBlocked");
[/csharp]
к конкретному полю, вылетает NullReferenceException
Как в этом случае правильно обратиться к значению, возможно из параметров события
Здравствуйте, Илья!
Уточните, пожалуйста, на каком событии Вы пытаетесь это сделать и для какой страницы? Возможно, в момент, когда Вы обращаетесь к Page.DataSource.ActiveRow данные в реестр еще не загружены.
Попыток делалось много.
1. Страница раздела. событие RefreshDetails
[csharp]
var treeGrid = Page.Grid.FindPageControlByName("TreeGrid") as TreeGrid;
if (treeGrid.DataSource.ActiveRow == null)
{
return true;
}
[/csharp]
или так
[csharp]
var dataSource = GetActiveDataSource();
if (dataSource .ActiveRow == null)
{
return true;
}
[/csharp]
2. Страница реестра. событие DataSourceActiveRowChanged, Button1Click (добавил кнопку для теста)
[csharp]
if (Page.DataSource.ActiveRow == null)
{
return true;
}
[/csharp]
во всех этих случаях ActiveRow = null
Илья, у меня заработало следующим образом
[csharp]
var treeGrid = Page.Grid.FindPageControlByName("TreeGrid") as TreeGrid;
bool b = (bool)treeGrid.SelectedNodes[0].Values["IsBlocked"];
[/csharp]
т.е. обращаться к выбранной строке грида
Вот реализовал таким образом:
[csharp]
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();
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;
[/csharp]