Объединение рабочей формы и классов документов.
Так как в работе нашей программы мы используем для каждого документа одну единую форму, ей необходимо сказать с каким классом документа она работает, это возможно сделать при помощи созданного нами интерфейса IDocuments. Для того чтобы подключить интерфейс к форме WorkForm необходимо перейти в файл реализации рабочей формы WorkForm.cs (выделим в Solutin Explorer рабочую форму, щелкнем правой кнопкой мышки и выберем пункт ViewCode). Далее перегрузим, конструктор нашей рабочей формы и создадим объект интерфейса IDocuments.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace ASU_Sklad { public partial class WorkForm : Form { // Обявление объекта интерфейса public IDocuments _IDocuments; public WorkForm() { InitializeComponent(); } // Перегрузка конструктора public WorkForm(IDocuments __IDocuments) { _IDocuments = __IDocuments; InitializeComponent(); } } } |
Создание объекта документа.
Для создания объекта класса документ объявим его в описании класса MainForm, для этого в файле реализации MainForm пропишем следующую информацию.
… using System.Windows.Forms; namespace ASU_Sklad { public partial class MainForm : Form { TSpr1 _TSpr1; public MainForm() { InitializeComponent(); _TSpr1 = new TSpr1(); } … |
Вызов объекта документ.
Теперь сделаем таким образом, чтобы при выборе элемента в дереве у нас создавалась рабочая форма, работающая с передаваемым ей классом, для этого изменим в файле MainForm.cs следующий код.
private bool CreateWorkForm(string sNameForm, string sClassName) { WorkForm newf; //object a = switch (sClassName) { case "Spr1": newf = new WorkForm((IDocuments)_TSpr1); break; default: newf = new WorkForm(); break; } newf.Text = sNameForm; newf.MdiParent = this; newf.Show(); return true; } private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { for (int i = this.MdiChildren.Length - 1; i >= 0; i--) { if (MdiChildren[i].Text == e.Node.Text) { MdiChildren[i].Activate(); return; } } string []sClassName = e.Node.Name.Split('_'); bool bFormOpen = (e.Node.Parent != null) ? CreateWorkForm(e.Node.Text,sClassName[1]) : false; } |
Создание свойств документа.
Каждый документ уникален, но с ним можно выполнять определенные действия, такие как: отображение информации, добавление информации, изменение информации, удаление информации, обновление информации. Каждые из этих действий в свою очередь тоже уникальны, но мы можем заложить в программу возможность этих действий и в определенный момент вызвать соответствующие операции. Как раз для этого мы и создали специальные классы для документов и интерфейс, через который вызывается соответствующий класс. Теперь применим это на практике. Сделаем так чтобы при открытии документа (в нашем примере справочник Spr1) кнопки на панели ToolStrip и соответствующие пункты меню становились доступными или нет, для этого проделаем следующие действия.
- Создание свойств документа.
Создадим специальные переменные в классе Spr1, которые будут определять возможность пользоваться функциями добавления, изменения и удаления, для этого файл Spr1.cs изменим следующим образом.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ASU_Sklad { class TSpr1 : IDocuments { // Переменные определяющие возможность // добавления изменения и удаления bool _bAdd, _bChange, _bDell; // Свойство только для чтения возвращающее заначение // соответсвующей переменной public bool bAdd { get { return _bAdd;} } public bool bChange { get { return _bChange; } } public bool bDell { get { return _bDell; } } // Конструктор класс где задаются значения переменных public TSpr1() { _bAdd = true; _bChange = true; _bDell = true; } } } |
- Описание интерфейса.
Для того чтобы созданными свойствами можно было пользоваться и они были одинаковы для всех документов необходимо их описать в интерфейсе IDocuments, для этого в файле IDocuments.cs изменим код следующим образом.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ASU_Sklad { public interface IDocuments { // Свойства документа bool bAdd {get ; } bool bChange{ get ; } bool bDell{ get;} } } |
- Доступность объектов из главной формы в дочерних формах.
Теперь необходимо сделать так чтобы при создании формы для документа изменялись свойства кнопок на ToolStrip и MenuStrip. Это можно сделать путем создания события для рабочей формы WorkForm, это событие должно обрабатываться в момент активации формы на экране, но перед этим необходимо сделать доступность изменяемых объектов главной формы в дочерних формах. Нас будут интересовать следующие объекты, представленные в таблице и измененные их свойства.
Имя объекта (Name) | Свойство Modifiers | Свойство Enabled |
ToolBT_Add | Public | False |
ToolBT_Dell | Public | False |
ToolBT_Change | Public | False |
ToolBT_Refresh | Public | False |
Add_SubItem | Public | False |
Dell_SubItem | Public | False |
Change_SubItem | Public | False |
Refresh_SubItem | Public | False |
После изменения свойств объектов необходимо сделать так чтобы объект MainForm был доступен во всех дочерних формах, для этого необходимо изменить код в файле Programs.cs следующим образом.
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace ASU_Sklad { static class Program { // Описане объекта public static MainForm _MainForm; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); // Заказ памяти для объекта. _MainForm = new MainForm(); Application.Run(_MainForm); } } } |
- Создание события активации формы WorkForm.
Перейдем в дизайнер формы WorkForms, в окне свойств создадим событие Activated. Перейдем в редактор кода данного события, укажем, чтобы при наступлении данного события кнопки и пункты меню главной формы соответствовали значениям свойств документа, а также обработаем возможные исключения, возникающие при присваивания этих свойств. В случае возникновения исключений соответствующие пункты меню и кнопки сделаем недоступными. Для этого пропишем следующий код.
private void WorkForm_Activated(object sender, EventArgs e) { try { Program._MainForm.ToolBT_Add.Enabled = _IDocuments.bAdd; Program._MainForm.Add_SubItem.Enabled = _IDocuments.bAdd; Program._MainForm.ToolBT_Change.Enabled = _IDocuments.bChange; Program._MainForm.Change_SubItem.Enabled = _IDocuments.bChange; Program._MainForm.ToolBT_Dell.Enabled = _IDocuments.bDell; Program._MainForm.Dell_SubItem.Enabled = _IDocuments.bDell; Program._MainForm.ToolBT_Refresh.Enabled = true; Program._MainForm.Refresh_SubItem.Enabled = true; } catch(Exception ex) { Program._MainForm.ToolBT_Add.Enabled = false; Program._MainForm.Add_SubItem.Enabled = false; Program._MainForm.ToolBT_Change.Enabled = false; Program._MainForm.Change_SubItem.Enabled = false; Program._MainForm.ToolBT_Dell.Enabled = false; Program._MainForm.Dell_SubItem.Enabled = false; Program._MainForm.ToolBT_Refresh.Enabled = false; Program._MainForm.Refresh_SubItem.Enabled = false; } } |
- После запуска программы мы должны увидеть следующее. Рис. 4, 5
Рис. 4.
Рис 5.
Самостоятельно:
8. По аналогии со справочником №1 создать класс для справочника №2 и подключить их к событиям в дереве.
9. Создать классы для входных документов и подключить их к событиям в дереве.
10. Создать класс для выходного документа и подключить его к событию в дереве.
Лабораторная работа №4