Добрый день.
Подскажите пожалуйста, как ограничить минимальное количество записей в реестре?
Т.е. как сделать чтобы пользователь не смог удалить все записи? Должна остатся как минимум одна запись. И кнопка "Удалить" должна стать не активной.
В принципе достаточно события которое происходит при любом обновлении реестра. И на него повесить чтото типа :
{
Page.DeleteButton.SetEnabled(true);
}
else
{
Page.DeleteButton.SetEnabled(false);
}
Нравится
Для того, чтобы изменить количество выводимых строк, следует в обработчике события 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) }
Илья, попробуйте, пожалуйста, рефрешнуть грид, а также вызвать LoadRows() для DataSource'а перед тем как считывать кол-во записей:
Page.DataSource.LoadRows(); TreeGrid.RefreshData(); var dataSourceRowsCount = Page.DataSource.Rows.Count; if(dataSourceRowsCount < 2) { Page.DeleteButton.SetEnabled(false) }
(где TreeGrid - это контрол для DataSource'a)
Проверил, вот так работает:
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;
Вот результат при добавлении:
Илья, так у Вас первые две строки
// Page.DataSource.LoadRows();
// Page.TreeGrid.RefreshData();
выполняются всегда, если их раскоментировать. Нужно их убрать и поместить в if.
Если так сделаете - то зацикливание произойдет только тогда, когда Вы добавляете первую запись в реестр (до этого было 0). Можно добавить какой-то int параметр i = 0 в процесс, и в условие добавить
if(dataSourceRowsCount == 1 && i == 0) {
i++;
LoadRows();
Refresh();
}