У нас есть собственная мини-прикладная среда для удовлетворения наших индивидуальных потребностей.Мы используем таблицы данных в наших бизнес-классах для хранения коллекций (например, подробных данных).Наша структура идентифицирует любые свойства типа данных, объявленные в бизнес-объекте, и присоединяет несколько обработчиков событий для предоставления таких услуг, как контроль авторизации, отслеживание изменений и т. Д. Все работает хорошо, но сегодня небольшое требование меня немного озадачило.
Помимо всех требований авторизации, например, доступа на основе ролей для редактирования таблицы данных, редактирования некоторых столбцов таблицы данных и т. Д., Наши разработчики теперь требуют указать критерий для таблицы данных, и тогда все соответствующие строки (удовлетворяющие этим критериям) будут защищены от редактирования..
Например, если есть таблица данных со значениями, как показано ниже -
SettingName |Значение |IsPolicyControlled
Setting1 |10 |False
Setting2 |20 |True
Разработчики хотят указать критерии в рамках нашей бизнес-структуры, как показано ниже -
someBusinessObject.MakeReadOnly ("Настройки", "IsPolicyControlled == true");
первый параметр - имя, которое можно датировать, а второй - критерий для строк, доступных только для чтения.Теперь, как разработчик фреймворка, моя обязанность состоит в том, чтобы запретить любое редактирование в любых строках, которые соответствуют указанному условию.
Для этого я могу прикрепить некоторый обработчик событий к этому датабильному элементу для мониторинга любых изменений, которые вносятся, например, яможет обрабатывать RowChanging для мониторинга вносимых изменений.Теперь мне нужно проверить, соответствует ли изменяемая строка указанному условию.Что-то вроде
if (RowMatchesCondition (e.Row)) // изменения блока
Теперь я не смог найти оптимизированный механизм для достижения этой цели.Одна вещь, которая пришла к моей находке, это использовать метод DataTable.Select () с этим условием и проверить, существует ли текущая строка (в RowChanging) в возвращенном массиве DataRow.Но я ищу немного лучшее решение.
Спасибо за помощь, друзья.