Подписка на RSS

Рекурсивный обход узлов TreeView или у попа была собака…

Чтобы понять рекурсию нужно сначала понять рекурсию. Так уж повелось что у многих людей понятие «рекурсия» ассоциируется с вычислением факториала. Не знаю почему, но авторы умных книг в 9 из 10 случаев в разделе о рекурсии помещают пример вычисления факториала. Меня очень забавляет эта ситуация: неужели циклы уже отменили ;). В итоге у читателя складывается впечатление о рекурсии как о интересной, но бесполезной штуковине.

Возьмем обычный TreeView из NET FRAMEWORK. Он устроен таким образом, что любой узел TreeNode может содержать коллекцию Nodes, в которой, в свою очередь, могут содержаться другие узлы, каждый из которых содержит коллекцию Nodes…

(далее…)

Автозавершение слов в NET FRAMEWORK

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

До выхода в свет Net Framework 2.0 автозавершение слов в textbox’ах приходилось реализовывать самостоятельно, теперь же это встроенная возможность. За автозавершение слов отвечают свойства AutoCompleteSource, AutoCompleteMode и AutoCompleteCustomSource редактора textbox.

Первое задает источник строк, которые будут предложены пользователю. Возможные значения задаются одноименным перечислением. Наиболее интересным является AutoCompleteSource.CustomSource, поскольку позволяет использовать собственный список слов, который должен быть задан в свойстве AutoCompleteCustomSource.

Свойство AutoCompleteMode задает режим автозавершения слов, возможные значения: Append, None, Suggest и SuggestAppend.
(далее…)

Сохранение ширины и порядка следования столбцов в DataGridView

Не секрет, что пользователь, проработавший некоторое время с программой, пытается ее настроить «под себя»: поменять цветовую гамму, расположение панелей инструментов, изменить ширину столбцов в сетке DataGridView… На последней возможности остановимся по подробнее.

За разрешение изменять ширину столбца отвечает свойство AllowUserToResizeColumns элемента управление DataGridView, которое по умолчанию установлено в true. Поэтому, если просто поместить компонент DataGridView на форму, пользователь сможет изменять ширину столбцов по своему усмотрению. Однако, если приложение будет закрыто, то все изменения будут потеряны и, при последующем запуске программы, ширина столбцов будет установлена до размеров, заданных программистом во время разработки программы.

Для того, чтобы устранить это досадное «недоразумение» необходимо предусмотреть сохранение ширины столбцов при закрытии приложения и восстановление ее при запуске программы. Раньше для этих целей использовался реестр Windows, теперь же принято «гадить» в профиле пользователя. Хранение параметров приложения в конфигурационном в каталоге с исполняемым файлом плохая идея: есть люди, работающие под учетной записью, не обладающей правами администратора (их немного, но они есть ;), для которых запись в Program Files запрещена (справедливо для файловой системы NTFS).
(далее…)

Чересстрочная подсветка в DataGridView

Когда речь заходит об отображании табличных данных на форме, первое что приходит в голову — это использовать элемент управления DataGridView, обладающий поистине огромными возможностями (см. статью http://www.rsdn.ru/article/dotnet/datagridview20.xml). Но, как говорит Жванецкий, есть нюанс. Дело в том, что при отображении большого числа строк, пользоваться этим контролом несколько неудобно: строки сливаются, глаз то и дело перескакивает на соседнюю строчку. Во многих платных компонентах есть чересстрочная подсветка, суть которой — использование разных цветов фона для соседних строк.

Реализовать такое поведение DataGridView можно двумя способами.

(далее…)

Нюансы докинга

При проектировании пользовательского интерфейса довольно удобно пользоваться свойством Dock, которое определяет способ изменения размеров элемента управления с его родительским элементом управления. Данное свойство определено в классе Control и может принимать одно из значений перечисления DockStyle:

  • None — закрепление отсутствует;
  • Top — элемент управления закрепляется в верхней части содержащего его элемента управления.
  • Bottom — элемент управления закрепляется в нижней части содержащего его элемента управления.
  • Left — элемент управления закрепляется в левой части содержащего его элемента управления.
  • Right — элемент управления закрепляется в правой части содержащего его элемента управления.
  • Fill — элемент управления заполнят собой всю область содержащего его элемента управления.

(далее…)