Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 891 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 18:

Нестандартные формы и стандартные диалоги

Базовый класс FileDialog

Классы System.Windows.Forms.OpenFileDialog и System.Windows.Forms.SaveFileDialog являются законченными ( sealed ) классами, поэтому не могут иметь потомков. Зато общим предком для этих двух классов является абстрактный класс System.Windows.Forms.FileDialog, который передает им много полезных общих свойств настройки.

Некоторые публичные свойства базового класса FileDialog
Свойство Тип Пояснения
AddExtension bool Получает или устанавливает флаг, указывающий, должно ли диалоговое окно автоматически добавляь расширение к имени файла, если пользователь опускает расширение при ручном вводе имени файла. Значение по умолчанию true - должно
CheckFileExists bool Получает или устанавливает флаг, указывающий, отображает ли диалоговое окно предупреждение перед закрытием, если пользователь вручную вводит имя файла, которое не существует. Значение по умолчанию false - не отображает
CheckPathExists bool Получает или устанавливает флаг, указывающий, отображает ли диалоговое окно предупреждение перед закрытием, если пользователь вручную вводит путь, который не существует. Значение по умолчанию true - отображает
DefaultExt string Получает или устанавливает заданное по умолчанию расширение имени файла. По умолчанию - пустая строка
DereferenceLinks bool Получает или устанавливает флаг, указывающий, возвращает ли диалоговое окно в свойстве FileName местоположение файла, который адресуется ярлыком, или возвращает местоположение самого ярлыка (.lnk). Значение по умолчанию true - местоположение адресуемого ярлыком файла
FileName string Получает или устанавливает строку, содержащую имя файла, выбранное в диалоговом окне. До выбора по умолчанию - пустая строка
FileNames string[ ] Получает имена всех файлов, выбранных в диалоговом окне OpenFileDialog, если его свойство Multiselect равно true
Filter string Получает или устанавливает строку фильтров, содержащую варианты расширений файлов, доступных для выбора в диалоговом окне
FilterIndex int Получает или устанавливает индекс текущего фильтра, установленного в диалоговом окне. По умолчанию 1 - действует первый фильтр
InitialDirectory string Получает или устанавливает начальный каталог, отображенный диалоговым окном. По умолчанию - пустая строка
RestoreDirectory bool Получает или устанавливает флаг, указывающий, восстанавливает ли диалоговое окно текущий каталог перед закрытием к его первоначальному значению, если пользователь сменил каталог при поиске файлов. По умолчанию false - не восстанавливать первоначальный каталог, а запоминать новый каталог в системном реестре
ShowHelp bool Получает или устанавливает флаг, указывающий, отображена ли кнопка Help в диалоговом окне. По умолчанию false - не включать кнопку Help в состав диалогового окна
SupportMultiDottedExtensions bool Получает или устанавливает флаг, указывающий, поддерживает ли диалоговое окно многоточечные (составные) расширения
Title string Получает или устанавливает заголовок диалогового окна
ValidateNames bool Получает или устанавливает флаг, указывающий, принимает ли диалоговое окно только правильные (допустимые) имена файлов Win32. Значение по умолчанию true - принимает только правильные имена файлов Win32

Следует помнить, что при перемещении по каталогам через OpenFileDialog или SaveFileDialog, если не была выбрана кнопка отмены, меняется текущий каталог приложения (по умолчанию RestoreDirectory=false ). Установить начальный каталог диалогового окна или восстановить текущий каталог приложения после закрытия диалогового окна позволяют свойства InitialDirectory и RestoreDirectory.

Хотя большинство пользователей перемещается по каталогам и выбирает файлы из предложенного, кто-то может ввести имя файла или каталога вручную. В этом случае, если подняты флаги CheckFileExists и CheckPathExists, перед закрытием диалоговое окно само проверяет допустимость пути или имени файла и выдает соответствующее сообщение.

Фильтры в свойстве Filter следуют парами друг за другом " Название фильтра|шаблон_фильтра ". Разделитель "Вертикальная черта" используется как внутри пары, отделяя видимое название фильтра от шаблона, так и между парами. Строка фильтра должна быть непрерывной. В шаблонах_фильтра не должно быть пробелов ни внутри, ни в окружении, иначе фильтр не сработает. Особенно нужно проверять, чтобы в последнем шаблоне строки фильтра не остался невидимый пробел.

Разработка вкладки OpenFileDialog

Кроме свойств, унаследованных от класса FileDialog, класс OpenFileDialog расширяется своими индивидуальными свойствами. Вот они

Публичные свойства класса OpenFileDialog
Свойство Тип Пояснения
CheckFileExists bool Получает или устанавливает флаг, указывающий, отображает ли диалоговое окно предупреждение перед закрытием, если пользователь вручную вводит имя файла, которое не существует. Переопределяет одноименное виртуальное свойство базового класса FileDialog. Значение по умолчанию true - проверяет и отображает
Multiselect bool Получает или устанавливает флаг, разрешающий пользователю множественный выбор файлов с помощью клавиш Ctrl или Shift. Значение по умолчанию false - одиночный выбор
ShowReadOnly bool Определяет, показывать ли в диалоговом окне флажок "Только чтение", или показан ли он. Значение по умолчанию false - не показывать
ReadOnlyChecked bool Определяет, установил ли пользователь показанный флажок "Только чтение"

Если нужно разрешить пользователю создать новый файл при помощи 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, которые оболочка разместит в подвале формы как невизуальные
  • Задайте свойства новых элементов так
Свойства элементов вкладки OpenFileDialog
Элемент Свойство Значение
TextBox Name txtSimpleEdit
  Text Пусто
  Multiline True
  Dock Fill
  ScrollBars Both
  WordWrap False
  MaxLength 60000
Button Name btnOpenFile
  AutoSize true
  Text Open
Button Name btnSaveFile
  AutoSize true
  Text Save
OpenFileDialog Name openFileDialog
  Filter Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*
  Title Открыть текстовый файл
SaveFileDialog Name 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, которое соответствует выбранной пользователем кнопке в этом диалоговом окне. В зависимости от этого наш код может принимать то или иное решение о дальнейших действиях.