Технические вопросы
5.x

Как заблокировать редактирование Детали в зависимости от значения логического поля в основном реестре

Как сделать так , чтобы при переходе по записям основного реестра, кнопки редактирования на Детали меняли свою доступность(Enabled) в зависимости от значения логического поля записи в основном реестре
Если у записи установлен флаг Заблокирован, то менять содержимое Детали нельзя
1 ая мысль: по событию "Активная строка сменена" в основном реестре в скрипте обращаться к кнопкам редактирования Детали и менять их состояние на неактивное

Нравится

8 комментариев

Здравствуйте, Ольга!

Я бы рекомендовала попробовать выполнить эту доработку следующим образом:

В странице раздела подписаться на событие 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
Как в этом случае правильно обратиться к значению, возможно из параметров события

такаяже задача и таже проблема.
[csharp]
Page.DataSource.ActiveRow = null
[/csharp]

Как еще можно получить текущую запись?

Здравствуйте, Илья!

Уточните, пожалуйста, на каком событии Вы пытаетесь это сделать и для какой страницы? Возможно, в момент, когда Вы обращаетесь к 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]

Показать все комментарии