Безопасное управление документами на C#

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

В этом примере вы можете создавать, редактировать, открывать и сохранять файлы в текстовых и форматированных форматах. Он предоставляет команды New, Open, Save, Save As и Exit. Основная цель этого примера — скоординировать все эти команды, чтобы документ всегда был безопасным.

Например, если вы открываете файл, вносите изменения, а затем пытаетесь открыть другой файл, программа говорит, что есть несохраненные изменения, спрашивает, хотите ли вы их сохранить. Если вы нажмете «Да», программа сохранит файл с его текущим именем файла или предложит вам имя файла, если оно не было сохранено ранее.

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

Программа использует два ключевых свойства, чтобы гарантировать, что изменения загруженного документа не будут потеряны и обновить строку заголовка программы: FileName и DocumentChanged . Следующий код показывает эти два свойства.

Эти свойства используют резервные переменные _FileName и _DocumentChanged для хранения своих значений. Геттер Каждое свойство просто возвращает значение переменной основы.

Каждый установщик свойства определяет, изменяется ли его значение и выходит, если это не так. Затем он сохраняет новое значение и вызывает описанный нижеметод SetFormCaption для обновления строки заголовка формы.

Обратите внимание, что элемент управления RichTextBox имеет свойство Modified,которое также отслеживает, был ли документ изменен так же, как и свойство DocumentChanged . Программа использует свое собственное свойство вместо свойства Модифицированного элемента управления, чтобы свойство могло вызвать SetFormCaption.

Следующий код показывает метод SetFormCaption.

Этот метод просто составляет заголовок формы, используя текущее имя файла документа (если оно есть) и добавление звездочки, если документ изменен.

Это поможет обновить заголовок формы. Обеспечение безопасности документа немного более активно, но все еще довольно просто. Ключ — это метод IsDocumentSafe, показанный в следующем коде.

Этот метод возвращает true, если безопасно отбрасывать текущий документ.

Сначала метод проверяет свойство DocumentChanged и, если нет несохраненных изменений, метод возвращает true . Это происходит, если не было никаких изменений, поскольку документ был загружен, сохранен или создан.

Если есть несохраненные изменения, метод предупреждает пользователя и спрашивает, должен ли он сохранить изменения.

Если пользователь нажимает «Да», программа вызывает SaveDocument, чтобы попытаться сохранить изменения. Это может привести к сбою (вы поймете, почему, когда вы смотрите на метод SaveDocument ), поэтому IsDocumentSafe возвращает true, только если после вызова SaveDocument нет несохраненных изменений .

Если пользователь нажимает «Нет», пользователь не хочет сохранять текущие изменения, поэтому IsDocumentSafe возвращает true, чтобы указать, что программа может отменить изменения.

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

Существует два способа, которыми пользователь может попытаться напрямую сохранить текущий документ: с помощью команд меню «Сохранить» или «Сохранить как». Следующий код показывает эти обработчики событий в меню.

Эти обработчики событий просто вызывают методы SaveDocument и SaveDocumentAsсоответственно.

Следующий код показывает метод SaveDocumentAs.

Этот метод отображает SaveFileDialog пользователю, чтобы пользователь мог выбрать файл для сохранения документа. Если пользователь выбирает файл и щелкает «Сохранить», код вызывает перегруженную версию SaveDocumentAs, которая принимает имя файла в качестве параметра, передавая этот метод имени файла, выбранному пользователем. Следующий код показывает перегруженную версию SaveDocumentAs.

Эта версия SaveDocumentAs является единственной частью кода, которая фактически сохраняет файл. Сначала он проверяет расширение имени файла. Если расширение является .txt, код использует метод WriteAllText класса File для сохранения текста текущего документа в указанный файл. Если расширение не является .txt, код использует метод SaveFile элемента управления RichTextBox для сохранения содержимого элемента управления в формате Rich Text.

Если код успешно сохраняет файл, он обновляет свойства FileName и DocumentChanged.

Другим методом, который сохраняет файлы, является следующий метод SaveDocument.

Этот метод проверяет свойство FileName. Если у программы нет имени файла для текущего документа (потому что он создал новый файл и еще не сохранил его), тогда программа вызывает SaveDocumentAs, чтобы пользователь мог выбрать файл для сохранения документа. Если у программы есть имя файла для документа, метод вызывает SaveDocumentAs, передавая ему текущее имя файла, чтобы программа сохраняла документ в этом файле.

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

Следующий код показывает, как программа создает новый файл, когда пользователь выбирает команду «Создать» меню «Файл».

Этот код проверяет IsDocumentSafe и возвращает, если небезопасно отменять текущие изменения. Если безопасно продолжать, метод очищает RichTextBox, устанавливает DocumentChanged в false и очищает имя файла.

Следующий код показывает, как программа открывает файл, когда пользователь выбирает команду «Открыть» меню «Файл».

Как и код, используемый для создания нового документа, этот код проверяет IsDocumentSafe, чтобы убедиться, что он безопасен. Если это безопасно, код отображает OpenFileDialog, чтобы пользователь мог выбрать файл. Если пользователь выбирает файл и нажимает OK, код вызывает метод OpenFile, передавая ему имя выбранного файла. Следующий код показывает метод OpenFile.

Метод OpenFile проверяет расширение имени файла и пытается открыть соответственно текстовый файл или файл Rich Text. Если код успешно открывает файл, он обновляет свойства DocumentChanged и FileName.

Следующий код показывает обработчики событий, которые выполняются, когда пользователь выбирает команды «Сохранить», «Сохранить как» и «Выйти» меню «Файл».

Команды Save и Save As вызывают методы SaveDocument и SaveDocumentAs. Команда меню «Выход» просто пытается закрыть форму. Когда форма пытается закрыть, выполняется следующий обработчик события FormClosing.

Обработчик события FormClosing просто вызывает IsDocumentSafe и, если небезопасно отбрасывать текущий документ, устанавливает e.Cancel в true, чтобы форма оставалась открытой.

Последние два фрагмента кода — обработчик события TextChanged элемента управления RichTextBox и обработчик события Load формы.

Обработчик события TextChanged устанавливает DocumentChanged в true. Обработчик события Load формы вызывает обработчик события mnuFileNew_Click для запуска нового документа так же, как если бы пользователь нажал кнопку «Создать» меню «Файл».

Вот и все! Простой, не так ли? Существует много частей, потому что существует много возможных последовательностей событий, но индивидуально каждая из частей является относительно простой.

Источник: http://csharphelper.com/blog/2017/07/safely-manage-documents-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 5,00 из 5)

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *