Добрый день.

Подскажите пожалуйста, как ограничить минимальное количество записей в реестре?
Т.е. как сделать чтобы пользователь не смог удалить все записи? Должна остатся как минимум одна запись. И кнопка "Удалить" должна стать не активной.

В принципе достаточно события которое происходит при любом обновлении реестра. И на него повесить чтото типа :

if (Page.DataSource.Rows.Count > 1)
{
  Page.DeleteButton.SetEnabled(true);
}
else
{
  Page.DeleteButton.SetEnabled(false);
}

Нравится

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

Для того, чтобы изменить количество выводимых строк, следует в обработчике события PageLoadComplete добавить следующую строку:

Page.DataSource.PageRowsCount = 20;

где 20 – количество записей, которые следует загружать.

Изменения следует вносить в тот реестр, где нам нужно больше(меньше) строк, либо в базовый реестр, от которого мы наследуем все остальные (если нужно для всех реестров).

Мне кажется, автор спрашивал о другом...

Возможно, стоит повесить эту логику на события датасорса в окне реестра: "После сохранения записи", "После удаления записи" и "После загрузки данных" (для учёта первого открытия и смены записи в основном реестре, если это деталь). Но не уверен, достаточно ли их.

Дмитрий, мне надо запретить пользователю удалять запись если она последняя, а не общее количестов выводимых строк в реестре.
Александр, так и делаю, хотелось более аакуратного решения, например событие Refresh у грида, но найти такое событие не получилось.
Возникло две проблемы:
1. если подписатся на событие "DataSourceBeforeRemove" то оно не срабатывает перед удалением.
2. если я из кода устанавливаю

Page.DeleteButton.SetEnabled(false);

то через секунду кнопка сама восстанавливает свое состояние (становится активна)

С кнопкой разобрался, достаточно использовать свою кнопку помещенную в отдельный контейнер.

А с событиями проблема.
При удалении работает только "DataSourceRemoved", а при добавлении не работает ни одно событие, вот список : "DataSourceBeforeInsert, DataSourceInserted, DataSourceBeforeSave, DataSourceSaved".
Точнее при добавлении записи срабатывает "DataSourceLoaded", но при срабатывании

Page.DataSource.Rows.Count

равен 1 всегда.
Вопрос, как получить количество записей в реестре после добавления записи, и в зависимости от этого выполнить

Page.DeleteButton.SetEnabled(true/false)

Илья, после любой операции, будь то добавление, удаление, изменение записи - происходит обновление DataSouce'а, соответственно в общем случае всегда будет выполнятся одно событие:

DataSourceLoadRowsResponseRegistered

Соответственно, я думаю необходимо в Вашей странице определить это событие, затем отправить процесс в базовое событие, а уже после базового добавить скрипт:

var dataSourceRowsCount = Page.DataSource.Rows.Count;
if(dataSourceRowsCount < 2)
{
Page.DeleteButton.SetEnabled(false)
}

Дмитрий, спасибо, событие действительно происходит, но при добавлении записи Page.DataSource.Rows.Count всегда равен 1.
Как можно посмотреть реальное количество записей не выполняя SELECT к базе?

Илья, только при добавлении?

Дмитрий, также при удалении равен 0. А при обновлении реестра показывает реальное количество записей.

Илья, попробуйте, пожалуйста, рефрешнуть грид, а также вызвать LoadRows() для DataSource'а перед тем как считывать кол-во записей:

Page.DataSource.LoadRows();
TreeGrid.RefreshData();
var dataSourceRowsCount = Page.DataSource.Rows.Count;
if(dataSourceRowsCount < 2)
{
Page.DeleteButton.SetEnabled(false)
}

(где TreeGrid - это контрол для DataSource'a)

Дмитрий, если я в событии DataSourceLoadRowsResponseRegistered сделаю рефреш грида, то образуется рекурсия.

Проверил, вот так работает:

var dataSourceRowsCount = Page.DataSource.Rows.Count;
if(dataSourceRowsCount == 1)
{
	Page.DataSource.LoadRows();
	Page.TreeGrid.RefreshData();
}
dataSourceRowsCount = Page.DataSource.Rows.Count;
if(dataSourceRowsCount < 2)
{
	Page.DeleteButton.SetEnabled(false);
}

Вот мой код:

var dataSourceRowsCount = Page.DataSource.Rows.Count;
MessagePanel messagePanel = ControlUtilities.FindControl(
                Page.AspPage.Controls[0], "BaseMessagePanel", true) as MessagePanel;
if (messagePanel != null) {
                messagePanel.AddMessage(Warning, dataSourceRowsCount.ToString(), MessageType.Warning);
}
if(dataSourceRowsCount == 1)
{
	Page.DataSource.LoadRows();
	Page.TreeGrid.RefreshData();
}
dataSourceRowsCount = Page.DataSource.Rows.Count;
if (messagePanel != null) {
                messagePanel.AddMessage(Warning, dataSourceRowsCount.ToString(), MessageType.Warning);
}
if(dataSourceRowsCount < 2)
{
	//Page.DeleteButton.SetEnabled(false);
}
return true;

Вот результат при добавлении:

Дмитрий, а на какое событие Вы вешали обработчик? Делаю как и у Вас но получаю зацикливание и BPM падает.

Падение происходит когда строки

//        Page.DataSource.LoadRows();
//        Page.TreeGrid.RefreshData();

раскоментированы

Илья, так у Вас первые две строки

// Page.DataSource.LoadRows();
// Page.TreeGrid.RefreshData();

выполняются всегда, если их раскоментировать. Нужно их убрать и поместить в if.
Если так сделаете - то зацикливание произойдет только тогда, когда Вы добавляете первую запись в реестр (до этого было 0). Можно добавить какой-то int параметр i = 0 в процесс, и в условие добавить

if(dataSourceRowsCount == 1 && i == 0) {
i++;
LoadRows();
Refresh();
}

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