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

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

Нравится

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

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

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

В странице раздела подписаться на событие 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 = null

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

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

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