2009-06-08 3 views
3

У меня есть рекурсивный метод в базовой форме, который принимает флаг управления и включен. Он проходит через каждый элемент управления в форме и на основании того, что тип управления, он соответственно устанавливает цвет фона элемента управления и присваивает этому свойству свойство enabled.Ускорить включение/выключение элементов управления (C# WinForms)

Как правило, метод называется передачей (этим) в качестве элемента управления, он проходит через все элементы управления и их элементы управления и соответственно устанавливает вещи. Это отлично работает, но у форм есть все больше и больше элементов управления, добавленных к ним, вы можете увидеть, что элементы управления отключены один за другим, и он не выглядит хорошо.

У кого-нибудь есть идея, как я могу либо переписать это, либо не дать ему продемонстрировать процесс отключения на каждом элементе управления один за другим? Что-то вроде SuspendLayout, которое будет работать в этом случае? Это не возможность добавить панель в форму и просто отключить ее и снова включить ее в конце, потому что у меня есть около 200 + форм, которые унаследованы от этой базовой формы и не могут пройти через каждый из них и заставить ее добавить элементы управления в панель. Это также не сработает, потому что это не только вопрос включения/отключения элементов управления, но и применение к ним другой логики.

+1

Сколько элементов управления на этой форме мы говорим примерно? – curtisk

+0

нет * это * много. Вероятно, около 20/30. – Madeleine

+0

Не могли бы вы разместить свой код? –

ответ

7

Enclose модификации в:

form.SuspendLayout(); 

и

form.ResumeLayout(false); // read the doc about "false", might be a little unsafe 

Кроме того, обход иерархии управления может быть много времени. Вы можете сделать это один раз и кэшировать их в списке и после этого ссылаться на этот список.

+0

SuspendLayout не работает для включения/выключения. Он работает только для краски и макета ... – Madeleine

+3

Я не уверен. Возможно, вы правы, но в любом случае вы сказали в вопросе: «это не только вопрос включения/отключения элементов управления, но и применение к ним другой логики». Если вы имеете дело только с элементами управления 20/30, я думаю, ваша проблема заключается в поиске их в дереве управления. Не могли бы вы просто кэшировать их в массиве один раз и вместо этого использовать кеш-список? –

+1

Я мог бы попробовать загрузку экрана, добавить их в список, а затем выполнить логику компоновки в списке ... увидит, если это произойдет быстрее. Спасибо – Madeleine

-3

Переопределите метод OnPaint и вызовите super :: OnPaint, если вы закончили его отключение (IsDoneDisabling = true). Это всего лишь обходной путь, который не является хорошим дизайном.

OnPaint(...) 
{ 
if (IsDoneDisabling) 
    super::OnPaint(...); 
} 
+1

Вопрос помечен C#, .NET. Интересно, действительно ли синтаксис действителен в C# ... не говоря уже о концепции картины, которая не имеет значения. –

+0

Это просто простой псевдокод. Кроме того, я не понимаю вашу неуместность живописи. –

Смежные вопросы