Стандартные диалоги

В .NET существует несколько стандартных классов, которые позволяют организовать диалог программы с пользователем. Это

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

Общая схема применения стандартных диалогов

Порядок работы с любым стандартным диалогом может быть следующим:

  1. выбираем на панели компонентов Tools необходимый элемент и размещаем его на форме;

  2. определяемся с тем, как мы будем вызывать этот диалог. Обычно это делается по щелчку мыши по кнопке (на форме должен быть объект типа Button) или выбор определяем в каком-то пункте меню (устанавливаем на форму объект типа MenuStrip);

  3. затем создаём обработчик событий для кнопки или пункта меню (в зависимости от того, что выбрано в пункте 2). Практически всегда обработчик событий будет иметь такой вид:

void Имя_Click(object sender, EventArgs e)

{

   .......................................

   if(Диалог.ShowDialog()== DialogResult.OK)

   {

      // Выполнение каких-либо действий.

      // Обычно — это применение выбранных в окне диалога параметров

   }

}

Здесь

Как работает такой обработчик (Имя_Click())? Всё очень просто. В операторе if вызывается метод ShowDialog() — показать (открыть) диалог. В открытом окне диалога пользователь выбирает, задаёт тем или иным способом необходимые параметры. Затем он нажимает на кнопку для подтверждения выбора (для разных диалогов она может иметь разное название, например «Открыть» для диалога по выбору имени открываемого файла) или кнопку «Отмена» для отмены действий. Если пользователь подтвердил свой выбор, то метод ShowDialog() возвращает результат DialogResult.OK. При отмене действий метод вернёт DialogResult.Cancel.

Понятно, что по ветви «Да» оператора

if(Диалог.ShowDialog()== DialogResult.OK)

   {...}

и надо записать все необходимые действия по использованию того, что выбрал пользователь в окне диалога.

Теперь на примерах рассмотрим работу конкретных диалогов.

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

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

На форме вначале разместим два компонента: MenuStrip (имя по-умолчанию menuStrip1) — для организации меню и TextBox (имя по-умолчанию textBox1) — для работы с текстом. В окне свойств (Properties) для textBox1 присвоим значение true для свойства Multiline, т. е. мы хотим иметь многострочный редактор. Можно ещё и свойству Dock присвоить значение Fill (заполнять всю свободную область формы).

Классы OpenFileDialog и SaveFileDialog

Разместим на форме два стандартных компонента: OpenFileDialog и SaveFileDialog. По-умолчанию объекты этих классов получат имена openFileDialog1 и saveFileDialog1 соответственно.

В меню создадим пункт Файл, а в нём Открыть, Сохранить как и Выход. Напишем для них обработчики событий:

Возможный текст основной части программы (файл MainForm.cs):

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Windows.Forms;

using System.IO;

namespace Prim_Dialog1

{

   public partial class MainForm : Form

   {

      string name_file;

      public MainForm()

      {

         InitializeComponent();

      }


      // Выбрать и открыть текстовый файл,

      // вывести его содержимое в текстовое поле

      void OpenToolStripMenuItemClick(object sender, EventArgs e)

      {

         openFileDialog1.Filter = "text files (*.txt)|*.txt";

         if(openFileDialog1.ShowDialog()== DialogResult.OK)

         {

            name_file=openFileDialog1.FileName;

            string s = null;

            string t = "";

            StreamReader r = File.OpenText(name_file);

            while((s = r.ReadLine()) != null)

               t += s + "\r\n";

            textBox1.Text = t;

            r.Close();

         }

      }


      // Текст из элемента textBox1 сохранить в файле,

      // имя которого задаётся в окне диалога

      void SaveToolStripMenuItemClick(object sender, EventArgs e)

      {

         saveFileDialog1.Filter = "text files (*.txt)|*.txt";

         if(saveFileDialog1.ShowDialog()== DialogResult.OK)

         {

            name_file=saveFileDialog1.FileName;

            StreamWriter w = File.CreateText(name_file);

            w.WriteLine(textBox1.Text);

            w.Close();

         }

      }


      // Выход из программы

      void ExitToolStripMenuItemClick(object sender, EventArgs e)

      {

         Close();

      }

   }

}

Пояснения к данному тексту.

Имя файла name_file сделано полем класса MainForm на всякий случай: возможно, в более сложном варианте программы понадобится сохранять имя открываемого файла между вызовами обработчиков событий. Здесь это пока не требуется.

При выборе меню Открыть выполняется обработчик событий OpenToolStripMenuItemClick. В начале текста этого метода мы определяем, с какими типами файлов будем работать. Сделать это можно с помощью своеобразного фильтра — свойства Filter для объекта saveFileDialog1:

saveFileDialog1.Filter = "text files (*.txt)|*.txt";

Свойство Filter представляет собой строку символов, которая состоит из двух частей, разделённых символом | (вертикальная черта). В первой части даётся пояснение о том, какие файлы требуются для отбора (у нас это файлы txt ("text files (*.txt)"), а во второй части записывается сам шаблон для отбора, который уже будет обрабатываться в программе (здесь это "*.txt", т. е. любые файлы с расширением txt).

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

Сделать такой шаблон несложно, вот пример:

openFileDialog1.SupportMultiDottedExtensions = true;

openFileDialog1.Filter = "Все файлы (*.*)|*.*|text files (*.txt)|*.txt|CSarp files (*.cs)|*.cs";

Здесь свойство SupportMultiDottedExtensions означает возможность поддержки нескольких шаблонов выбора. Если оно истинно, то поддержка есть, если ложно — то нет. По умолчанию это свойство имеет значение false (Надо заметить, что хотя это свойство и имеется, и может изменять своё значение, но и без него создаётся фильтр с несколькими шаблонами. Почему? Пока непонятно. Надо разбираться. Возможно, это глюк от MS. Возможно, это свойство устаревшее. Или его работа зависит от версии Framework).

Новый вид строки фильтра в нашем примере позволяет иметь три варианта шаблонов. Для каждого варианта задаётся пояснение и шаблон, разделённые символом | (вертикальная черта), а сами варианты также разделяются этим символом.

Если фильтр не задавать вообще, то в окне диалога будут показаны все файлы.

После того, как определились с типами открываемых файлов, записываем оператор

if(openFileDialog1.ShowDialog()== DialogResult.OK)

{.............}

Здесь в условии оператора if делается проверка факта: выбрал пользователь файл, подходящий под наш фильтр, или нет. Если «Да», т. е. он выбрал файл и нажал на кнопку «Открыть» в окне диалога, то выполняются действия, записанные в блоке ветви «Да» оператора if. Главное — это получить имя выбранного файла:

name_file=openFileDialog1.FileName;

Теперь необходимо организовать чтение из выбранного файла. Создаём объект r типа StreamReader, предназначенный для чтения из файла текстовых строк:

StreamReader r = File.OpenText(name_file);

а далее в цикле читаем текст построчно из выбранного файла. Делается это в цикле тем же методом ReadLine(), что ранее мы использовали для ввода данных с консоли. Прочитанные строки добавляем в конец временной переменной — строки t:

while((s = r.ReadLine()) != null)

   t += s + "\r\n";

«Добавка» "\r\n" нужна для того, чтобы обеспечить в последующем переход на новую строку в текстовом поле.

После завершения чтения из файла полученную информацию выводим в текстовом поле и закрываем файл:

textBox1.Text = t;

r.Close();

При выборе меню Сохранить как выполняется обработчик событий SaveToolStripMenuItemClick. В этом методе всё делается аналогично тому, что мы только-что рассмотрели при открытии файла. Различие заключается только в том, что файл, имя которого было задано в окне диалога, открывается для записи текста, а затем собственно записываем информацию в файл:

StreamWriter w = File.CreateText(name_file);

w.WriteLine(textBox1.Text);

Класс FontDialog

Данный класс предназначен для изменения шрифта текста. Использовать класс предельно просто:

  1. размещаем на форме компонент FontDialog. По-умолчанию он получит имя fontDialog1;

  2. в меню добавим ещё один пункт (Font);

  3. напишем для него обработчик событий.

Вот текст обработчика событий:

// Изменение шрифта текста в диалоговом окне класса FontDialog

void FontToolStripMenuItemClick(object sender, EventArgs e)

{

   if(fontDialog1.ShowDialog()== DialogResult.OK)

   {

      textBox1.Font = fontDialog1.Font;

   }

}

Схема обработчика — стандартная. Если пользователь внёс какие-то изменения для шрифта и нажал кнопку «OK» для их подтверждения, то изменённый шрифт тут же можно использовать:

textBox1.Font = fontDialog1.Font;

После завершения работы данного обработчика шрифт текста в текстовом поле textBox1 изменится на заданный в окне диалога.

Класс ColorDialog

Этот класс предназначен для изменения цвета. Применение также предельно простое:

  1. размещаем на форме компонент ColorDialog. По-умолчанию он получит имя colorDialog1;

  2. в меню добавим ещё один пункт (Color);

  3. напишем для него обработчик событий.

Вот текст обработчика событий:

// Изменение цвета шрифта текста в диалоговом окне класса ColorDialog

void ColorToolStripMenuItemClick(object sender, EventArgs e)

   {

      if(colorDialog1.ShowDialog()== DialogResult.OK)

      {

         textBox1.ForeColor = colorDialog1.Color;

      }

   }

Можно изменять цвет символов в текстовом поле, как это сделано в данном примере: свойство ForeColor — это цвет символов в текстовом поле textBox1. А можно было поменять цвет фона для textBox1:

textBox1.BackColor = colorDialog1.Color;



Назад
На верх
Вперёд
Hosted by uCoz