|
Программирование >> Web ориентированные приложения
/ <summary> / Summary description for FolderTreeCtrl. / </summary> public class FolderTree : System.Windows.Forms.TreeView string rootFolder = ; bool showFiles = true; bool inInit = false; public FolderTree() [Category( Behavior ), Description( Gets or sets the base or root folder of the tree ), DefaultValue( C:\\ )] public string RootFolder get {return rootFolder;} rootFolder = value; if(! inInit) InitializeTree(); [Category( Behavior ), Description( Indicates whether files will be seen in the list. ), DefaultValue(true)] public bool ShowFiles get {return showFiles;} set { showFiles = value;} [Browsable(false)] public string SelectedFolder if(this.SelectedNode is FolderNode) return ((FolderNode)this.SelectedNode).FolderPath; return ; Здесь добавлены три свойства: ShowFiles, SelectedFolder и RootFolder. Обратите внимание на атрибуты этих свойств. Мы установили Category, Description и DefaultValues для ShowFiles и RootFolder. Эти два свойства появятся в браузере свойств в режиме проектирования. SelectedFolder на самом деле не имеет смысла во время проектирования, поэтому для него установлен атрибут Browsable=false. SelectedFolder не появится в браузере свойств, однако, поскольку это общедоступное свойство, оно появится в IntelliSense и будет доступным в коде. Далее нужно инициализировать загрузку файловой системы. Инициализация элемента управления может оказаться непростой. Инициализация - как во время проектирования, так и во время выполнения - должна быть хорошо продуманной. Когда элемент управления устанавливается в конструкторе, он на самом деле запускается. Если, например, в конструкторе имеется обращение к базе данных, то это обращение выполнится, когда вы перетащите элемент управления в поле конструктора. В случае FolderTree это может повлечь за собой определенные последствия. Вот как будет выглядеть метод, который в действительности загружает файлы: private void LoadTree(FolderNode folder) string[] dirs = Directory.GetDirectories(folder.FolderPath); foreach(string dir in dirs) FolderNode tmpfolder = new FolderNode(dir); folder.Nodes.Add(tmpfolder); LoadTree(tmpfolder); if( showFiles) string[] files = Directory.GetFiles(folder.FolderPath); foreach(string file in files) FileNode fnode = new FileNode(file); folder.Nodes.Add(fnode); showFiles - булевская переменная-член класса, которая устанавливается через свойство ShowFiles. Если она равна true, файлы отображаются в дереве. Единственный вопрос - когда следует вызывать LoadFiles? Существует несколько вариантов. Этот метод может быть вызван при установке свойства RootFolder. В некоторых ситуациях это желательно, но только не во время проектирования. Вспомним, элементы управления в дизайнере живые , поэтому, когда будет устанавливаться свойство RootFolder, наш элемент управления попытается выполнить загрузку из файловой системы. Решить эту проблему можно, проверив свойство DesignMode. Оно возвращает true, если элемент управления находится в данный момент в дизайнере. Теперь можно записать код инициализации так: private void InitializeTree() if(!this.DesignMode) FolderNode rootNode = new FolderNode( rootFolder); LoadTree(rootNode); this.Nodes.Clear(); this.Nodes.Add(rootNode); Если элемент управления не пребывает в режиме проектирования, и rootFolder не равен пустой строке, начнется загрузка дерева. Первым делом создается и передается методу LoadTree корневой узел Root. Другой способ состоит в том, чтобы реализовать общедоступный метод Init. В методе Init можно осуществить вызов LoadTree. Проблема такого способа связана с тем, что разработчик, использующий элемент управления, должен вызвать метод Init. Но в некоторых случаях это может оказаться приемлемым решением. Для дополнительной гибкости может быть реализован интерфейс ISupportInitialize. Этот интерфейс имеет два метода - BeginInit и EndInit. Когда элемент управления реализует ISupportInitialize, методы BeginInit и EndInit вызываются автоматически в сгенерированном коде InitializeComponent. Это позволяет отложить процесс инициализации до того момента, когда будут установлены все свойства. ISupportInitialize позволит коду в родительской форме также отложить инициализацию. Если в коде будет устанавливаться свойство RootNode, то вызов BeginInit позволит сначала установить свойство RootNode, как и все прочие свойства, или выполнить необходимые действия прежде, чем наш элемент управления загрузит файловую систему. Когда вызывается EndInit, произойдет инициализация. Вот как могут выглядеть BeginInit и EndInit: #region ISupportInitialize Members public void ISupportInitialize.BeginInit() inInit = true; public void ISupportInitialize.EndInit() if( rootFolder != ) InitializeTree(); inInit = false; #endregion Все, что делается в методе BeginInit - это присваивание переменной inInit значения true. Этот флаг применяется для того, чтобы определить, что элемент управления находится в процессе инициализации, и используется в свойстве RootFolder. Если свойство RootFolder устанавливается вне класса InitializeComponent, это значит, что дерево нуждается в повторной инициализации. В свойстве RootFolder мы проверяем, чему равно ли inInit - true или false. Если true, то это значит, что нам не нужно проходить через процесс инициализации. Если же флаг inInit равен false, мы вызываем InitializeTree. Можно также иметь общедоступный метод Init и в нем выполнять ту же задачу. В методе EndInit мы проверим, находится ли наш элемент управления в режиме проектирования и что с rootFolder ассоциирован корректный путь. Только после этого вызывается InitializeTree. Чтобы придать нашему элементу управления профессиональный вид, необходимо добавить битовое изображение. Это будет пиктограмма, отображаемая в панели инструментов, когда элемент управления будет добавлен в проект. Битовое изображение должно быть размером 16x16 пикселей и иметь 16 цветов. Файл этого изображения можно создать в любом графическом редакторе, позволяющем выдержать такой размер и цветовую глубину. Это можно сделать даже в Visual Studio .NET. Для этого потребуется щелкнуть правой кнопкой мыши на проекте и выбрать в контекстном меню пункт Add New Item (Добавить новый элемент). Выберите в списке пункт Bitmap File (Файл битового изображения), чтобы открыть графический редактор. После создания файла битового изображения добавьте его в проект, убедившись, что он находится в том же пространстве имен и с тем же именем, как у нашего элемента управления. И, наконец, установите свойство BuildAction для этого ресурса в Embedded Resource: щелкните правой кнопкой мыши на файле изображения в проводнике решений (Solution Explorer) и выберите в контекстном меню пункт Properties (Свойства). Выберите Embedded Resource для свойства BuildAction. Чтобы протестировать разработанный элемент управления, создадим в том же решении проект TestHarness. Это должно быть простое приложение Windows Forms с единственной формой. В разделе ссылок добавим ссылку на проект FolderTreeCtl. В окне Toolbox добавим ссылку на FolderTreeCtl.DLL. После этого FolderTreeCtl должен появиться в панели инструментов с добавленным ранее изображением в виде
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |