Один из простых способов, которым я могу думать о том, что вы пытаетесь сделать, заключается в следующем. Позвольте мне уйти отсюда c. Я работал над проектами, в которых все элементы управления форм были построены из метаданных. И мета пришла с информацией о лицензировании. Таким образом, когда элемент управления был размещен там, где он должен, он также был отключен или установлен только для чтения на основе метаданных, но вся функция была бы скрыта, если информация о лицензировании ограничивала доступ к нему. Возвращаясь к вашему подходу, это не плохой подход, и я вижу, что это можно сделать. И это можно сделать двумя способами (быстро из моей головы).
- Использование пользовательских элементов управления в качестве поверхности для компонентов, которые вы хотите включить / отключить. Создайте интерфейс
public interface IDisableableControl // make your fine name, no methods needed - marker interface
. . . . .
public class MyFineUserControl : UserControl, IDisableableControl
И в вашем static
методе, который вы собираетесь написать, передайте форму, найдите все элементы управления, которые реализуют этот интерфейс, и работайте так, как вы хотите.
2. Точно так же вы можете использовать свойство Tag
, которое доступно для каждого элемента управления. При этом вы можете фактически установить свой сложный объект безопасности, который может поступать из метаданных, хранящихся в БД, а затем оценить этот объект, хранящийся в Tag
, для применения вашей конфигурации
Ваш метод должен быть рекурсивным
internal static void SetAllControls(Control parent)
{
// Do something with control, for example parent.Enabled = false
if (parent is IDisableableControl)
{
// here you use your logic, evaluate your parent you're dialing with and
// enable/disable correspondingly
parent.Enabled = false;
return;
}
foreach(var c in parent.Controls)
SetAllControls(c);
}
В реальной жизни ваш ТОП-родитель будет формой, и его не нужно будет отключать, но это точно будут дети. Фактически, в большинстве случаев, когда вы находите UserControl
, который реализует IDisableableControl
, который должен быть концом строки, это означает, что вам не нужно go в дочерних элементах управления, так как все они находятся на этом родительском элементе и все будет отключен