Перейдя с MFC на .Net я довольно быстро обнаружил отсутствие в FCL класса, подобного MFC’шному классу CDocument, однако осталась старая привязанность к модели Document-View, в связи с этим на свет появился класс Document, призванный упростить работу с моделью Document-View в .Net WinForms.
Класс Document предоставляет базовую функциональность для пользовательских классов документа в модели Document-View. Вы можете его использовать для создания SDI и MDI приложений. Он реализует стандартные операции создания нового документа, открытия существующего, сохранения. При создании документа, открытии, изменении, сохранении возникают соответствующие события. Корректно обрабатываются такие ситуации как попытка открыть или создать новый документ при несохранённом текущем документе. Сериализация/десериализация данных документа выполняется в методах Serialize и Deserialize. Для очистки данных документа предназначен метод DeleteContents.
Работа с классом Document подобна работе с MFC’шным классом CDocument (минимальные действия для SDI-приложения):
public class MyDocument : Document { … } |
MyDocument _Document = null; … void MainForm() { _Document = new MyDocument(); _Document.DocumentChanged += new EventHandler(SetFormTitle); _Document.DocumentCreated += new EventHandler(SetFormTitle); _Document.DocumentLoaded += new EventHandler(SetFormTitle); _Document.DocumentSaved += new EventHandler(SetFormTitle); … } |
СОВЕТ В обработчиках событий удобно изменять заголовок формы, чтобы отображать состояние документа. |
// Occurs whenever the user loads the form. private void MainForm_Load(object sender, System.EventArgs e) { _Document.New(); } |
// Handles the File\New command. private void miFileNew_Click(object sender, System.EventArgs e) { _Document.New(); } // Handles the File\Open command.privatevoid miFileOpen_Click(object sender, System.EventArgs e) { _Document.Open(); } // Handles the File\Save command.privatevoid miFileSave_Click(object sender, System.EventArgs e) { _Document.Save(); } // Handles the File\Save As command.privatevoid miFileSaveAs_Click(object sender, System.EventArgs e) { _Document.SaveAs(); } // Handles the File\Exit command.privatevoid miFileExit_Click(object sender, System.EventArgs e) { if (_Document.CanCloseDocument()) Application.Exit(); } |
// Occurs whenever the user closes the form, beform the form has // been closed. private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = !_Document.CanCloseDocument(); } |
public Document() | Инициализирует новый экземпляр класса Document с параметрами по умолчанию. |
public Document(string strFilter, string strDefaultExt, string strDefaultDocName) | Инициализирует новый экземпляр класса Document. strFilter – фильтр (см. св-во Filter). strDefaultExt – расширение файлов документа (см. св-во DefaultExt). strDefaultDocName – имя нового документа (см. св-во DefaultDocName). |
public Document(string strFilter, string strDefaultExt, string strDefaultDocName, string strMessageCaption, string strSaveChangesPromptTemplate) | Инициализирует новый экземпляр класса Document. strFilter – фильтр (см. св-во Filter). strDefaultExt – расширение файлов документа (см. св-во DefaultExt). strDefaultDocName – имя нового документа (см. св-во DefaultDocName). strMessageCaption – строка, которая будет использоваться в качестве заголовоков MessageBox’ов (см. св-во MessageCaption). strSaveChangesPromptTemplate – строка, которая будет использоваться в качестве шаблона при формировании строки запроса на сохранение измененного файла (см. св-во SaveChangesPromptTemplate). |
protected virtual void DeleteContents() | Выполняет очистку документа без уничтожения самого документа. Этот метод вызывается перед уничтожением документа. Также он вызывается при повторном использовании объекта документа в SDI приложениях. |
public virtual bool New() | Выполняет создание нового документа. Обычно этот метод вызывают из обработчика команды File->New. Возвращает true, если документ был успешно создан. После успешного создания возникает событие DocumentCreated. |
public virtual bool Open() | Открывает существующий документ. Имя файла задает пользователь посредством диалога FileOpenDialog. Возвращает true, если документ был успешно открыт. После успешного создания возникает событие DocumentLoaded. |
public virtual bool Open(string strPathToFile) | Открывает существующий документ, путь к которому задан параметром strPathToFile. Возвращает true, если документ был успешно открыт. После успешного создания возникает событие DocumentLoaded. |
public virtual bool Save() | Сохраняет документ в файл. Если имя файла не задано (был создан новый документ и еще не сохранялся), его задает пользователь посредством диалога FileOpenDialog. Возвращает true, если документ был успешно сохранен. После успешного сохранения возникает событие DocumentSaved. |
public virtual bool SaveAs() | Сохраняет текущий документ в новый файл. Имя файла задает пользователь посредством диалога FileOpenDialog. Возвращает true, если документ был успешно сохранен. После успешного сохранения возникает событие DocumentSaved. |
public virtual void SaveAs(string strPathToFile) | Сохраняет текущий документ в новый файл, заданный параметром strPathToFile. Возвращает true, если документ был успешно сохранен. После успешного сохранения возникает событие DocumentSaved. |
protected abstract void Serialize(string strPathToFile) | Вызывается из методов Save* для сериализации данных документа. |
protected abstract void Deserialize(string strPathToFile) | Вызывается из методов Open* для десериализации данных документа. |
protected virtual bool PromptFileName(bool bOpenFileDialog, out string strPathToFile) | Запрашивает у пользователя имя файла для сохранения или открытия (посредством диалогов SaveFileDialog или OpenFileDialog). |
public virtual bool CanCloseDocument() | Возвращает true, в том случае, если можно закрыть документ без потери его содержимого. Если документ изменен (см. св-во Modified), то спрашивает у пользователя надо ли сохранять изменения в файле – при положительном ответе сохраняет. |
DefaultExt | Возвращает расширение по умолчанию для файлов документа, которое будет использоваться в диалогах OpenFileDialog и SaveFileDialog. |
DefaultDocName | Возвращает строку, которая будет использоваться в качестве имени нового документа. По умолчанию используется следующее имя: "Untitled". |
FileName | Возвращает имя файла (включая расширение). Если имя не задано (например, если был создан новый документ и он еще не сохранялся), то возвращается имя файла документа по умолчанию (см. св-во DefaultDocName). |
FilePath | Возвращает путь к файлу документа. |
Filter | Возвращает файловый фильтр, который будет использоваться в диалогах OpenFileDialog и SaveFileDialog. По умолчанию используется следующий фильтр: "All files (*.*)|*.*". |
MessageCaption | Возвращает строку, которая будет использоваться в качестве заголовка MessageBox’ов. |
Modified | Задает/возвращает признак наличия изменений в документе. |
SaveChangesPromptTemplate | Возвращает строку, которая будет использоваться в качестве шаблона при формировании строки запроса на сохранение измененного файла. В строке запроса может быть использован заполнитель {0}, который будет заменен на имя файла. По умолчанию используется следующий шаблон: "Do you want to save the changes you made in {0}?". |
DocumentChanged | Возникает при изменениях документа. |
DocumentCreated | Возникает после успешного создания нового документа. |
DocumentLoaded | Возникает после успешной загрузки документа. |
DocumentSaved | Возникает после успешного сохранения документа. |