Ликероводочный завод
Анализ работы ликероводочного завода позволяет определить ключевые понятия, выяснить задачи, требующие решения в рамках проекта, проанализировать функциональные требования будущего продукта и нефункциональные (надёжность, эффективность, изучаемость, модифицируемость и т. п.). Рисунок 9 — Просмотр клиентов Удаление локомотивов, вагонов и сотрудников можно осуществить при помощи кнопки «Удалить… Читать ещё >
Ликероводочный завод (реферат, курсовая, диплом, контрольная)
Федеральное агентство по образованию (Рособразование)
Архангельский государственный технический университет
Вычислительных систем и телекоммуникаций
Калитин Арсентий Игоревич
КУРСОВАЯ РАБОТА
По дисциплине
Объектно-ориентированное программирование
На тему
Ликеро-водочный завод
ЦЕЛЬ И ЗАДАЧИ ВЫПОЛНЕНИЯ РАБОТЫ
1 ВНЕШНЕЕ ОПИСАНИЕ
1.1 Анализ предметной области
1.2 Функциональная спецификация
2 ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА АВТОМАТИЗИРОВАННУЮ СИСТЕМУ
3 ПРОГРАММИРОВАНИЕ
3.1 Описание классов и интерфейсов
3.2 Диаграмма классов
4 КЛИЕНТСКОЕ ПРИЛОЖЕНИЕ
4.1 Структура
4.2 Проектирование графического интерфейса
5 ТЕСТИРОВАНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ, А Листинг клиентского приложения
ВВЕДЕНИЕ
В данной пояснительной записке рассматривается описание программы «Ликероводочный завод» на основе объектно-ориентированного подхода.
При объектно-ориентированном подходе программа представляет собой описание объектов, их свойств (или атрибутов), совокупностей (или классов), отношений между ними, способов их взаимодействия и операций над объектами (или методов).
Несомненным преимуществом данного подхода является концептуальная близость к предметной области произвольной структуры и назначения. Механизм наследования атрибутов и методов позволяет строить производные понятия на основе базовых и таким образом создавать модель сколь угодно сложной предметной области с заданными свойствами.
В отличие от предыдущих подходов к программированию, объектно-ориентированный подход требует глубокого понимания основных принципов, или, иначе, концепций, на которых он базируется. К числу основополагающих понятий ООП обычно относят абстракцию данных, наследование, инкапсуляцию и полиморфизм.
Объектно-ориентированное программирование в настоящее время является абсолютным лидером в области прикладного программирования.
В качестве основного инструмента разработки применяется Microsoft Visual Studio 2010. Язык программирования C#.
ЦЕЛЬ И ЗАДАЧИ ВЫПОЛНЕНИЯ РАБОТЫ
Целью данной курсовой работы является автоматизация деятельности ликероводочного завода на основе объектно-ориентированного подхода, а также получение навыков в реализации этого подхода, проектировании и реализации схемы данных.
Задачи выполнения работы:
исследование предметной области с целью выявления основных сущностей и их атрибутов;
проектирование иерархии классов и интерфейсов на основе выделенных сущностей;
использование наследования и агрегации для структуризации классов;
применение принципа инкапсуляции к классам;
использование интерфейсов, описывающих операции в данной предметной области, для обеспечения множественного наследования;
тестирование созданных классов в клиентском приложении, автоматизирующем деятельность предметной области;
— документация разработанных классов при помощи XML комментариев.
программа проектирование microsoft visual
1 ВНЕШНЕЕ ОПИСАНИЕ
1.1 Анализ предметной области
Анализ предметной области — самый важный этап разработки программного обеспечения.
Анализ работы ликероводочного завода позволяет определить ключевые понятия, выяснить задачи, требующие решения в рамках проекта, проанализировать функциональные требования будущего продукта и нефункциональные (надёжность, эффективность, изучаемость, модифицируемость и т. п.).
Компонентами данной предметной области являются списки сотрудников, клиентов, продукции и заказов. Данное приложение должно позволять пользователю создавать записи, удалять, редактировать, сохранять и открывать файлы создаваемые программой.
Нефункциональные требования к программному средству:
— надежность: программа должна быть автономной;
— эффективность: программа должна иметь минимальные требования к аппаратному обеспечению. Для использования данного программного средства не должна требоваться установка на компьютер. Не должно требоваться дополнительных периферийных средств (принтер, сканер, дополнительные дисководы и т. д.)
— изучаемость: программа должна быть интуитивно понятна, иметь удобный пользовательский интерфейс;
— модифицируемость: программа должна быть легко модифицируемой вследствие небольшого исходного размера и объектно-ориентированного подхода.
1.2 Функциональная спецификации
Минимальные технические характеристики компьютера, на котором гарантируется стабильная работа программы:
компьютер/процессор: компьютер с процессором класса Pentium II 450 МГц;
— память: 64 МБ ОЗУ;
— монитор: монитор VGA с разрешением 800×600 точек или более высоким, поддерживающий 256 цветов;
— операционная система: операционная система Windows XP с установленным Microsoft .NET Framework 2.0;
— наличие свободного дискового пространства на жёстком диске.
Внешние функции:
— внесение данных и редактирование данных о клиентах, работниках, продукции и заказов;
— сохранение данных в XML-файл;
— считывание данных из XML-файла;
— проверка вводимых данных и вывод сообщений об ошибках;
— программа должна выполнять все функции за предельно малое количество времени;
Критические случаи:
— отсутствие свободного места на жёстком диске. Любая операция с файловой системой должна быть отменена;
— некорректный XML-файл. Программа не должна аварийно завершаться;
— завершение работы Windows. В этом случае программа должна завершать свою работу, не применяя выбранные пользователем настройки.
2. ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА АВТОМАТИЗИРОВАННУЮ СИСТЕМУ
Техническое задание определяет требования к будущей автоматизированной информационной системе со стороны основных процессов.
Система предназначена для решения перечисленных ниже задач:
— изменение списка работников (добавления, удаление);
— изменение списка клиентов (добавления, удаление);
— изменение продукции (добавления, удаление);
— изменение заказов (добавления, удаление);
— отображение информации, хранящейся в XML-файле;
— сохранение информации в XML-файл.
3. ПРОГРАММИРОВАНИЕ
3.1 Описание классов и интерфейсов
В ООП главным элементом является класс, включающий множество объектов с одинаковыми свойствами, операциями и отношениями. Класс имеет внутреннее (реализацию) и внешнее представление — интерфейс. В данной программе реализованы классы Workers, Clients, Checking, Product, Orders, SaveOpen, ListLVZ, а также интерфейс IRemove.
Класс Workers содержит общие характеристики, описывающие работников, такие как фамилию, имя, отчество, телефон, должность и зарплату. Класс Clients содержит информацию о клиентов такую как, фамилию, имя, отчество, телефон, предпреятие и адрес предпреятия. Класс Clients является наследуемым от класса Workers. Класс Product содержит наименование продукции, ее тип, количество производства в день, количество товара на складе, и цену за ящик.
Рассмотрим остальные классы:
— Класс Orders описывает заказы заводу. Содержит такие атрибуты, как имя заказчика, наименование заказываемой продукции, адрес заказчика, количество заказываемого товара, и сумма за весь товар. Содержит конструктор сущности класса.
— Класс Checking служит проверкой выделения строки в таблице с данными.
— Класс SaveOpen содержит два метода LoadXML и Save для загрузки XML-данных из файла и сохранения соответственно, посредством сериализации.
— Класс ListLVZ содержит списки сотрудников, клиентов, товаров и заказов.
3.2 Диаграмма классов
На рисунке 1 представлена диаграмма классов:
Рисунок 1 — Диаграмма классов
4. КЛИЕНТСКОЕ ПРИЛОЖЕНИЕ
4.1 Структура
В данном ПП для продуктивной работы реализован удобный пользовательский интерфейс, похожий на большинство Windows — приложений, с оригинальным дизайном, приятным для восприятия. Данное программное средство можно разбить на модули, взаимодействующие друг с другом. На рисунке 2 представлена структура приложения:
Рисунок 2 — Структура приложения Модуль просмотра данных предоставляет возможность наглядного отображение данных.
Модуль проверки данных реализует методы:
— корректность вводимых пользователем данных;
— корректность считываемых из файла данных Модуль ввода данных, реализует простой графический интерфейс для ввода необходимых значений.
Модуль сохранения данных, формирует все записи в один XML-файл.
Модуль считывания предоставляет возможность открытия XML-файла и заполнения списков в программе.
Модуль редактирования записей предоставляет простой интерфейс для изменения ранее внесенных данных, а также добавления и удаления.
4.2 Проектирование графического интерфейса
На рисунке 3 представлена форма приложения с отображением данных работников завода:
Рисунок 3 — Форма Form1
Для редактирования и ввода записей о сотрудниках, клиентах, продуктах и заказов необходимо воспользоваться соответствующими вкладками на форме. Эти вкладки отображены на рисунках 4−7.
Рисунок 4 — Вкладка «Работники»
Рисунок 5 — Вкладка «Клиенты»
Рисунок 6 — Вкладка «Продукция»
Рисунок 7 — Вкладка «Заказы»
Если количество товаров складе меньше количества заказываемых товаров, то мы можем увидеть сообщение об ошибке изображенное на рисунке 8:
Рисунок 8 — Попытка ввода большого количества товаров Просмотр клиентов заказавших определенный товар можно увидеть на рисунке 9:
Рисунок 9 — Просмотр клиентов Удаление локомотивов, вагонов и сотрудников можно осуществить при помощи кнопки «Удалить запись». При нажатии на эту кнопку мы удаляем выбранный нами локомотив. Аналогично для других списков. Вкладки отображены на рисунках 10 — 13:
Рисунок 10 — Таблица во вкладке «Сотрудники»
Рисунок 11 — Таблица во вкладке «Клиенты»
Рисунок 12 — Таблица во вкладке «Продукция»
Рисунок 13 — Таблица во вкладке «Заказы»
Загрузка и сохранение данных осуществляются в меню файл. «File…» позволяет запустить диалог открытия файла XML, «Сохранить как…» — аналогично, только для сохранения. Диалог сохранения файла предоставлен на рисунке 12(диалог открытия файла принципиально ничем не отличается поэтому его рассматривать не будем):
Рисунок 14 — Сохранение в файл Выбрав имя файла XML и нажав кнопку «Сохранить», мы сохраним данные в файл.
Если попытаться загрузить некорректный XML-файл, то будет выведено такое сообщение, рисунок 15:
Рисунок 15 — Попытка открыть некорректный XML-файл Если попытаться сохранить данные в файл, доступный только на чтение, то будет получено такое сообщение, рисунок 16:
Рисунок 16 — Попытка сохранить в файл, доступный только на чтение
5. ТЕСТИРОВАНИЕ
Для тестирования программы производились различные манипуляции с данными.
Проводились следующие тесты:
— ввод неверных значений;
— открытие некорректного XML-файла;
— запись в защищенный от записи файл;
— доступ к несуществующим элементам списка;
— другие операции в хаотическом порядке, призванные выявить ошибки в программе.
Тестирование выявило мелкие недочеты, которые в последствии были устранены.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Э. Троелсен. С# и платформа .NET. Библиотека программиста. — СПб.: Питер, 2004. —796 с.: ил.
2. Е. А. Жоголев. «Технология программирования» — М., Научный мир, 2004, 216 с
3. Т. А. Павловская. «С#. Программирование на языке высокого уровня. Учебник для вузов» — СПб.: Питер, 2007. — 432 с.
4. Microsoft Developer Network (MSDN). [Электронный ресурс]. — Режим доступа: msdn.microsoft.com, свободный.
5. СТО 01.04 — 2005. Работы студентов. Общие требования и правила оформления. — введ. 2005 — 04 — 01. — Архангельск: Изд-во Арханг. гос. техн. ун-та, 2005.
ПРИЛОЖЕНИЕ А. ЛИСТИНГ ПРОГРАММЫ
(обязательное)
Главная форма:
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;
using Classes;
using System. IO;
using System. Xml;
using System.Xml.Serialization;
using System.Text.RegularExpressions;
namespace LVZ
{
interface IRemove
{
void Remove ();
}
public partial class Form1: Form, IRemove
{
string sv = null;
public class SaveOpen
{
#region Метод LoadXML — загрузка данных из файла
/// Статичный метод для считывания данных из XML-файла. Возвращает ListDelos
/// Адрес к XML файлу для считывания
/// Экземпляр класса ListDelos
public static ListLVZ LoadXML (string filename, ListLVZ listlvz)
{
XmlSerializer Serializer = new XmlSerializer (typeof (ListLVZ));
try
{
using (StreamReader reader = new StreamReader (filename))
{
listlvz = (ListLVZ)Serializer.Deserialize (reader);
}
}
catch (FileNotFoundException)
{
string newXML = @" «+ 'n' + @» «+ 'n' + «» + 'n' + «» ;
using (StreamWriter writer = new StreamWriter (filename))
{
writer.Write (newXML);
}
}
return listlvz;
}
#endregion
/// Статичный метод для сохранения данных в XML-файл.
/// Экземпляр класса ListDelos
/// Путь для сохранения файла XML
#region Save — сохранение экземляра класса Delo в файл
public static void Save (ListLVZ listlvz, string filename)
{
XmlSerializer sr = new XmlSerializer (listlvz.GetType ());
StringBuilder sb = new StringBuilder ();
StreamWriter SW = new StreamWriter (filename);
sr.Serialize (SW, listlvz);
SW.Close ();
}
#endregion
}
public class ListLVZ
{
public List AllWork = new List ();
public List AllClient = new List ();
public List AllProduct = new List ();
public List AllOrders = new List ();
}
public ListLVZ l = new ListLVZ ();
public Form1()
{
InitializeComponent ();
}
private void butWork_Click (object sender, EventArgs e)
{
Workers wr = new Workers ();
wr.famil = Famil. Text;
wr.name = Imya. Text;
wr.otche = Otche. Text;
wr.dolgn = Dolg. Text;
wr.telef = Telef. Text;
wr.Zarplata = Zarpl. Text;
l.AllWork.Add (wr);
dataWork.Rows.Clear ();
for (int i = 0; i < l.AllWork.Count; i++)
{
dataWork.Rows.Add ();
dataWork[0, i]. Value = l. AllWork[i]. famil;
dataWork[1, i]. Value = l. AllWork[i]. name;
dataWork[2, i]. Value = l. AllWork[i]. otche;
dataWork[3, i]. Value = l. AllWork[i]. dolgn;
dataWork[4, i]. Value = l. AllWork[i]. telef;
dataWork[5, i]. Value = l. AllWork[i]. Zarplata;
}
}
private void сохранитьToolStripMenuItem_Click (object sender, EventArgs e)
{
if (saveFileDialog1.ShowDialog () == DialogResult. OK)
{
try
{
SaveOpen.Save (l, saveFileDialog1. FileName);
MessageBox.Show («Файл сохранен»);
}
catch (UnauthorizedAccessException)
{
MessageBox.Show («Невозможно сохранить файл: доступ закрыт»);
}
}
}
private void открытьToolStripMenuItem_Click (object sender, EventArgs e)
{
if ((openFileDialog1.ShowDialog () == DialogResult. OK))
{
try
{
l = SaveOpen. LoadXML (openFileDialog1.FileName, l);
sv = openFileDialog1. FileName;
}
catch (InvalidOperationException)
{
MessageBox.Show («Невозможно прочитать данные из этого XML-файла»);
}
}
string s = openFileDialog1. FileName;
}
private void показатьToolStripMenuItem_Click (object sender, EventArgs e)
{
orNameCl.Items.Clear ();
orNamePr.Items.Clear ();
dataWork.Rows.Clear ();
dataClients.Rows.Clear ();
dataProduct.Rows.Clear ();
dataOrders.Rows.Clear ();
for (int i = 0; i < l.AllClient.Count; i++)
{
string s = (l.AllClient[i]. famil + «» + l. AllClient[i]. name + «» + l. AllClient[i]. otche);
orNameCl.Items.Add (s);
}
for (int i = 0; i < l.AllProduct.Count; i++)
{
string s = (l.AllProduct[i]. name + «(«+ l. AllProduct[i]. clas + «)»);
orNamePr.Items.Add (s);
}
for (int i = 0; i < l.AllWork.Count; i++)
{
dataWork.Rows.Add ();
dataWork[0, i]. Value = l. AllWork[i]. famil;
dataWork[1, i]. Value = l. AllWork[i]. name;
dataWork[2, i]. Value = l. AllWork[i]. otche;
dataWork[3, i]. Value = l. AllWork[i]. dolgn;
dataWork[4, i]. Value = l. AllWork[i]. telef;
dataWork[5, i]. Value = l. AllWork[i]. Zarplata;
}
for (int i = 0; i < l.AllClient.Count; i++)
{
dataClients.Rows.Add ();
dataClients[0, i]. Value = l. AllClient[i]. famil;
dataClients[1, i]. Value = l. AllClient[i]. name;
dataClients[2, i]. Value = l. AllClient[i]. otche;
dataClients[3, i]. Value = l. AllClient[i]. dolgn;
dataClients[4, i]. Value = l. AllClient[i]. telef;
dataClients[5, i]. Value = l. AllClient[i]. predrp;
dataClients[6, i]. Value = l. AllClient[i]. adress;
}
for (int i = 0; i < l.AllProduct.Count; i++)
{
dataProduct.Rows.Add ();
dataProduct[0, i]. Value = l. AllProduct[i]. name;
dataProduct[1, i]. Value = l. AllProduct[i]. clas;
dataProduct[2, i]. Value = l. AllProduct[i]. kolproiz;
dataProduct[3, i]. Value = l. AllProduct[i]. kolskl;
dataProduct[4, i]. Value = l. AllProduct[i]. price;
}
for (int i = 0; i < l.AllOrders.Count; i++)
{
dataOrders.Rows.Add ();
dataOrders[0, i]. Value = l. AllOrders[i]. namecl;
dataOrders[1, i]. Value = l. AllOrders[i]. nameprod;
dataOrders[2, i]. Value = l. AllOrders[i]. adresscl;
dataOrders[3, i]. Value = l. AllOrders[i]. kolzak;
dataOrders[4, i]. Value = l. AllOrders[i]. symm;
}
}
private void butClients_Click (object sender, EventArgs e)
{
Clients cl = new Clients ();
cl.famil = textBox1. Text;
cl.name = textBox2. Text;
cl.otche = textBox3. Text;
cl.dolgn = textBox4. Text;
cl.telef = textBox5. Text;
cl.predrp = textBox6. Text;
cl.adress = textBox7. Text;
l.AllClient.Add (cl);
dataClients.Rows.Clear ();
for (int i = 0; i < l.AllClient.Count; i++)
{
dataClients.Rows.Add ();
dataClients[0, i]. Value = l. AllClient[i]. famil;
dataClients[1, i]. Value = l. AllClient[i]. name;
dataClients[2, i]. Value = l. AllClient[i]. otche;
dataClients[3, i]. Value = l. AllClient[i]. dolgn;
dataClients[4, i]. Value = l. AllClient[i]. telef;
dataClients[5, i]. Value = l. AllClient[i]. predrp;
dataClients[6, i]. Value = l. AllClient[i]. adress;
}
}
private void butProd_Click (object sender, EventArgs e)
{
Product pr = new Product ();
pr.name = prName. Text;
pr.clas = prClass. Text;
pr.kolproiz = prKolProi. Text;
pr.kolskl = prKolSkl. Text;
pr.price = prPrice. Text;
l.AllProduct.Add (pr);
dataProduct.Rows.Clear ();
for (int i = 0; i < l.AllProduct.Count; i++)
{
dataProduct.Rows.Add ();
dataProduct[0,i]. Value = l. AllProduct[i]. name;
dataProduct[1,i].Value = l. AllProduct[i]. clas;
dataProduct[2,i].Value = l. AllProduct[i]. kolproiz;
dataProduct[3,i].Value = l. AllProduct[i]. kolskl;
dataProduct[4, i]. Value = l. AllProduct[i]. price;
}
}
private void butOrders_Click (object sender, EventArgs e)
{
Orders or = new Orders ();
or.namecl = orNameCl. Text;
or.nameprod = orNamePr. Text;
or.adresscl = orAdressCl. Text;
or.kolzak = orKolZak. Text;
or.symm = orSymm. Text;
l.AllOrders.Add (or);
dataOrders.Rows.Clear ();
for (int i = 0; i < l.AllOrders.Count; i++)
{
dataOrders.Rows.Add ();
dataOrders[0,i]. Value = l. AllOrders[i]. namecl;
dataOrders[1,i].Value = l. AllOrders[i]. nameprod;
dataOrders[2,i].Value = l. AllOrders[i]. adresscl;
dataOrders[3,i].Value = l. AllOrders[i]. kolzak;
dataOrders[4,i].Value = l. AllOrders[i]. symm;
}
}
private void orNameCl_SelectedIndexChanged (object sender, EventArgs e)
{
for (int i = 0; i < l.AllClient.Count; i++)
{
string s = (l.AllClient[i]. famil + «» + l. AllClient[i]. name + «» + l. AllClient[i]. otche);
if (orNameCl.Text == s)
{
orAdressCl.Text = l. AllClient[i]. adress;
}
}
}
private void orKolZak_TextChanged (object sender, EventArgs e)
{
}
private void Symm_Click (object sender, EventArgs e)
{
for (int i = 0; i < l.AllProduct.Count; i++)
{
string s = (l.AllProduct[i]. name + «(«+ l. AllProduct[i]. clas + «)»);
if (s == orNamePr. Text)
{
if (orKolZak.Text == «»)
{
orSymm.Text = «» ;
MessageBox.Show («Введите количество товара»);
break;
}
orSymm.Text = (int.Parse (l.AllProduct[i]. price) * int. Parse (orKolZak.Text)).ToString ();
}
string y = l. AllProduct[i]. kolskl;
if (orNamePr.Text == l. AllProduct[i]. name + «(«+ l. AllProduct[i]. clas + «)»)
{
if (int.Parse (orKolZak.Text) > int. Parse (y))
{
orSymm.Text = «» ;
MessageBox.Show («На складе нехватает товара»);
}
}
for (int g = 0; g < l.AllOrders.Count; g++)
{
int n = 0;
if (orNamePr.Text == l. AllOrders[g]. nameprod)
{
for (int k = 0; k < l.AllOrders.Count; k++)
{
if (orNamePr.Text == l. AllOrders[k]. nameprod)
{
n += (int.Parse (l.AllOrders[k]. kolzak));
}
}
int v = 0;
for (int f = 0; f < l.AllProduct.Count; f++)
{
if (orNamePr.Text == (l.AllProduct[f]. name + «(«+ l. AllProduct[f]. clas + «)»))
{
v = int. Parse (l.AllProduct[f]. kolskl) — n;
}
}
if (int.Parse (orKolZak.Text) > v)
{
MessageBox.Show («Недостаточно товара на складе»);
break;
}
}
}
break;
}
}
private void Famil_TextChanged (object sender, EventArgs e)
{
Famil.Text = System.Text.RegularExpressions.Regex.Replace (Famil.Text, @" d", «»);
Imya.Text = System.Text.RegularExpressions.Regex.Replace (Imya.Text, @" d", «»);
Otche.Text = System.Text.RegularExpressions.Regex.Replace (Otche.Text, @" d", «»);
Dolg.Text = System.Text.RegularExpressions.Regex.Replace (Dolg.Text, @" d", «»);
textBox1.Text = System.Text.RegularExpressions.Regex.Replace (textBox1.Text, @" d", «»);
textBox2.Text = System.Text.RegularExpressions.Regex.Replace (textBox2.Text, @" d", «»);
textBox3.Text = System.Text.RegularExpressions.Regex.Replace (textBox3.Text, @" d", «»);
textBox4.Text = System.Text.RegularExpressions.Regex.Replace (textBox4.Text, @" d", «»);
prName.Text = System.Text.RegularExpressions.Regex.Replace (prName.Text, @" d", «»);
}
private void Telef_KeyPress (object sender, KeyPressEventArgs e)
{
Regex r = new Regex («[0−9b]»);
Match m = r. Match (e.KeyChar.ToString ());
if (!m.Success) e. KeyChar = '';
}
private void dataProduct_CellContentClick (object sender, DataGridViewCellEventArgs e)
{
Form2 ff = new Form2();
int g = 0;
for (int i = 0; i < dataProduct.Rows.Count; i++)
{
if (e.ColumnIndex == 5 && e. RowIndex == i)
{
string s = l. AllProduct[i]. name + «(«+ l. AllProduct[i]. clas + «)» ;
for (int p = 0; p < l.AllOrders.Count; p++)
{
string s1 = l. AllOrders[p]. nameprod;
if (s == s1)
{
ff.Text = l. AllOrders[p]. nameprod;
ff.dataGridView1.Rows.Add ();
ff.dataGridView1[0, g]. Value = l. AllOrders[p]. namecl;
for (int j = 0; j < l.AllClient.Count; j++)
{
if ((l.AllClient[j]. famil + «» + l. AllClient[j]. name + «» + l. AllClient[j]. otche) == l. AllOrders[p]. namecl)
{
ff.dataGridView1[1, g]. Value = l. AllClient[j]. predrp;
}
}
ff.dataGridView1[2, g]. Value = l. AllOrders[p]. adresscl;
ff.dataGridView1[3, g]. Value = l. AllOrders[p]. kolzak;
ff.dataGridView1[4, g]. Value = l. AllOrders[p]. symm;
g++;
}
}
}
}
ff.ShowDialog ();
}
public void Remove ()
{
Checking check = new Checking ();
bool u = true;
int y = -1;
u = check. Check_Select ();
if (u)
{
y = dataWork.Rows.IndexOf (dataWork.SelectedRows[0]);
l.AllWork.RemoveAt (y);
DataGridViewRow dr = dataWork. SelectedRows[0];
dataWork.Rows.Remove (dr);
}
}
private void butDel_Click (object sender, EventArgs e)
{
Remove ();
}
private void button1_Click (object sender, EventArgs e)
{
Remove ();
}
private void butSave_Click (object sender, EventArgs e)
{
try
{
SaveOpen.Save (l, sv);
MessageBox.Show («Файл сохранен»);
}
catch (UnauthorizedAccessException)
{
MessageBox.Show («Невозможно сохранить файл: доступ закрыт»);
}
}
}
}
Листинг библиотеки Classes. dll:
using System;
using System.Collections.Generic;
using System. Linq;
using System. Text;
using System. ComponentModel;
using System. Data;
namespace Classes
{
[Serializable]
public class People
{
string FFamil;
string FName;
string FOtche;
string FDolgn;
string FTelef;
public People ()
{
FFamil = «» ;
FName = «» ;
FOtche = «» ;
FDolgn = «» ;
FTelef = «» ;
}
public People (string famil, string name, string otche, string dolgn, string telef)
{
this.FFamil = famil;
this.FName = name;
this.FOtche = otche;
this.FDolgn = dolgn;
this.FTelef = telef;
}
public string famil
{
set
{
FFamil = value;
}
get
{
return FFamil;
}
}
public string name
{
set
{
FName = value;
}
get
{
return FName;
}
}
public string otche
{
set
{
FOtche = value;
}
get
{
return FOtche;
}
}
public string dolgn
{
set
{
FDolgn = value;
}
get
{
return FDolgn;
}
}
public string telef
{
set
{
FTelef = value;
}
get
{
return FTelef;
}
}
}
[Serializable]
public class Workers: People
{
string FZarplata;
public Workers ()
{
FZarplata = «» ;
}
public Workers (string Zarplata)
{
this.FZarplata = Zarplata;
}
public string Zarplata
{
set
{
FZarplata = value;
}
get
{
return FZarplata;
}
}
}
[Serializable]
public class Clients: People
{
string FPredpr;
string FAdress;
public Clients ()
{
FPredpr = «» ;
FAdress = «» ;
}
public Clients (string predpr, string adress)
{
this.FPredpr = predpr;
this.FAdress = adress;
}
public string predrp
{
set
{
FPredpr = value;
}
get
{
return FPredpr;
}
}
public string adress
{
set
{
FAdress = value;
}
get
{
return FAdress;
}
}
}
[Serializable]
public class Product
{
string FName;
string FClas;
string FKolProiz;
string FKolSkl;
string FPrice;
public Product ()
{
FName = «» ;
FClas = «» ;
FKolProiz = «» ;
FKolSkl = «» ;
FPrice = «» ;
}
public Product (string name, string clas, string kolproiz, string kolskl, string price)
{
this.FName = name;
this.FClas = clas;
this.FKolProiz = kolproiz;
this.FKolSkl = kolskl;
this.FPrice = price;
}
public string name
{
set
{
FName = value;
}
get
{
return FName;
}
}
public string clas
{
set
{
FClas = value;
}
get
{
return FClas;
}
}
public string kolproiz
{
set
{
FKolProiz = value;
}
get
{
return FKolProiz;
}
}
public string kolskl
{
set
{
FKolSkl = value;
}
get
{
return FKolSkl;
}
}
public string price
{
set
{
FPrice = value;
}
get
{
return FPrice;
}
}
}
[Serializable]
public class Orders
{
string FNameCl;
string FNameProd;
string FAdressCl;
string FKolZak;
string FSymm;
string FPredpr;
public Orders ()
{
FNameCl = «» ;
FNameProd = «» ;
FAdressCl = «» ;
FKolZak = «» ;
FSymm = «» ;
FPredpr = «» ;
}
public Orders (string namecl, string nameprod, string adresscl, string kolzak, string symm, string predpr)
{
this.FNameCl = namecl;
this.FNameProd = nameprod;
this.FAdressCl = adresscl;
this.FKolZak = kolzak;
this.FSymm = symm;
this.FPredpr = predpr;
}
public string namecl
{
set
{
FNameCl = value;
}
get
{
return FNameCl;
}
}
public string nameprod
{
set
{
FNameProd = value;
}
get
{
return FNameProd;
}
}
public string adresscl
{
set
{
FAdressCl = value;
}
get
{
return FAdressCl;
}
}
public string kolzak
{
set
{
FKolZak = value;
}
get
{
return FKolZak;
}
}
public string symm
{
set
{
FSymm = value;
}
get
{
return FSymm;
}
}
public string predpr
{
set
{
FPredpr = value;
}
get
{
return FPredpr;
}
}
}
}