Объединение рабочей формы и классов документов.

Так как в работе нашей программы мы используем для каждого документа одну единую форму, ей необходимо сказать с каким классом документа она работает, это возможно сделать при помощи созданного нами интерфейса 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 и соответствующие пункты меню становились доступными или нет, для этого проделаем следующие действия.



  1. Создание свойств документа.

Создадим специальные переменные в классе 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; }   } }
  1. Описание интерфейса.

Для того чтобы созданными свойствами можно было пользоваться и они были одинаковы для всех документов необходимо их описать в интерфейсе 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;} } }
  1. Доступность объектов из главной формы в дочерних формах.

Теперь необходимо сделать так чтобы при создании формы для документа изменялись свойства кнопок на 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); } } }
  1. Создание события активации формы 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; } }
  1. После запуска программы мы должны увидеть следующее. Рис. 4, 5

Объединение рабочей формы и классов документов. - student2.ru Рис. 4.

Объединение рабочей формы и классов документов. - student2.ru Рис 5.

Самостоятельно:

8. По аналогии со справочником №1 создать класс для справочника №2 и подключить их к событиям в дереве.

9. Создать классы для входных документов и подключить их к событиям в дереве.

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

Лабораторная работа №4

Наши рекомендации