Курсова робота. Розробка програми моніторингу забруднення навколишнього середовища

Курсова робота. Розробка програми моніторингу забруднення навколишнього середовища

У даній темі описується детальний покроковий процес розробки програми, що керує локальною базою даних Microsoft SQL Server, яка розміщується в “*.mdf”-файлі .

Програма реалізована на мові програмування C# в системі візуальної розробки додатків Microsoft Visual Studio 2010.

Пройшовши всі етапи виконання курсової роботи Ви отримаєте досвід розробки додатків, що взаємодіють з базами даних типу Microsoft SQL Server.


Зміст


Умова задачі

Розробити програму, що оперує базою даних типу Microsoft SQL Server. База даних розміщується в *.mdf-файлі. Програму реалізувати в системі візуальної розробки додатків Microsoft Visual Studio.

У роботі потрібно виконати такі завдання:

  • спроектувати та реалізувати локальну базу даних типу Microsoft SQL Server, яка розміщується в окремому файлі. Ім’я бази даних “MyDataBase.mdf”;
  • створити в базі даних 2 таблиці з іменами “Source” (Джерело) та “Emission” (Викиди). Кожна з таблиць повинна мати задані поля, які описуються нижче. Таблиці бази даних мають бути зв’язані між собою за деяким полем;
  • розробити додаток, що оперує базою даних “MyDataBase.mdf”. Додаток реалізувати на мові C# за шаблоном Windows Forms Application;
  • у додатку реалізувати основні команди оперування записами (даними) в базі даних: додавання, редагування, видалення, перегляд;
  • реалізувати наступні обчислення: знаходження мінімальних, максимальних, середніх викидів для кожного джерела.

База даних містить 2 таблиці, які мають таку структуру.

Таблиця Source (джерело викидів).

Таблиця Emission (викиди для заданого джерела).

Таблиці зв’язані між собою за полем ID_Source.

 

Виконання

1. Вибір моделі бази даних

Для організації роботи з даними при створенні проектів (програм) система Microsoft Visual Studio пропонує різні види джерел даних.

Наприклад:

  • локальна база даних Microsoft SQL Server, що розміщується в окремому “*.mdf” – файлі. Приклад роботи з такою базою даних детально описується тут;
  • локальна база даних Microsoft SQL Server. У цьому випадку має бути встановлений локальний сервер, наприклад SQLEXPRESS. Приклад роботи з такою базою даних детально описується тут;
  • локальна база даних Microsoft Access. У цьому випадку створюється “*.mdb” файл бази даних;
  • база даних, побудована на використанні ODBC-драйвера;
  • Oracle база даних.

Можна також створити власну базу даних у вигляді структур чи класів. Потім, для цієї бази даних можна створити програмний функціонал, що буде обробляти записи бази даних, здійснювати зручний вивід, конвертувати у відомі формати тощо.

Для роботи програми використаємо локальну базу даних, яка розміщена в окремому “*.mdb”– файлі і призначена для роботи під управлінням системи керування реляційними базами даних Microsoft SQL Server.

 

2. Проектування (підключення) бази даних “MyDataBase.mdf”. Створення нового проекту в Microsoft Visual Studio
2.1. Підготовка папки для файлів проекту та бази даних

Підготувати папку для програми. У даному випадку встановлюємо папку проекту і файлів бази даних:

 D:\Programs\C_SHARP\TermPaper01

 

2.2. Завантаження Microsoft Visual Studio. Створення додатку типу Windows Forms Application. Збереження файлів проекту

Завантажити систему візуальної розробки додатків Microsoft Visual Studio. Створити новий проект на мові C# за шаблоном Windows Forms Application.

Новий проект створюється командою

File->New Project

У нашому випадку проект створюється в папці

D:\Programs\C_SHARP\TermPaper01

Більш детально, приклад створення нового проекту описується в статті:

У вікні New Project задаємо такі налаштування:

  • ім’я проекту (поле Name) TermPaper;
  • папка (Location) “D:\Programs\C_SHARP\TermPaper1\”;
  • ім’я рішення (Solution name) TermPaper.

Після створення нового проекту, головна форма програми має вигляд, як показано на рисунку 2.1.

Рис. 2.1. Головна форма програми

 

2.3. Створення нової або підключення раніше створеної бази даних “MyDataBase.mdf”

Після задавання папки для бази даних можна створювати нову базу даних або підключити вже існуючу. Детальний приклад створення/підключення бази даних, що розміщується в окремому “*.mdf”-файлі, описується в статтях:

Щоб не витрачати часу на створення нової бази даних, можна завантажити архів з готовою базою даних, яка була створена раніше.

База даних розміщується у двох файлах:

  • файл “MyDataBase.mdf”;
  • файл “MyDataBase.ldf”.

Після розпакування архіву копіюємо базу даних у папку з майбутньою програмою:

D:\Programs\C_SHARP\TermPaper01

Підключення готової, раніше створеної, бази даних до проекту здійснюється однією з команд:

  • в меню Tools вибрати команду “Connect to Database”;
  • в утиліті Server Explorer вибрати кнопку “Connect to Database”.

У результаті відкриється вікно Add Connection, в якому потрібно вибрати такі налаштування:

  • поле “Data Source” = “Microsoft SQL Server Database File”;
  • поле “Database File name (new of existing)” = “D:\Programs\C_SHARP\TermPaper1\MyDataBase.mdf”. Тут з допомогою кнопки “Browse” вибирається шлях до нашої бази даних MyDataBase.mdf;
  • опція “Log on to the server” = “Use Windows Autentification

Детальний приклад підключення готової бази даних до проекту описується в темі:

– 001 – Приклад створення/підключення локальної бази даних Microsoft SQL Server, яка розміщується в “*.mdf”-файлі.

Після підключення (або створення) бази даних у вікні “Server Explorer” відобразиться база даних “MyDataBase.mdf” (рисунок 2.2).

Рис. 2.2. База даних MyDataBase.mdb у вікні “Server Explorer”

 

2.4. Інформація про базу даних “MyDataBase.mdf”

База даних “MyDataBase.mdf” містить:

  • таблицю Source (рис. 2.3);
  • таблицю Emission (рис. 2.4);
  • діаграму Diagram1, що містить інформацію зв’язки між таблицями Source та Emission (рис. 2.5).

Рис. 2.3. Таблиці Source, Emission та діаграма зв’язків

Якщо розкрити діаграму зв’язків, то відобразиться зв’язок між таблицями Source та Emission за полем ID_Source (рис. 2.5).

Щоб відобразити діаграму зв’язків використовується команда Design Database Diagram, з контекстного меню діаграми (рис. 2.4).

Також відображення діаграми зв’язків викликається подвійним кліком мишкою на Diagram1.

Рис. 2.4. Виклик команди відображення діаграми зв’язків між таблицями

Рис. 2.5. Діаграма зв’язків між таблицями

 

2.5. Підключення рядка з’єднання з базою даних Connection String

У програмі, для доступу до бази даних, буде використовуватись рядок з’єднання з базою даних Connection String. Цей рядок містить усю необхідну інформацію про базу даних.

Детальний опис підключення рядка Connection String до програми реалізовано в темі:

Щоб підключити рядок з’єднання з базою даних, потрібно виконати таку послідовність кроків:

  1. Перейти в утиліту Server Explorer (рис. 2.6).
  2. Виділити файл “MyDataBase.mdf” (рис. 2.6).
  3. У вікні “Properties” виділити рядок (властивість) “Connection Strings” (контекстне меню – команда “Выделить все” і скопіювати його в буфер обміну Clipboard (контекстне меню – команда “Копировать”) (рис. 2.6).
  4. Перейти у текстову частину файлу “Form1.cs”

Створити змінну в класі форми Form1 типу string.

Нехай назва змінної ConnStr. Вставити рядок “Connection String” в рядку ініціалізації значення змінної ConnStr як показано нижче:

// рядок з'єднання з базою даних
string ConnStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Programs\C_SHARP\TermPaper1\TermPaper1\MyDataBase.mdf;Integrated Security=True;User Instance=True";

Рис. 2.6. Копіювання рядка (Connection String) з’єднання з базою даних в програму

На даний момент приблизний вигляд файлу “Form1.cs” наступний:

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 TermPaper1
{
    public partial class Form1 : Form
    {
        // рядок з'єднання з базою даних
        string ConnStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Programs\C_SHARP\TermPaper1\TermPaper1\MyDataBase.mdf;Integrated Security=True;User Instance=True";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

Після цього можна проектувати інтерфейс програми та програмувати методи обробки бази даних.

 

3. Проектування головної форми програми. Розміщення елементів управління на формі

З допомогою інструментів на панелі ToolBox на головній формі програми необхідно розмістити такі елементи управління (рис. 3.1):

  • label1 типу Label. Містить текст “Джерело викидів”;
  • label2 типу Label. Містить текст “Викиди”;
  • dataGridView1 типу dataGridView. Цей елемент управління відображає таблицю бази даних “Джерело викидів”;
  • dataGridView2 типу dataGridView – відображає таблицю бази даних “Викиди”;
  • button1 – кнопка, що містить текст “Додати джерело…” (властивість Text);
  • button2 – кнопка, що містить текст “Видалити джерело”(властивість Text);
  • button3 – кнопка, що містить текст “Редагувати джерело…”;
  • button4 – кнопка, що містить текст “Додати викиди…”;
  • button5 – кнопка, що містить текст “Видалити викиди…”;
  • button6 – кнопка з текстом “Редагувати викиди …”;
  • button7 – кнопка з текстом “Мінімальні викиди”;
  • button8 – кнопка з текстом “Максимальні викиди”;
  • button9 – кнопка з текстом “Середні викиди”;
  • елемент управління menuStrip1 типу MenuStrip.

Для елементів управління label1, label2, button1, button2, button3, button4, button5, button6, button7, button8, button9 налаштовується властивість Text у відповідне значення. Робота з цими елементами управління більш детально описується в практичному прикладі:

– 005 – Приклад програмування події в C#. Розробка програми визначення площі поверхні кулі.

В елементах управління dataGridView1, dataGridView2 налаштовується властивість

EditMode = EditProgrammatically

Це означає, що комірки з відображуваними даними не матимуть можливості редагуватись з допомогою клавіатури. Редагування комірок буде здійснюватись програмним шляхом.

Елемент управління menuStrip1 призначений для створення меню в програмі. У даній роботі створюємо меню, як показано на рисунку 3.2. Робота з елементом управління menuStrip1 детально описується в статті:

Також потрібно налаштувати такі властивості форми (елемент управління Form1):

  • властивість Text = “Програма моніторингу забруднення навколишнього середовища”;
  • властивість MaximizeBox = False.

Рис. 3.1. Головна форма програми після проектування

Рис. 3.2. Головне меню програми. Підменю “Джерело”, “Викиди”, “Розрахунок”

 

4. Розробка другорядних форм (діалогових вікон)
4.1. Проектування форми вікна “Додати джерело”

Додавання в базу даних нового джерела викидів здійснюється після натиску на кнопці “Додати джерело…”. Набір нової інформації про джерело має здійснюватись у окремій формі.

Для створення нової форми потрібно викликати команду

Project -> Add Windows Form... 

У вікні, що відкриється, потрібно вибрати шаблон Windows Form.

Більш детальний приклад створення нової форми та виклику форми описується у статті:

Використовуючи засоби панелі інструментів Toolbox створюємо нову форму, як показано на рисунку 4.1.

Форма має ім’я Form2. Назва файлу форми “Form2.cs”.

Рис. 4.1. Форма додавання нового джерела даних

У формі Form2 розміщуються такі елементи управління:

  • два елементи управління типу Label з іменами label1, label2. Призначені для виведення інформаційних повідомлень;
  • два елементи управління типу Button з іменами button1, button2;
  • два елементи управління типу TextBox з іменами textBox1, textBox2.

Налаштовуємо такі властивості:

  • в формі Form2 властивість Text = “Додати джерело”;
  • у формі Form2 властивість StartPosition = CenterScreen. Це означає, що форма буде відкриватись по центру екрану;
  • в елементі управління label1 властивість Text = “Назва джерела”;
  • в елементі управління label2 властивість Text = “Адреса”;
  • в button1 властивість Text = “Додати”;
  • в button1 властивість DialogResult = “OK”. Це означає, що при натиску на кнопці button1 форма буде закриватись з кодом повернення OK;
  • в button2 властивість Text = “Відмінити”;
  • в button2 властивість DialogResult = “No”.
  • в елементі управління textBox1 властивість Modifiers = Public. Це означає, що елемент має модифікатор доступу Public. Після цього можна мати доступ до textBox1 з інших форм (модулів, файлів);
  • в елементі управління textBox2 властивість Modifiers = Public (видимий ззовні).
4.2. Проектування форми вікна “Редагувати джерело …”

За зразком попереднього пункту (п. 4.1) створюється нова форма “Редагувати джерело …”. Форма має ім’я Form3. Файл форми має ім’я “Form3.cs”.

Після розміщення та налаштування елементів управління, вигляд вікна форми буде таким як показано на рисунку 4.2.

Рис. 4.2. Форма “Редагувати джерело”

На формі розміщуються такі елементи управління:

  • два елементи управління типу Label з іменами label1, label2;
  • два елементи управління типу Button з іменами button1, button2;
  • два елементи управління типу TextBox з іменами textBox1, textBox2.

Налаштувати такі властивості елементів управління:

  • у Form3 властивість Text = “Редагувати джерело”;
  • у Form3 властивість StartPosition = CenterScreen;
  • в елементі управління button1 властивість Text = “Змінити”;
  • у button1 властивість DialogResult = OK;
  • у button2 властивість Text = “Відмінити”;
  • у button2 властивість DialogResult = No;
  • в label1 властивість Text = “Назва джерела”;
  • в label2 властивість Text = “Адреса”;
  • в textBox1 властивість Modifiers = public;
  • в textBox2 властивість Modifiers = public.

 

4.3. Проектування форми вікна “Додати викиди…”

За зразком попередніх форм проектується нова форма додавання викиду (рис. 4.3). Ця форма повинна бути активована після натиску на кнопці “Додати викиди…”. У програмі ім’я форми Form4. Файл форми має ім’я “Form4.cs”.

Рис. 4.3. Вигляд форми додавання нового викиду для заданого джерела

На формі розміщуються наступні елементи управління:

  • 4 елементи управління типу Label з іменами label1, label2, label3, label4;
  • 3 елементи управління типу TextBox з іменами textBox1, textBox2, textBox3;
  • 2 елементи управління типу Button з іменами button1, button2.

Налаштувати такі властивості форми та елементів управління:

  • у формі Form4 властивість Text = “Додати викиди”;
  • у формі Form4 властивість StartPosition = CenterScreen;
  • в label1 властивість Text = “Кількість викидів”;
  • в label2 властивість Text = “Коментарій”;
  • в label3 властивість Text = “Дата”;
  • в label4 властивість Text = “Джерело”;
  • в label4 властивість Modifiers = Public (видимий ззовні);
  • в button1 властивість Text = “Додати”;
  • в button2 властивість Text = “Відмінити”;
  • в button1 властивість DialogResult = OK;
  • в button2 властивість DialogResult = No;
  • в textBox1 властивість Modifiers = Public;
  • в textBox2 властивість Modifiers = Public;
  • в textBox3 властивість Modifiers = Public.
4.4. Проектування форми вікна підтвердження “Видалити джерело”

Після того, як користувач викличе команду “Видалити джерело”, повинно відкритись вікно підтвердження команди. Для цього створюється нова форма з іменем Form5. Файл форми має ім’я “Form5.cs”. Вигляд форми Form5 зображено на рисунку 4.4.

Рис. 4.4. Форма підтвердження “Видалити джерело”

На формі розміщуються наступні елементи управління:

  • два елементи управління типу Label з іменами label1, label2;
  • два елементи управління типу Button з іменами button1, button2.

Налаштувати такі властивості форми та елементів управління:

  • у формі Form5 властивість Text = “Видалити джерело зараження”;
  • у формі Form5 властивість StartPosition = CenterScreen;
  • в елементі управління label1 властивість Text = “Ви дійсно бажаєте видалити джерело:”;
  • в елементі управління label2 властивість Modifiers = Public;
  • у button1 властивість Text = “Так”;
  • у button1 властивість DialogResult = OK;
  • у button2 властивість Text = “Ні”;
  • у button2 властивість DialogResult = No.

 

4.5. Проектування форми вікна підтвердження “Видалити викиди”

За зразком п. 4.4. розробляється форма видалення викидів (рис. 4.5). Ім’я форми Form6.cs. Файл форми має ім’я “Form6.cs”.

Рис. 4.5. Форма підтвердження “Видалити викиди”

На формі розміщуються наступні елементи управління:

  • два елементи управління типу Label з іменами label1, label2;
  • два елементи управління типу Button з іменами button1, button2.

Налаштувати такі властивості форми та елементів управління:

  • у формі Form6 властивість Text = “Видалити викиди”;
  • у формі Form6 властивість StartPosition = CenterScreen;
  • в елементі управління label1 властивість Text = “Ви дійсно бажаєте видалити рядок з викидами?”;
  • в елементі управління label2 властивість Modifiers = Public;
  • у button1 властивість Text = “Так”;
  • у button1 властивість DialogResult = OK;
  • у button2 властивість Text = “Ні”;
  • у button2 властивість DialogResult = No.

 

4.6. Проектування форми вікна “Редагувати викиди…”

Форма редагування рядка викидів має вигляд, як показано на рисунку 4.6. У програмі форма має ім’я Form7 і розміщується у файлі “Form7.cs”.

Рис. 4.6. Вікно “Редагувати викиди…”

На формі розміщуються наступні елементи управління:

  • 4 елементи управління типу Label з іменами label1, label2, label3, label4;
  • 3 елементи управління типу TextBox з іменами textBox1, textBox2, textBox3;
  • 2 елементи управління типу Button з іменами button1, button2.

Налаштувати такі властивості форми та елементів управління:

  • у формі Form7 властивість Text = “Редагувати викиди”;
  • у формі Form7 властивість StartPosition = CenterScreen;
  • в label1 властивість Text = “Джерело”;
  • в label2 властивість Text = “Кількість викидів”;
  • в label3 властивість Text = “Коментар”;
  • в label4 властивість Text = “Дата”;
  • в label1 властивість Modifiers = Public (видимий ззовні);
  • в button1 властивість Text = “Змінити”;
  • в button2 властивість Text = “Відмінити”;
  • в button1 властивість DialogResult = OK;
  • в button2 властивість DialogResult = No;
  • в textBox1 властивість Modifiers = Public;
  • в textBox2 властивість Modifiers = Public;
  • в textBox3 властивість Modifiers = Public.

 

4.7. Проектування форми “Мінімальні викиди”

Згідно з умовою задачі, у програмі проводиться розрахунок мінімальних викидів для кожного джерела. Результат відображається в окремому вікні “Мінімальні викиди”. Для відображення результату до проекту додається відповідна форма з іменем Form8, яка зображена на рисунку 4.7. Файл форми має назву “Form8.cs”.

Рис. 4.7. Вікно форми “Мінімальні викиди”

На формі розміщуються такі елементи управління:

  • елемент управління типу Label з іменем label1;
  • елемент управління типу DataGridView з іменем dataGridView1;
  • елемент управління типу Button з іменем button1.

Налаштовуються такі властивості форми та елементів управління:

  • у формі Form8 властивість Text = “Мінімальні викиди”
  • у формі Form8 властивість StartPosition = CenterScreen;
  • в елементі управління label1 властивість Text = “Мінімальні викиди”;
  • в button1 властивість Text = “OK”;
  • в button1 властивість DialogResult = OK;
  • в dataGridView1 властивість Modifiers = Public.

 

4.8. Проектування форми “Максимальні викиди”

Форма “Максимальні викиди” призначена для відображення максимальних викидів для кожного джерела (рис. 4.8). У програмі дана форма має ім’я Form9. Файл форми має ім’я “Form9.cs”.

Рис. 4.8. Вікно форми “Максимальні викиди”

На формі розміщуються такі елементи управління:

  • елемент управління типу Label з іменем label1;
  • елемент управління типу DataGridView з іменем dataGridView1;
  • елемент управління типу Button з іменем button1.

Налаштовуються такі властивості форми та елементів управління:

  • у формі Form9 властивість Text = “Максимальні викиди”
  • у формі Form9 властивість StartPosition = CenterScreen;
  • в елементі управління label1 властивість Text = “Максимальні викиди”;
  • в button1 властивість Text = “OK”;
  • в button1 властивість DialogResult = OK;
  • в dataGridView1 властивість Modifiers = Public.

 

4.9. Проектування форми “Середні викиди”

Форма “Середні викиди” призначена для відображення середніх викидів для кожного джерела (рис. 4.9). Розраховується середнє арифметичне значення. У програмі дана форма має ім’я Form10. Файл форми має ім’я “Form10.cs”.

Рис. 4.9. Вікно форми “Середні викиди”

На формі розміщуються такі елементи управління:

  • елемент управління типу Label з іменем label1;
  • елемент управління типу DataGridView з іменем dataGridView1;
  • елемент управління типу Button з іменем button1.

Налаштовуються такі властивості форми та елементів управління:

  • у формі Form10 властивість Text = “Середні викиди”
  • у формі Form9 властивість StartPosition = CenterScreen;
  • в елементі управління label1 властивість Text = “Середні викиди”;
  • в button1 властивість Text = “OK”;
  • в button1 властивість DialogResult = OK;
  • в dataGridView1 властивість Modifiers = Public.

 

5. Написання програмного коду
5.1. Додавання простору імен System.Data.SqlClient

Щоб на програмному рівні працювати з “*.mdf”-файлами бази даних Microsoft SQL Server, у верхній частині файлу “Form1.cs” потрібно підключити простір імен System.Data.SqlClient

using System.Data.SqlClient;

На даний момент текст модуля основної форми Form1.cs має приблизно такий вигляд:

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;

// простір імен для роботи з базою даних MS SQL
using System.Data.SqlClient;

namespace TermPaper1
{
    public partial class Form1 : Form
    {
        // рядок з'єднання з базою даних
        string ConnStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=D:\Programs\C_SHARP\TermPaper1\TermPaper1\MyDataBase.mdf;Integrated Security=True;User Instance=True";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

}

 

5.2. Розробка методу заповнення методу dataGridView1 з таблиці Source

Після завантаження програми, внесення змін у таблиці тощо, дані з бази даних повинні відображатись у таблицях Source і Emission. Тому потрібно створити методи, що читають дані з цих таблиць на основі простого запиту на мові SQL.

Метод FillSource(), що читає дані з таблиці Source має вигляд

// Показати таблицю Source
private void FillSource()
{
    string SqlText = "SELECT * FROM [Source]";
    SqlDataAdapter da = new SqlDataAdapter(SqlText,ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds,"[Source]");
    dataGridView1.DataSource = ds.Tables["[Source]"].DefaultView;
}

Цей метод потрібно додати у текст класу форми Form1 після методу Form1_Load().

Пояснимо деякі фрагменти коду методу Source. Звертання до бази даних здійснюється з допомогою методу FillSource(). Змінна SqlText містить рядок на мові SQL читання даних з таблиці Source

SELECT *
FROM [Source]

У методі оголошується екземпляр класу SqlDataAdapter з іменем da. Клас SqlDataAdapter представляє набір команд над даними і з’єднанням з базою даних, що використовуються для заповнення об’єкту класу System.Data.DataSet та оновлення бази даних SQL Server.

Екземпляр класу DataSet має ім’я ds. Клас DataSet реалізує кеш даних в пам’яті.

У програмному коді використовується метод Fill() класу SqlDataAdapter. Цей метод додає або оновлює рядки в System.Data.DataSet у відповідності з іменами у джерелі даних.

Метод Fill() отримує два параметри типу System.Data.DataSet та System.Data.DataTable. Перший параметр необхідний, щоб заповнити записи таблиці або схему. Другий параметр містить назву таблиці.

 

5.3. Розробка методу заповнення елементу управління dataGridView2 з таблиці Emission

Для відображення даних таблиці Emission в dataGridView2 розробимо метод за зразком попереднього пункту (п. 5.2). Метод має назву FillEmission()

// Показати таблицю Emissions
private void FillEmission()
{
    // сформувати рядок SQL-запиту
    string SqlText = "SELECT * FROM [Emission]";
    int index;
    string ID_Source;
    index = dataGridView1.CurrentRow.Index;
    ID_Source = dataGridView1[0, index].Value.ToString();

    SqlText = "SELECT * FROM [Emission],[Source] WHERE (([Emission].ID_Source = ";
    SqlText = SqlText + ID_Source + ") AND ([Source].ID_Source = " + ID_Source + "))";

    SqlDataAdapter da = new SqlDataAdapter(SqlText, ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds, "[Emission]");
    dataGridView2.DataSource = ds.Tables["[Emission]"].DefaultView;
}

У цьому методі у змінній SqlText програмно формується наступний запит на мові SQL:

 SELECT *
 FROM [Emission], [Source]
 WHERE ([Emission].ID_ Source = ID_Source) AND
       ([Source].ID_Source = ID_Source)

де ID_Source – унікальне значення лічильника в таблицях Emission та Source.

Щоб отримати значення ID_Source, спочатку обчислюється індекс рядка в таблиці Source

index = dataGridView1.CurrentRow.Index;

потім обчислюється значення ID_Source, яке по порядку йде в позиції 0 таблиці Source:

ID_Source = dataGridView1[0, index].Value.ToString();

Наступні кроки виконуються за зразком п. 5.2. Тільки дані виводяться в елементі управління dataGridView2.

 

5.4. Модифікація методу Form_Load() основної форми Form1

У класі основної форми Form1 є метод Form_Load(), який викликається одразу після запуску програми на виконання. Тому сюди потрібно вписати виклик методів FillSource() та FillEmission().
Загальний вигляд методу Form_Load():

private void Form1_Load(object sender, EventArgs e)
{
    FillSource();
    FillEmission();
}

 

5.5. Розробка методу MyExecuteNonQuery() зміни даних в таблицях

У програмі передбачається редагування (зміна) даних в таблицях з допомогою SQL-команд INSERT, UPDATE, DELETE. Тому, потрібно реалізувати спільний метод, який буде викликатись в залежності від вибраної команди. Метод називається MyExecuteNonQuery(). Лістинг методу наступний:

// Метод, для зручної обробки команд INSERT, UPDATE, DELETE
// метод отримує SQL-запит
public void MyExecuteNonQuery(string SqlText)
{
    SqlConnection cn; // екземпляр класу типу SqlConnection
    SqlCommand cmd;
    // виділення пам'яті з ініціалізацією рядком з'єднання з базою даних
    cn = new SqlConnection(ConnStr);

    cn.Open(); // відкрити джерело даних
    cmd = cn.CreateCommand(); // задати SQL-команду
    cmd.CommandText = SqlText; // задати командний рядок
    cmd.ExecuteNonQuery(); // виконати SQL-команду
    cn.Close(); // закрити джерело даних
}

Пояснимо роботу методу. Метод отримує текст SQL-команди в змінній SqlText. Це може бути одна з команд INSERT, UPDATE, DELETE.

Після цього створюється екземпляр класу SqlConnection, який символізує з’єднання з базою даних. Об’єкт класу має назву cn.
Інший клас SqlCommand призначений для коректного збереження SQL-команди в змінній CommandText. Відповідно створюється об’єкт цього класу з іменем cmd. У класі SqlCommand є метод ExecuteNonQuery(), який виконує SQL-команду.

Перед внесенням змін в джерело даних, його потрібно відкрити командою Open(). Після внесення змін, джерело даних (база даних) закривається методом Close().

Метод MyExecuteNonQuery() може бути викликаний з інших методів з допомогою рядка:

// виконати SQL-команду
MyExecuteNonQuery(SqlText);

де SqlText – текст відповідної SQL-команди.

 

5.6. Програмування події кліку на кнопці button1 (“Додати джерело…”)

Щоб викликати вікно додавання нового джерела потрібно зробити клік на кнопці button1 (“Додати джерело…”). У результаті відкриється вікно додавання нового джерела (див. п. 4.1).

Лістинг обробника події кліку на кнопці button1 має вигляд:

// Кнопка "Додати джерело..."
private void button1_Click(object sender, EventArgs e)
{
    string SqlText = "INSERT INTO [Source] ([ID_Source],[Name],[Address]) VALUES (1, 'Source-01','Address-01') ";
    Form2 f = new Form2(); // створити екземпляр вікна

    if (f.ShowDialog() == DialogResult.OK)
    {
        // сформувати SQL-рядок
        SqlText = "INSERT INTO [Source] ([Name], [Address]) VALUES (";
        SqlText = SqlText + "\'" + f.textBox1.Text + "\', ";
        SqlText = SqlText + "\'" + f.textBox2.Text + "\')";

        // виконати SQL-команду
        MyExecuteNonQuery(SqlText);
        // відобразати таблицю Source
        FillSource();
    }
}

Пояснимо деякі фрагменти коду.

Додавання джерела здійснюється на основі SQL-команди:

INSERT INTO [Source] ([Name], [Address])
VALUES (name, address)

де name, address – значення полів textBox1, textBox2 форми Form2. У ці поля користувач вводить назву та адресу нового джерела.

SQL-команда програмно формується у змінній SqlText. Виконання команди здійснюється в методі MyExecuteNonQuery(), який отримує параметром значення змінної SqlText (див. п. 5.5).

Створення нової форми здійснюється стандартним для C# .NET шляхом:

Form2 f = new Form2();

Виклик вікна форми здійснюється методом ShowDialog() форми Form2:

 f.ShowDialog()

Після додавання джерела в базу даних виконується перемальовування елементу управління dataGridView1 головної форми програми Form1 з допомогою методу FillSource().

 

5.7. Програмування події кліку на кнопці button3 (“Редагувати джерело…”)

За зразком попереднього пункту, програмується подія кліку на кнопці button3. Обробник події має вигляд:

// Команда "Редагувати джерело..."
private void button3_Click(object sender, EventArgs e)
{
    int index, n;
    string SqlText = "UPDATE [Source] SET ";
    string ID_Source, name, address;

    // перевірка, чи є взагалі записи в таблиці Source
    n = dataGridView1.Rows.Count;
    if (n == 1) return;

    Form3 f = new Form3();

    // заповнити форму даними перед відкриттям
    index = dataGridView1.CurrentRow.Index;
    ID_Source = dataGridView1[0, index].Value.ToString();
    name = dataGridView1[1, index].Value.ToString();
    address = dataGridView1[2, index].Value.ToString();

    f.textBox1.Text = name;
    f.textBox2.Text = address;

    if (f.ShowDialog() == DialogResult.OK)
    {
        name = f.textBox1.Text;
        address = f.textBox2.Text;
        SqlText += "Name = \'" + name + "\', Address = '" + address + "\' ";
        SqlText += "WHERE [Source].ID_Source = " + ID_Source;
        MyExecuteNonQuery(SqlText);
        FillSource();
    }
}

В обробнику події відкривається форма Form3 (“Редагувати джерело”), яка була спроектована в п. 4.2.

Перед відкриттям форми заповнюються змінні index, ID_Source, name, address. Потім значення змінних записується в textBox1, textBox2 форми Form3. Усі інші команди виконуються за зразком попереднього пункту (п. 5.6).

Текст SQL-команди має вигляд:

UPDATE [Source]
SET Name = name, Address = address
WHERE [Source].ID_Source = ID_Source

де name, address – змінена назва та адреса джерела.

 

5.8. Налаштування властивості DeleteRule в об’єкті FK_Emission_Source (зв’язок між діаграмами) для коректного видалення джерела

Для того, щоб видалити джерело з таблиці [Source], потрібно виконати наступний SQL-запит:

DELETE FROM [Source]
WHERE [Source].ID_Source = ID_Source

де ID_Source – унікальний ідентифікатор джерела, який обчислюється програмно.

При видаленні джерела з таблиці Source може виникнути проблема. Ця проблема полягає в тому, що при видаленні джерела з таблиці Source мають бути видалені усі записи з таблиці Emission. Тому, вищенаведений SQL-запит поки що працювати не буде: база даних буде видавати помилку, що з таблицею Source зв’язані дані в таблиці Emission.

Щоб уникнути цієї проблеми, потрібно правильно налаштувати зв’язок між діаграмами. У програмі, об’єкт, що відповідає за зв’язок між діаграмами має назву FK_Emission_Source. Для правильного налаштування зв’язку потрібно виконати такі дії:

1. Перейти в утиліту Server Explorer. Для бази даних “MyDataBase.mdf” розкрити вкладку “Database Diagrams” (рис. 5.1).

2. Викликати контекстне меню, з допомогою кліку правою кнопкою мишки на елементі Diagram1. У контекстному меню вибрати команду “Design Database Diagram” (рис. 5.1). У результаті відкриється вікно з діаграмою dbo.Diagram1, що зв’язує таблиці Source та Emission.

Рис. 5.1. Виклик діаграми зв’язку між таблицями

3. У вікні dbo.Diagram1 виділити зв’язок між діаграмами FK_Emission_Source (рис. 5.2)

4. У вікні властивостей у вкладці “INSERT AND UPDATE” встановити значення властивості Delete Rule = Cascade (каскадне видалення полів).

Після цього можна програмувати подію кліку на кнопці button2“Видалити джерело” (див. п. 5.9).

Рис. 5.2. Налаштування властивості DeleteRule в значення Cascade

 

5.9. Програмування події кліку на кнопці button2 (“Видалити джерело”)

Тепер всі підготовчі операції для реалізації команди видалення джерела з таблиці [Source] виконано (див. п. 5.8).

Команда видалення джерела базується на SQL-запиті:

DELETE FROM [Source]
WHERE [Source].ID_Source = ID_Source

де ID_Source – унікальний ідентифікатор джерела, який програмно обчислюється в наступних рядках:

index = dataGridView1.CurrentRow.Index;
ID_Source = Convert.ToString(dataGridView1[0, index].Value);

Лістинг обробника події кліку на кнопці “Видалити джерело” має вигляд:

// Кнопка "Видалити джерело"
private void button2_Click(object sender, EventArgs e)
{
    int index, n;
    string ID_Source;
    string name, address;
    string SqlText = "DELETE FROM [Source] WHERE [Source].ID_Source = ";

    // перевірка, чи є взагалі записи в таблиці Source
    n = dataGridView1.Rows.Count;
    if (n == 1) return;

    Form5 f = new Form5();
    index = dataGridView1.CurrentRow.Index;
    ID_Source = Convert.ToString(dataGridView1[0, index].Value);

    // сформувати SQL-команду
    SqlText = SqlText + ID_Source;

    // заповнити інформаційну довідку у вікні Form5
    name = Convert.ToString(dataGridView1[1, index].Value);
    address = Convert.ToString(dataGridView1[2, index].Value);

    f.label2.Text = ID_Source + " - " + name + " - " + address;

    if (f.ShowDialog() == DialogResult.OK) // вивести форму
    {
        // виконати SQL-команду
        MyExecuteNonQuery(SqlText);
        // відобразити таблицю Source
        FillSource();
    }
}

Перед видаленням джерела викликається вікно підтвердження команди (форма Form5). Форма Form5 підтвердження команди видалення джерела була спроектована у п. 4.4. Попередньо формується інформаційна довідка про джерело, що видаляється.

 

5.10. Програмування події кліку на кнопці button4 (“Додати викиди…”)

Після натиску на кнопці “Додати викиди…” викликається форма Form4 додавання викидів (див. п. 4.3).

Лістинг обробника події додавання викидів (кнопка button4) має вигляд:

// Команда "Додати викиди"
private void button4_Click(object sender, EventArgs e)
{
    string SqlText = "";
    int index; // номер виділеного рядка в таблиці Source
    string ID_Source;
    string name;
    Form4 f = new Form4();

    // 1.1. Знайти активний рядок в Source і взяти з нього ID_Source
    index = dataGridView1.CurrentRow.Index;
    ID_Source = Convert.ToString(dataGridView1[0, index].Value);
    name = Convert.ToString(dataGridView1[1, index].Value);

    if (f.ShowDialog() == DialogResult.OK)
    {
        // Додати дані в таблицю
        // Сформувати SQL-рядок
        SqlText = "INSERT INTO [Emission] ([ID_Source], [count], [Text], [date]) VALUES (";
        // Сформувати значення змінної SqlText
        SqlText = SqlText + ID_Source + ", "; // ID_Source
        SqlText = SqlText + f.textBox1.Text + ", "; // count
        SqlText = SqlText + "\'" + f.textBox2.Text + "\', "; // Text
        SqlText = SqlText + "\'" + f.textBox3.Text + "\')"; // date

        // виконати SQL-команду
        MyExecuteNonQuery(SqlText);
        // вивести таблицю Emission
        FillEmission();
    }
}

Додавання рядка викидів у таблицю Emission виконується з допомогою SQL-команди:

INSERT INTO [Emission] ([ID_Source], [count], [Text], [date])
VALUES (ID_Source, f.textBox1.Text, f.textBox2.Text, f.textBox3.Text)

де

  • ID_Source – унікальний ідентифікатор джерела викидів (обчислюється програмно);
  • f.textBox1.Text – значення, введене користувачем у полі textBox1 форми Form4. Це значення відповідає полю count таблиці Emission;
  • f.textBox2.Text – значення, введене користувачем у полі textBox2 форми Form4. Це значення відповідає полю Text таблиці Emission;
  • f.textBox3.Text – значення, введене користувачем у полі textBox3 форми Form4. Це значення відповідає полю date таблиці Emission.

 

5.11. Програмування події кліку на кнопці button6 (“Редагувати викиди…”)

Після вибору команди “Редагувати викиди…” відкривається відповідне вікно (форма Form7), яке було спроектоване в п. 4.6.

Лістинг обробника події кліку на кнопці button6 має вигляд:

// Кнопка "Редагувати викиди..."
private void button6_Click(object sender, EventArgs e)
{
    int index, index_src, n;
    string SqlText = "UPDATE [Emission] SET ";
    string ID_Emission, ID_Source, count, Text, date;
    string Name_Source;

    // перевірка, чи є взагалі записи в таблиці Emission
    n = dataGridView2.Rows.Count;
    if (n == 1) return;

    Form7 f = new Form7();

    // заповнити форму даними перед відкриттям
    index = dataGridView2.CurrentRow.Index;
    ID_Emission = dataGridView2[0, index].Value.ToString();
    ID_Source = dataGridView2[1, index].Value.ToString();
    count = dataGridView2[2, index].Value.ToString();
    Text = dataGridView2[3, index].Value.ToString();
    date = dataGridView2[4, index].Value.ToString();

    index_src = dataGridView1.CurrentRow.Index;
    Name_Source = dataGridView1[1, index_src].Value.ToString();

    //
    f.label1.Text = Name_Source;
    f.textBox1.Text = count;
    f.textBox2.Text = Text;
    f.textBox3.Text = date;

    if (f.ShowDialog() == DialogResult.OK)
    {
        count = f.textBox1.Text;
        Text = f.textBox2.Text;
        date = f.textBox3.Text;

        SqlText += "count = " + count + ", Text = \'" + Text + "\', date = \'" + date + "\' ";
        SqlText += "WHERE [Emission].ID_Emission = " + ID_Emission;

        MyExecuteNonQuery(SqlText);
        FillEmission();
    }
}

Команда “Редагувати викиди…” базується на SQL-команді:

UPDATE [Emission]
SET count = count1, Text = Text1, date = date1
WHERE [Emission].ID_Emission = ID_Emission

де

  • count1 – значення, введене користувачем у полі textBox1 форми Form7. Це значення відповідає полю [Emission].[count];
  • Text1 – значення, введене користувачем у полі textBox2 форми Form7. Це значення відповідає полю [Emission].[Text];
  • date1 – значення, введене користувачем у полі textBox3 форми Form7. Це значення відповідає полю [Emission].[date];
  • ID_Source – унікальний ідентифікатор джерела з таблиці Source. Це значення відповідає полю [Emission].ID_Source.

 

5.12. Програмування події кліку на кнопці button5 (“Видалити викиди”)

Лістинг обробника події видалення рядка викидів з таблиці Emission має вигляд:

// Кнопка "Видалити викиди"
private void button5_Click(object sender, EventArgs e)
{
    //
    int index, n;
    string ID_Emission;
    string count, text;
    string SqlText = "DELETE FROM [Emission] WHERE [Emission].ID_Emission = ";

    // перевірка, чи є взагалі записи в таблиці Emission
    n = dataGridView2.Rows.Count;
    if (n == 1) return;

    Form6 f = new Form6();

    index = dataGridView2.CurrentRow.Index;
    ID_Emission = Convert.ToString(dataGridView2[0, index].Value);

    // сформувати SQL-команду
    SqlText += ID_Emission;

    // заповнити інформаційну довідку у вікні Form6
    count = Convert.ToString(dataGridView2[2, index].Value);
    text = Convert.ToString(dataGridView2[3, index].Value);

    f.label2.Text = ID_Emission + " - " + count + " - " + text;

    if (f.ShowDialog() == DialogResult.OK)
    {
        MyExecuteNonQuery(SqlText); // виконати SQL-команду
        FillEmission(); // відобразити таблицю Emission
    }
}

Команда “Видалити викиди” базується на SQL-команді:

DELETE FROM [Emission]
WHERE [Emission].ID_Emission = ID_Emission

де ID_Emission – унікальний ідентифікатор рядка викидів у таблиці Emission. ID_Emission формується програмно на основі активного рядка елементу управління dataGridView2:

index = dataGridView2.CurrentRow.Index;
ID_Emission = Convert.ToString(dataGridView2[0, index].Value);

 

5.13. Програмування події кліку на кнопці button7 (“Мінімальні викиди”)

Щоб обчислити мінімальні викиди для кожного джерела, використовуєтья SQL-запит:

SELECT [Emission].ID_Source, MIN([Emission].count) AS 'Мінімальні викиди'
FROM [Emission]
GROUP BY [Emission].ID_Source

Для пошуку мінімуму, у даному запиті використовується функція агрегування MIN з бібліотеки мови SQL.

Лістинг обробника події кліку на кнопці button7 наступний:

// Кнопка "Мінімальні викиди"
private void button7_Click(object sender, EventArgs e)
{
    // SQL-запит - визначає мінімальні викиди для кожного джерела
    string SqlText;

    // варіант 1
    SqlText = "SELECT [Emission].ID_Source, MIN([Emission].count) AS \'Мінімальні викиди\' ";
    SqlText += " FROM [Emission]";
    SqlText += " GROUP BY [Emission].ID_Source";

    Form8 f = new Form8();

    SqlDataAdapter da = new SqlDataAdapter(SqlText, ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds, "[Emission]");
    f.dataGridView1.DataSource = ds.Tables["[Emission]"].DefaultView;
    f.ShowDialog();
}

Результат виводиться у формі Form8, яка була спроектована у п. 4.7.

 

5.14. Програмування події кліку на кнопці button8 (“Максимальні викиди”)

За зразком попереднього пункту (п. 5.13) реалізований обробник події кліку на кнопці button8.

Максимальні викиди обчислюються на основі SQL-запиту:

SELECT [Emission].ID_Source, MAX([Emission].count) AS 'Максимальні викиди'
FROM [Emission]
GROUP BY [Emission].ID_Source

Для пошуку максимуму, в SQL-запиті використовується функція агрегування MAX.

Лістинг обробника події наступний:

// Кнопка "Максимальні викиди"
private void button8_Click(object sender, EventArgs e)
{
    // SQL-запит - визначає максимальні викиди для кожного джерела
    string SqlText = "SELECT [Emission].ID_Source, MAX([Emission].count) AS \'Максимальні викиди\' ";
    SqlText += " FROM [Emission]";
    SqlText += " GROUP BY [Emission].ID_Source";

    Form9 f = new Form9();
    SqlDataAdapter da = new SqlDataAdapter(SqlText, ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds, "[Emission]");
    f.dataGridView1.DataSource = ds.Tables["[Emission]"].DefaultView;
    f.ShowDialog();
}

 

5.15. Програмування події кліку на кнопці button9 (“Середні викиди”)

Середні викиди обчислюються на основі SQL-запиту:

SELECT [Emission].ID_Source, AVG([Emission].count) AS 'Середні викиди'
FROM [Emission]
GROUP BY [Emission].ID_Source

Для пошуку середнього арифметичного значення, в SQL-запиті використовується функція агрегування AVG.

Лістинг обробника події наступний:

// Кнопка "Середні викиди"
private void button9_Click(object sender, EventArgs e)
{
    // SQL-запит - визначає середні викиди для кожного джерела
    string SqlText = "SELECT [Emission].ID_Source, AVG([Emission].count) AS \'Середні викиди\' ";
    SqlText += " FROM [Emission]";
    SqlText += " GROUP BY [Emission].ID_Source";

    Form10 f = new Form10();
    SqlDataAdapter da = new SqlDataAdapter(SqlText, ConnStr);
    DataSet ds = new DataSet();
    da.Fill(ds, "[Emission]");
    f.dataGridView1.DataSource = ds.Tables["[Emission]"].DefaultView;
    f.ShowDialog();
}

 

5.16. Програмування події вибору рядка в dataGridView1 (таблиця Source)

Якщо користувач вибирає рядок в таблиці Source (елемент управління dataGridView1), мають виводитись зв’язані рядки таблиці Emission, що мають таке саме значення ID_Source. Дані таблиці Emission виводяться в елементі управління dataGridView2.

Тому, доцільно запрограмувати подію Click елементу управління dataGridView1 (рис. 5.3). Обробник цієї події має назву dataGridView1_Click().

Рис. 5.3. Подія Click елементу управління dataGridView1

Лістинг обробника події кліку мишкою на dataGridView1 наступний:

// клік мишкою на dataGridView1
private void dataGridView1_Click(object sender, EventArgs e)
{
    // на основі виділеного рядка в таблиці Source вивести таблицю Emission
    // визначити кількість рядків в dataGridView1
    int n = dataGridView1.RowCount;
    int row = dataGridView1.CurrentRow.Index;

    if (n != (row + 1)) // Перевірка, чи на клацнули на останньому рядку
    FillEmission();
}

 

5.17. Програмування події зміни активної комірки в dataGridView1 (таблиця Source)

Якщо змінити значення комірки в таблиці Source (елемент управління dataGridView1) з допомогою мишки або клавіатури, то мають виводитись відповідні дані таблиці Emission (елемент управління dataGridView2).

У цьому випадку ефективним є програмування події CellEnter елементу управління dataGridView1. Ця подія генерується, коли будь-яка комірка таблиці dataGridView1 отримує фокус введення.

Така ситуація можлива у випадку, коли користувач з допомогою мишки або клавіатури змінює активні комірки (рядки).

Рис. 5.4. Подія CellEnter елементу управління dataGridView1

Обробник події CellEnter має назву dataGridView1_CellEnter().

Лістинг обробника події має вигляд:

// Зміна активної комірки в dataGridView1
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    int n = dataGridView1.RowCount;
    int row = dataGridView1.CurrentRow.Index;
    if (n != (row + 1)) // Перевірка, чи на клацнули на останньому рядку
    FillEmission();
}

 

6. Налаштування команд меню menuStrip1

На цьому кроці налаштовується виконання команд з меню menuStrip1 головної форми Form1 програми. Команди меню menuStrip1 копіюють виконання команд обробників подій кнопок button1, button2, …, button9. Оскільки, вже запрограмовані команди кліку на кнопках головної форми, то достатньо перенаправити на них відповідні команди меню.

Здійснимо перенаправлення команди меню “Джерело” -> “Додати…” на обробник події button1_Click(). Для цього потрібно виконати такі дії.

  1. Активувати команду “Джерело”->”Додати…” з меню menuStrip1 (рис. 6.1 – 1).
  2. Активувати вкладку Events у вікні Properties (рис. 6.1 – 2).
  3. Вибрати подію Click (рис. 6.1 – 3).
  4. З спадного списку вибрати назву обробника події button1_Click().

Рис. 6.1. Перенаправлення команди “Джерело”->”Додати…” на обробник події button1_Click()

За зразком налаштовуються усі інші команди меню:

  • команда “Джерело” -> “Видалити” відповідає обробнику події button2_Click();
  • команда “Джерело” -> “Редагувати…” відповідає обробнику події button3_Click();
  • команда “Викиди” -> “Додати…” відповідає обробнику події button4_Click();
  • команда “Викиди” -> “Видалити…” відповідає обробнику події button5_Click();
  • команда “Викиди” -> “Редагувати…” відповідає обробнику події button6_Click();
  • команда “Розрахунок” -> “Мінімальні викиди…” відповідає обробнику події button7_Click();
  • команда “Розрахунок” -> “Максимальні викиди…” відповідає обробнику події button8_Click();
  • команда “Розрахунок” -> “Середні викиди…” відповідає обробнику події button9_Click().

 

7. Запуск програми на виконання

Після виконаних дій можна запускати програму на виконання (рис. 7).

Рис. 7. Виконання програми

 


Зв’язані теми