Нестандартные формы и стандартные диалоги
Базовый класс FileDialog
Классы System.Windows.Forms.OpenFileDialog и System.Windows.Forms.SaveFileDialog являются законченными ( sealed ) классами, поэтому не могут иметь потомков. Зато общим предком для этих двух классов является абстрактный класс System.Windows.Forms.FileDialog, который передает им много полезных общих свойств настройки.
Следует помнить, что при перемещении по каталогам через OpenFileDialog или SaveFileDialog, если не была выбрана кнопка отмены, меняется текущий каталог приложения (по умолчанию RestoreDirectory=false ). Установить начальный каталог диалогового окна или восстановить текущий каталог приложения после закрытия диалогового окна позволяют свойства InitialDirectory и RestoreDirectory.
Хотя большинство пользователей перемещается по каталогам и выбирает файлы из предложенного, кто-то может ввести имя файла или каталога вручную. В этом случае, если подняты флаги CheckFileExists и CheckPathExists, перед закрытием диалоговое окно само проверяет допустимость пути или имени файла и выдает соответствующее сообщение.
Фильтры в свойстве Filter следуют парами друг за другом " Название фильтра|шаблон_фильтра ". Разделитель "Вертикальная черта" используется как внутри пары, отделяя видимое название фильтра от шаблона, так и между парами. Строка фильтра должна быть непрерывной. В шаблонах_фильтра не должно быть пробелов ни внутри, ни в окружении, иначе фильтр не сработает. Особенно нужно проверять, чтобы в последнем шаблоне строки фильтра не остался невидимый пробел.
Разработка вкладки OpenFileDialog
Кроме свойств, унаследованных от класса FileDialog, класс OpenFileDialog расширяется своими индивидуальными свойствами. Вот они
Если нужно разрешить пользователю создать новый файл при помощи OpenFileDialog, следует установить CheckFileExists в значение false.
Кратко ознакомившись со свойствами диалогового окна OpenFileDialog, далее продемонстрируем некоторые возможности по использованию стандартного диалога открытия файла в одноименной вкладке нашего проекта. Здесь мы применим стандартный диалог при разработке простейшего текстового редактора. Демонстрацию настроек, унаследованных от класса FileDialog, реализуем чуть позже, во вкладке SaveFileDialog, поскольку оба диалога работы с файлами имеют общего родителя.
- Поместите на вкладку OpenFileDialog приложения контейнер Panel и две кнопки Button вне контейнера Panel
Кнопки помещайте так: удерживая клавишу Ctrl, щелкните на компоненте Button вкладки Common Controls панели Toolbox. Не отпускайте клавишу Ctrl и щелкните два раза на вкладке редактируемой формы вне элемента Panel и справа от него. Щелкните на компоненте Pointer вкладки Common Controls, чтобы освободить курсор.
- Установите для компонента Panel свойство Dock в значение Left
- Поместите внутрь контейнера Panel компонент TextBox
- Добавьте к форме компоненты OpenFileDialog и SaveFileDialog, которые оболочка разместит в подвале формы как невизуальные
- Задайте свойства новых элементов так
- Создайте обработчики для кнопок btnOpenFile и btnSaveFile, которые заполните так
#region Вкладка OpenFileDialog String fileName = ""; // Имя текстового файла StreamReader readFile; // Дескриптор файла private void btnOpenFile_Click(object sender, EventArgs e) { openFileDialog.FileName = String.Empty; // Очищаем текстовое поле DialogResult result = openFileDialog.ShowDialog(); if (result == DialogResult.OK) { try // Попытка { fileName = openFileDialog.FileName;// Сохранить имя файла readFile = new StreamReader(fileName);// Открыть поток txtSimpleEdit.Text = readFile.ReadToEnd();// Читать до конца } catch // Перехват всех исключений { MessageBox.Show("Не могу открыть файл\n", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Stop); } finally // Выполняется в любом случае { readFile.Close(); } } } StreamWriter writeFile; // Дескриптор файла private void btnSaveFile_Click(object sender, EventArgs e) { // Динамические настройки saveFileDialog.Title = "Сохранить текстовый файл"; saveFileDialog.Filter = "Текстовые файлы (*.txt)|*.txt"; // Если не открывали и не сохраняли, то открыть диалог if (fileName.Length <= 0) { DialogResult result = saveFileDialog.ShowDialog(); if (result == DialogResult.OK) { fileName = saveFileDialog.FileName;// Сохранить имя файла } else return; } try { writeFile = new StreamWriter(fileName);// Открыть поток writeFile.Write(txtSimpleEdit.Text);// Сохранить все } catch { MessageBox.Show("Не могу сохранить текст\n", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Stop); } finally { writeFile.Close(); } } #endregionЛистинг 18.22. Код для вкладки OpenFileDialog
Здесь мы снова применили блоки для отлавливания исключений, причем любых.
- В начале файла StandardDialogs.cs пропишите инструкцию
using System.IO;
чтобы подключить пространство имен с классами ввода-вывода
Обратите внимание, что мы заключили код для вкладки OpenFileDialog в секционные скобки #region... #endregion для удобства редактирования
- Постройте приложение и испытайте работу вкладки OpenFileDialog. Внешне она должна выглядеть примерно так
Обратите внимание, что после закрытия приложения и повторном его запуске стандартное диалоговое окно OpenFileDialog открывается в каталоге последнего загруженного файла. Это происходит потому, что путь к выбранному в конечном итоге каталогу OpenFileDialog каждый раз автоматически сохраняет в системном реестре.
Метод ShowDialog() возвращает одно из значений перечисления System.Windows.Forms.DialogResult, которое соответствует выбранной пользователем кнопке в этом диалоговом окне. В зависимости от этого наш код может принимать то или иное решение о дальнейших действиях.