C#. Windows Forms. Бази даних. Курсова робота. Розробка програми ведення обліку матеріальних засобів. База даних Microsoft Access




C#. Курсова робота. Розробка програми ведення обліку матеріальних засобів. База даних Microsoft Access

У курсовій роботі описується покроковий процес створення програми обліку матеріальних засобів (інвентаризація). Представлено підхід до проектування додатку, що взаємодіє з базою даних на автономному рівні з використанням засобів Microsoft Visual Studio.

Використовуючи даний приклад, Ви зможете створювати власні додатки, що оперують базами даних Microsoft Access, використовуючи засоби MS Visual Studio. Приклад, що демонструється у даній темі, також може підійти для оперування базами даних інших провайдерів, наприклад, Microsoft SQL Server, Oracle і т.д. Оскільки робота з компонентами на автономному рівні, нічим не відрізняється від роботи, описаної в даній темі.

Схожі курсові роботи на C#:

Дана робота демонструє наявність потужних засобів для роботи з базами даних в MS Visual Studio. Взаємодія між візуальними елементами управління і базою даних реалізується з допомогою відповідних налаштувань, без програмного формування SQL-запитів. Це, в свою чергу, мінімізує написання програмного коду, оскільки вся робота з виведення інформації та обробки таблиць бази даних виконується системою.


Зміст


Пошук на інших ресурсах:

Умова задачі

Розробити програму для ведення автоматизованого обліку матеріальних засобів. Базу даних використати Microsoft Access. Програма (додаток) має бути створений за шаблоном Windows Forms Application.

База даних попередньо створена засобами Microsoft Access і має назву Account. Архів з файлом бази даних Account.mdb можна завантажити тут.

База даних Account складається з двох таблиць Worker і Account. Таблиця Worker описує загальні дані про працівника підприємства або організації. Таблиця Account описує перелік матеріальних цінностей, що числяться за конкретним працівником. Таблиці зв’язані між собою за полем ID_Worker.

Структура таблиці Worker.

Структура таблиці Worker

Структура таблиці Account.

Структура таблиці Account

Схема зв’язку між таблицями зображена на рисунку 1.

Схема зв’язку між таблицями

Рис. 1. Схема зв’язку між таблицями

 

Додаткова інформація

Відображення таблиць бази даних та взаємодія з користувачем здійснюються з допомогою елементу управління DataGridView.

Після зв’язуванні таблиці з базою даних система формує три об’єкти з іменами

  • DataBaseNameDataSet
  • TableNameBindingSource
  • TableNameTableAdapter

де

  • префікс DataBaseName… – ім’я бази даних. У нашому випадку для бази даних Account формується ім’я accountDataSet;
  • префікс TableName… – ім’я таблиці в базі даних. У нашому випадку для таблиці Worker буде сформовано два об’єкти з іменами workerTableAdapter, workerBindingSource.

Велика частка робіт з налаштування та організації взаємодії з базою даних здійснюється саме з допомогою цих об’єктів. Основна ідея даної курсової роботи полягає у максимальному використанні можливостей цих об’єктів. Як буде показано нижче, не потрібно підключати простір імен System.Data.OleDb, тому що всю рутинну роботу бере на себе інтерфейс об’єктів Microsoft Visual Studio.

 

Виконання

1. Створення проекту

Запустити MS Visual Studio. Створити додаток за шаблоном Windows Forms Application. Детальний приклад створення додатку за шаблоном Windows Forms Application описується в темі:

Створення нового проекту здійснюється командою

File->New Project...

У вікні “New Project” задаються такі налаштування (рисунок 2):

  • в полі “Installed Templates” потрібно вибрати “Visual C#”;
  • у переліку шаблонів Visual C# вибирається Windows Forms Application;
  • у полі “Location:” потрібно вказати папку, в якій буде розміщуватись проект (з допомогою кнопки “Browse…”. Наприклад “D:\Programs\C_Sharp\Oblik01”;
  • у полі “Name:” потрібно вказати назву новостворюваного проекту. У нашому випадку це Oblik01.

MS Visual Studio. Вікно "New Project...". Шаблон Visual C#

Рис. 2. Вікно налаштувань при створенні проекту

Після вибору “OK” створиться нова форма додатку з іменем Form1.

 

2. Підключення бази даних “Account.mdb” до додатку

На цьому етапі потрібно скопіювати базу даних “Account.mdb” у папку, в якій розміщуються файли проекту. Архів з раніше створеним файлом бази даних можна завантажити тут.

У нашому випадку після копіювання файл бази даних може мати таке повне ім’я:

D:\Programs\Oblik01\Account.mdb

або

D:\Programs\Oblik01\Oblik01\Account.mdb

У даному випадку не будемо вдаватись в подробиці підключення файлу бази даних до додатку. Детальний приклад підключення бази даних Account.mdb до додатку наведено в темі:

Підключення файлу бази даних відбувається за принципом майстра. У покроковому процесі при виборі таблиць бази даних потрібно вибрати усі таблиці (Worker, Account) і перегляди (AccountQuery, AccountQueryCalc, QueryWorker).

Ім’я джерела даних залишається за замовчуванням – AccountDataSet.

Після підключення файлу бази даних до додатку вигляд вікна Server Explorer матиме вигляд як показано на рисунку 3.

Утиліта Server Explorer. Підключення бази даних Account.mdb

Рис. 3. Вікно утиліти Server Explorer після підключення бази даних Account.mdb

 

3. Проектування головної форми додатку

На даний момент є пуста форма додатку і підключення до бази даних Account.mdb. Ім’я форми за замовчуванням Form1.

 

3.1. Налаштування загальних властивостей головної форми Form1

Щоб налаштувати загальні властивості форми потрібно активувати (виділити) форму і у вікні Properties (клавіша F4) виконати відповідні дії. Налаштовуються такі властивості форми:

  • властивість Text = “Inventory accounting” (рисунок 4);
  • у вкладці Size властивість Width = 800;
  • у вкладці Size властивість Height =600;
  • властивість MaximizeBox = False. Кнопка переводу з розгорнутого у звичайний режим зникне.

MS Visual Studio - C#. Налаштування властивостей форми Form1

Рис. 4. Налаштування властивостей форми Form1

 

3.2. Проектування меню. Елемент управління MenuStrip

На цьому етапі проектується меню команд головної форми додатку. Щоб створити меню потрібно використати елемент управління MenuStrip. Після розміщення на формі створюється об’єкт menuStrip1, що відповідає головному меню (рисунок 5).

C# - Windows Forms. Елемент управління MenuStrip

Рис. 5. Елемент управління MenuStrip

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

У меню створюються такий перелік команд як показано на рисунках 6-7.

C# - Windows Forms. Перелік команд меню Worker

Рис. 6. Перелік команд меню Worker

Меню Worker містить команди додавання, видалення та редагування таблиці Worker.

C# - Windows Forms. Перелік команд меню Inventory

Рис. 7. Перелік команд меню Inventory

Меню Inventory містить команди додавання, видалення та редагування таблиці Account.

 

3.3. Розміщення елементів управління типу Label, Button, TextBox, DataGridView на формі

З панелі інструментів Toolbox вибрати і розмістити такі елементи управління:

  • три елементи управління типу Label для відображення інформаційних повідомлень. Автоматично буде створено три об’єкти з іменами label1, label2, label3;
  • шість елементів управління типу Button для швидкого виклику команд меню. Автоматично буде створено шість об’єктів з іменами button1, button2, button3, button4, button5, button6;
  • один елемент управління TextBox. Тут буде відображатись текст фільтру для виведення таблиці Worker. Створюється об’єкт з іменем textBox1;
  • два елементи управління типу DataGridView. Створюється два об’єкти з іменами dataGridView1, dataGridView2. Ці об’єкти призначені для відображення даних у таблицях Worker та Account.

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

C# - Windows Forms. Головна форма додатку

Рис. 8. Вигляд головної форми додатку після розміщення елементів управління

 

3.4. Налаштування елементу управління dataGridView1 що відповідає таблиці Worker (налаштування відображення таблиці Worker)
3.4.1. Підключення таблиці Worker бази даних

Підключення таблиці Worker до додатку відбувається стандартним способом. Таблиця Worker буде відображатись в елементі управління dataGridView1.

Для запуску процесу підключення потрібно спочатку активувати dataGridView1. Потім вибрати стрілку вправо як показано на рисунку 9. Відобразиться меню “DataGridView Tasks”.

C# - Windows Forms. Меню DataGridView Tasks елементу управління dataGridView1

Рис. 9. Меню DataGridView Tasks елементу управління dataGridView1

У меню “DataGridView Tasks” потрібно активувати спадне підменю “Choose Data Source:” і розкрити список джерел даних як показано на рисунку 10. У списку вибрати таблицю Worker.

C#. База даних. Вибір джерела даних AccountDataSet і таблиці Worker

Рис. 10. Вибір джерела даних AccountDataSet і таблиці Worker

Після вибору таблиці Worker вікно елементу управління dataGridView1 відобразить назви полів таблиці Worker (рисунок 11). Також створюється три об’єкти accountDataSet, workerBindingSource, workerTableAdapter для організації взаємодії з таблицею Worker бази даних та її відображення у dataGridView1.

Елемент управління dataGridView1. Таблиця Worker. Об’єкти accountDataSet, workerBindingSource, workerTableAdapter

Рис. 11. Вигляд dataGridView1 після вибору джерела даних (таблиця Worker). Об’єкти accountDataSet, workerBindingSource, workerTableAdapter

 

3.4.2. Елементи управління accountDataSet, workerBindingSource, workerTableAdapter

На рисунку 11 видно, що система створює три об’єкти accountDataSet, workerBindingSource, workerTableAdapter після вибору джерела даних. Джерелом даних є таблиця Worker. З допомогою цих об’єктів можна організовувати взаємодію з таблицею Worker бази даних (буде показано нижче).

Якщо тепер запустити додаток на виконання, то можна побачити, що дані таблиці Worker відображаються в dataGridView1.



 

3.4.3. Зміни в обробнику події Load головної форми. Текст методу Form1_Load()

Після вибору джерела даних в dataGridView1, змінюється код обробника події Form1_Load(), який викликається при завантаженні форми. Текст обробника події наступний:

private void Form1_Load(object sender, EventArgs e)
{
    // TODO: This line of code loads data into the 'accountDataSet.Worker' table. You can move, or remove it, as needed.
    this.workerTableAdapter.Fill(this.accountDataSet.Worker);
}

Викликається метод Fill() об’єкту workerTableAdapter. У подальшому цей метод буде використовуватись для відображення даних з таблиці Worker в елементі управління dataGridView1.

 

3.4.4. Налаштування вигляду стовпців елементу управління dataGridView1

На цьому кроці налаштовується зовнішній вигляд dataGridView1.

Система Microsoft Visual Studio дає досить широкий спектр можливостей для налаштування таблиці, що відображається у DataGridView. Можна налаштовувати такі основні візуальні елементи:

  • назви стовпців таблиці;
  • шрифт стовпців таблиці;
  • колір фону та тексту стовпців таблиці;
  • шрифт заголовків кожного стовпця таблиці;
  • колір фону та тексту заголовків таблиці;
  • способи вирівнювання у комірках таблиці;
  • способи вирівнювання у заголовках таблиці;
  • можливість відображення (приховування) заданих стовпців таблиці;
  • інші додаткові можливості.

У нашому випадку потрібно налаштувати такі загальні властивості dataGridView1:

  • властивість MultiSelect = False (заборонити виділення декількох рядків);
  • ReadOnly = True. Забороняється редагувати комірки dataGridView1 безпосередньо. Зміна значень в комірках буде відбуватись через спеціальні вікна (форми);
  • AllowUserToDeleteRows = False. Забороняється видаляти рядки клавішою Del;
  • SelectionMode = FullRowSelect. Виділяється цілий рядок, а не окрема комірка рядка.

 

3.4.4.1. Групове налаштування заголовків усіх стовпців. Властивість ColumnHeadersDefaultCellStyle

Групове налаштування параметрів заголовків усіх стовпців здійснюється з допомогою властивості ColumnHeaderDefaultCellStyle. Ця властивість використовується, якщо декілька стовпців таблиці мають однакові вимоги до оформлення (наприклад, шрифт, колір тексту, вирівнювання).

Якщо потрібно індивідуально налаштувати вигляд потрібних стовпців, тоді у MS Visual Studio використовується спеціальне вікно Edit Columns (див. наступний пункт).

Ця властивість дозволяє налаштувати за замовчуванням вигляд усіх заголовків стовпців у таблиці DataGridView (рисунок 12).

C# - Windows Forms. Властивість ColumnHeadersDefaultCellStyle

Рис. 12. Властивість ColumnHeadersDefaultCellStyle

Щоб налаштувати властивість ColumnHeadersDefauleCellStyle потрібно:

  • активувати елемент управління dataGridView1;
  • вибрати кнопку “…” навпроти властивості ColumnHeadersDefaultCellStyle (рисунок 12). У результаті відкриється стандартне вікно CellStyleBuilder (рисунок 13).

C# - Windows Forms. Вікно "CellStyle Builder". Налаштування комірок

Рис. 13. Вікно “CellStyle Builder”. Налаштування вигляду комірок

Для заголовку, у цьому вікні можна використовувати такі властивості:

  • BackColor – колір фону;
  • Font – шрифт тексту. При виборі кнопки “…” властивості відкривається стандартне вікно Windows для вибору потрібного шрифту;
  • ForeColor – колір шрифта;
  • Format – формат виведення цифрових значень. Пропонуються різні формати представлення чисел у комірках: NoFormatting, Numeric, Currency, DateTime, Scientific, Custom. У нашому випадку заголовки стовпців містять тільки текст, тому цю властивість змінювати не потрібно;
  • Alignment – вирівнювання тексту в комірці по горизонталі та вертикалі;
  • Padding – відступ у пікселах між текстом і рамкою, в якій цей текст вписується.

У нижній частині вікна є група Preview. У групі Preview можна переглядати поточне відображення комірок в режимі “на льоту”.

У нашому випадку потрібно налаштувати такі властивості ColumnHeadersDefaultCellStyle:

  • властивість Alignment = MiddleCenter;
  • властивість Font.Bold = true.

 

3.4.4.2. Задавання шаблону DefaultCellStyle для узагальненого відображення даних у стовпцях dataGridView1

Властивість DefaultCellStyle (рисунок 14) дозволяє задати загальні (спільні для усіх) налаштування для комірок (рядків) усіх стовпців таблиці, що відображаються у DataGridView. Якщо деякі рядки мають інші (відмінні) налаштування, то їх можна змінити в індивідуальному порядку (див. наступний пункт).

C#. Елемент управління DataGridView. Властивість DefaultCellStyle

Рис. 14. Виклик властивості DefaultCellStyle

Робота з налаштування властивості DefaultCellStyle така сама як з властивістю ColumnHeadersDefaultCellStyle, яка описується у попередньому пункті. Тому, розглядати цю властивість додатково не має змісту.

 

3.4.4.3. Налаштування вигляду заданого стовпця таблиці

Бувають випадки, коли стовпець таблиці має унікальні параметри відображення. У цьому випадку потрібно викликати спеціальне вікно “Edit Columns” для елементу управління DataGridView.

Щоб викликати вікно “Edit Columns” потрібно виконати такі дії (рисунок 15):

  • активувати елемент управління dataGridView1. Відкриється контекстне меню;
  • у контекстному меню вибрати команду “Edit Columns…”.

C#. Елемент управління DataGridView. Команда Edit Columns...

Рис. 15. Виклик вікна Edit Columns

Після виклику вікно “Edit Columns” має вигляд, як показано на рисунку 16.

C# - DataGridView. Вікно "Edit Columns"

Рис. 16. Вікно налаштування кожного стовпця окремо

У списку “Selected Column:” (ліва частина вікна) відображається список полів таблиці, що відображається у dataGridView1. У списку “Bound Column Properties” для кожного вибраного поля відображається перелік доступних властивостей та їх значень.

За замовчуванням, для усіх стовпців (полів) таблиці встановлюються значення, що були налаштовані у властивості ColumnHeadersDefaultCellStyle (див. попередній пункт). У вікні “Edit Columns” налаштовуються тільки ті параметри заголовку стовпця, які є унікальними.

Для кожного стовпця вікно “Edit Columns” пропонує такі основні властивості:

  • DefaultCellStyle – задає основні параметри для комірок (рядків) стовпця (шрифт, колір фону, вирівнювання). Для налаштування даної властивості викликається спеціальне вікно CellStyle Builder, робота з яким детально описується в попередньому пункті.
  • HeaderText – текст заголовку, що буде відображатись у таблиці;
  • Visible – визначає, чи відображається стовпець у DataGridView;
  • MaxInputLength – максимальна кількість символів, які можна ввести у комірках (рядках) стовпця;
  • ReadOnly – визначає, чи можна безпосередньо редагувати значення комірок у DataGridView;
  • Resizeable – визначає, чи можна змінювати ширину колонки безпосередньо в DataGridView (з допомогою “мишки”);
  • Name – ім’я об’єкту (змінної), що відповідає даному стовпцю. Це ім’я використовується у програмному коді;
  • ColumnType – тип колонки. Система MS Visual Studio пропонує різні типи представлення стовпців. Найбільш поширеним є представлення комірок стовпця у вигляді рядків вводу TextBoxDataGridViewTextBoxColumn;
  • AutoSizeMode – визначає, чи змінюється (розширюється) ширина стовпця, якщо текст у рядку стовпця (у пікселах) має більшу ширину ніж задано у властивості Width. Наприклад, властивість є корисною, якщо потрібно повністю відобразити текст у стовпці без його урізання;
  • DividerWidth – додаткова ширина межі (в пікселах) між заданим стовпцем і стовпцем, що відображається з правої сторони від даного.
  • MinimumWidth – мінімально допустима ширина стовпця у пікселах;
  • Width – ширина стовпця у пікселах.

У нашому випадку потрібно встановити значення таких властивостей:

  • у стовпці ID_Worker властивість Visible = False (далі ID_Worker.Visible). Оскільки поле ID_Worker використовується для зв’язування таблиць, то відображати його не має сенсу;
  • у стовпці WName властивість HeaderText = “Name of worker”;
  • у стовпці WName властивість AutoSizeMode = AllCells. Тепер ширина стовпця WName буде підлаштовуватись під ширину рядка, який має максимальну ширину (в пікселах) серед усіх рядків;
  • у стовпці WPosition властивість HeaderText = “Position”;
  • у стовпці WPosition властивість AutoSizeMode = AllCells;
  • у стовпці WSex властивість HeaderText = “M/F”;
  • у стовпці WSex властивість AutoSizeMode = AllCells;
  • у стовпці WSex властивість DefaultCellStyle.Alignment = MiddleCenter.

 

3.5. Налаштування елементу управління dataGridView2, що відповідає таблиці Account (налаштування відображення таблиці Account)
3.5.1. Зв’язування таблиці Account з dataGridView2

Зв’язування таблиці Account з dataGridView2 здійснюється так само як і для таблиці Worker, що описується в п. 3.4.1. Потрібно спочатку активувати dataGridView2. Потім вибрати стрілку вправо. У вікні “DataGridView Tasks” в полі “Choose Data Source:” потрібно вибрати

Other Data Sources -> Project Data Sources -> AccountDataSet -> Account

як показано на рисунку 17.

C# - Windows Forms. Елемент управління DataGridView. Вибір таблиці

Рис. 17. Вибір таблиці Account у вікні DataGridView Tasks

Після вибору таблиці Account, поля цієї таблиці відобразяться у вікні dataGridView2. Так само створюється два нових об’єкти accountBindingSource та accountTableAdapter (рисунок 18).

C# - Windows Forms. Вікно форми після підключення таблиці Account до dataGridView2

Рис. 18. Вигляд вікна форми після підключення таблиці Account до dataGridView2

 

3.5.2. Об’єкти accountDataSet, accountBindingSource, accountTableAdapter

Як і у випадку з таблицею Worker (див. п. 3.4.1), Після вибору таблиці Account в якості джерела даних створюється ще два об’єкти (рисунок 18):

  • accountBindingSource – зв’язує безпосередньо таблицю бази даних з набором даних AccountDataSet (тут Account – назва бази даних а не таблиці);
  • accountTableAdapter – використовується для безпосереднього програмного управління даними в таблиці (додавання рядків, стовпців тощо).

Об’єкт accountDataSet є спільним для об’єктів таблиць Worker та Account: workerBindingSource, workerTableAdapter, accountBindingSource, accountTableAdapter. Можливий також варіант, коли для таблиць створюються різні об’єкти типу DataSet.

 

3.5.3. Зміни в обробнику події Load головної форми. Текст методу Form1_Load()

Після зв’язування таблиці Account з dataGridView2 у тексті обробника події Form_Load() додається ще один метод Fill().

Загальний вигляд обробника події на даний момент наступний:

private void Form1_Load(object sender, EventArgs e)
{
    // TODO: This line of code loads data into the 'accountDataSet.Account' table. You can move, or remove it, as needed.
    this.accountTableAdapter.Fill(this.accountDataSet.Account);

    // TODO: This line of code loads data into the 'accountDataSet.Worker' table. You can move, or remove it, as needed.
    this.workerTableAdapter.Fill(this.accountDataSet.Worker);
}

 

3.5.4. Налаштування вигляду стовпців dataGridView2 (таблиця Account)

У нашому випадку потрібно налаштувати такі загальні властивості dataGridView2:

  • властивість MultiSelect = False (заборонити виділення декількох рядків);
  • ReadOnly = True. Забороняється редагувати комірки dataGridView2 безпосередньо. Зміна значень в комірках буде відбуватись через спеціальні вікна (форми);
  • AllowUserToDeleteRows = False. Забороняється видаляти рядки клавішою Del;
  • SelectionMode = FullRowSelect. Виділяється цілий рядок, а не окрема комірка рядка.

 

3.5.4.1. Групове налаштування заголовків усіх стовпців. Властивість ColumnHeadersDefaultCellStyle

З допомогою властивості ColumnHeadersDefaultCellStyle налаштовується загальний вигляд стовпців за замовчуванням. Більш детально ця властивість описується в п. 3.4.4.1.

Для ColumnHeadersDefaultCellStyle потрібно налаштувати такі внутрішні властивості:

  • властивість Alignment = MiddleCenter;
  • властивість Bold = True.
3.5.4.2. Задавання узагальненого відображення даних у стовпцях dataGridView2 (властивість DefaultCellStyle)

У п. 3.4.4.2 детально описуються особливості використання властивості DefaultCellStyle елементу управління dataGridView2.

Для таблиці Account потрібно встановити наступні властивості:

  • властивість Alignment = MiddleCenter.

 

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

Налаштування зовнішнього вигляду стовпців dataGridView2 здійснюється так само, як і dataGridView1. Для цього, у режимі проектування, потрібно викликати команду “Edit Columns…” з контекстного меню dataGridView2 (див. п. 3.4.3.3.). Налаштовуються властивості наступних полів:

  • у полі ID_Account властивість Visible = False (приховати поле);
  • у полі ID_Worker властивість Visible = False;
  • у полі ANum властивість HeaderText = “Number”;
  • у полі ANum властивість DefaultCellStyle.Alignment = MiddleCenter;
  •  у полі ANum властивість AutoSizeMode = AllCells;
  • у полі ADate властивість HeaderText = “Date”;
  • у полі ADate властивість DefaultCellStyle.Alignment = MiddleCenter;
  • у полі ADate властивість AutoSizeMode = AllCells;
  • у полі AInvNum властивість HeaderText = “Inv. Number”;
  • у полі AInvNum властивість DefaultCellStyle.Alignment = MiddleCenter;
  • у полі AInvNum властивість AutoSizeMode = AllCells;
  • у полі AObjName властивість HeaderText = “Object name”;
  • у полі AObjName властивість DefaultCellStyle.Alignment = MiddleLeft;
  • у полі AObjName властивість AutoSizeMode = AllCells;
  • у полі ACount властивість HeaderText = “Count”;
  • у полі ACount властивість DefaultCellStyle.Alignment = MiddleCenter;
  • у полі ACount властивість AutoSizeMode = AllCells;
  • у полі APrice властивість HeaderText = “Price”;
  • у полі APrice властивість DefaultCellStyle.Alignment = MiddleRight;
  • у полі APrice властивість AutoSizeMode = AllCells.

 

3.6. Створення розрахункового поля “Sum” (Сума) в таблицю Account

Окремим пунктом у даній темі виділено додавання розрахункового поля.

Розрахункове поле “Sum” в таблиці Account можна додавати різними способами. Наприклад, можна створити це поле засобами Microsoft Access і створити перегляд (View). Тут описується один з можливих способів.

Результат поля Sum є добуток полів ACount та APrice.

 

3.6.1. Додавання розрахункового поля Sum в файл AccountDataSet.xsd

Файл AccountDataSet.xsd відображає таблиці (перегляди, збережені процедури та інше) бази даних Account, які підключені до набору даних accountDataSet. Фактично, розрахункове поле створюється у цьому файлі.

Щоб створити розрахункове поле у таблиці Account, потрібно виконати таку послідовність дій:

  • у режимі “Form1.cs [Design]” зробити клік правою кнопкою “мишки” на об’єкті accountTableAdapter. У результаті відкриється контекстне меню (рисунок 19);

C# - Windows Forms. Контекстне меню адаптера даних accountTableAdapter

Рис. 19. Контекстне меню адаптера даних accountTableAdapter

  • У контекстному меню вибрати команду “Edit Queries in DataSet Designer…”. Відкриється вікно, що відображає вміст файлу “AccountDataSet1.xsd” (рис. 20);

C#. База даних MS Access. Відображення таблиці Account у файлі AccountDataSet.xsd

Рис. 20. Відображення таблиці Account у файлі AccountDataSet.xsd

  • викликати контекстне меню для таблиці Account (рисунок 21). У меню вибрати команду Add->Column. У результаті буде створене нове поле з іменем DataColumn1.

C# - Windows Forms. Виклик команди додавання нового стовпця

Рис. 21. Виклик команди додавання нового стовпця

  • Виділити поле DataColumn1 і у вікні Properties встановити властивість Name = “Sum” (рисунок 22). Зміни зафіксуються у таблиці Account;

C#. База даних Microsoft Access. Розрахункове поле. Властивість Name

Рис. 22. Задавання властивості Name для розрахункового поля

Встановити властивість Expression у значення “ACount*APrice” (рисунок 23). Зберегти і закрити файл AccountDataSet1.xsd;

C# - MS Access. Властивість Expression додаткового поля Sum

Рис. 23. Властивість Expression додаткового поля Sum

  • встановити властивість DataType = System.Double (рисунок 24). Це необхідно для зручного відображення результатів добутку, що закінчуються нулем. Тобто, число 2.3 буде відображатись як 2.30.

C# - база даних Microsoft Access. Властивість DataType

Рис. 24. Властивість DataType

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

 

3.6.2. Підключення новоствореного поля Sum в dataGridView2

Наступним кроком потрібно підключити створене розрахункове поле Sum у перелік полів dataGridView2 для його відображення.

Щоб відобразити поле Sum у dataGridView1 потрібно виконати такі кроки:

  • Перейти у режим проектування форми “Form1.cs [Design]”. Зробити клік правою кнопкою мишки на елементі управління dataGridView2. У контекстному меню вибрати команду “Edit Columns…” (рисунок 25). У результаті відкриється вікно “Edit Columns”;

C# - Windows Forms. Контекстне меню dataGridView2. Команда "Edit Columns..."

Рис. 25. Контекстне меню dataGridView2. Виклик команди “Edit Columns…”

  • У вікні Edit Columns вибрати команду “Add…” (рисунок 26). Відкриється вікно “Add Column”.

C# - Windows Forms. Вікно "Edit Columns". Команда "Add..."

Рис. 26. Вікно “Edit Columns”. Команда “Add…”

  • у вікні “Add Column” в списку “Databound column” вибрати поле “Sum” (рисунок 27). Також можна змінити поле “Header text:”. Після вибору кнопки “Add…” відбудеться перехід у попереднє вікно Edit Columns;

C# - елемент управління DataGridView. Вікно "Add Column". Вибір поля Sum

Рис. 27. Вікно “Add Column”. Вибір поля Sum для відображення у dataGridView2

  • у вікні “Edit Columns” поле Sum може знаходитись не на своїй позиції. Тому, його позицію в таблиці треба поправити з допомогою кнопок стрілок вверх та вниз (рисунок 28).

C#. Елемент управління DataGridView. Розрахункове поле Sum у вікні "Edit Columns"

Рис. 28. Остаточне формування розрахункового поля Sum у вікні “Edit Columns”

Формування розрахункового поля засобами MS Visual Studio завершено.

 

3.6.3. Налаштування відображення розрахункового поля “Sum” з точністю 2 знаки після коми

На даний момент розрахункове поле Sum відображається у довільному форматі. Зручно мати відображення цього поля з точністю 2 знаки після коми. Щоб зробити це, потрібно виконати наступні кроки:

  • викликати контекстне меню елементу управління DataGridView2. У меню вибрати команду “Edit Columns…”. У результаті відкриється вікно “Edit Columns”;
  • у вікні “Edit Columns” активувати (виділити) поле “Sum” (рисунок 29). У переліку властивостей вибрати “…” напроти властивості DefaultCellStyle. Відкриється вікно “CellStyle Builder”;

C# - DataGridView. Вікно редагування властивостей комірки у полі "Sum"

Рис. 29. Виклик вікна редагування властивостей комірки у полі “Sum”

  • у вікні “CellStyle Builder” вибрати властивість Format (рисунок 30). Відкриється вікно “Format String Dialog”;

C#. Елемент управління DataGridView. Вікно CellStyleBuilder. Властивість Format

Рис. 30. Вікно CellStyleBuilder. Властивість Format

  • у вікні “Format String Dialog” пропонується декілька відомих форматів для відображення грошових величин. У полі “Format type:” потрібно вибрати тип формату Numeric. Значення “Decimal places” = 2 (рисунок 31).

C#. Елемент управління DataGridView. Вікно "Format String Dialog"

Рис. 31. Вікно “Format String Dialog”

Після вибору на OK відбудеться перехід до попереднього вікна CellStyleBuilder. У цьому вікні можна поправити властивість Alignment у значення MiddleRight.

Останнім кроком потрібно підтвердити на OK в усіх наступних вікнах. Після цього, розрахункове поле “Sum” буде відображатись з точністю 2 знаки після коми.

 

3.7. Налаштування властивостей елементів управління Label, Button, TextBox

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

  • у label1 властивість Text = “Worker” (в подальшому label1.Text);
  • label2.Text = “Filter:”;
  • label3.Text = “Account”;
  • button1.Text = “Add…”;
  • button2.Text = “Delete”;
  • button3.Text = “Edit…”;
  • button4.Text = “Add record…”;
  • button5.Text = “Delete record”;
  • button6.Text = “Edit record…”;
  • textBox1.Text = “”.

 

3.8. Загальний вигляд форми “Form1.cs” після проведення налаштувань

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

C# - Windows Forms. Вигляд форми додатку після налаштувань

Рис. 32. Вигляд форми додатку після налаштувань

 

4. Проектування додаткових форм

4.1. Проектування форми “FormAddWorker.cs” додавання нового працівника

На цьому кроці проектується форма додавання інформації про нового працівника.

Щоб додати нову форму, потрібно використати команду

Project -> Add Windows Form...

Відкриється вікно, у якому потрібно вказати ім’я файлу форми (рисунок 33). У нашому випадку задається ім’я “FormAddWorker.cs”.

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

C# - Windows Forms. Додавання нової форми FormAddWorker.cs до додатку

Рис. 33. Додавання нової форми FormAddWorker.cs до додатку

Потрібно розмістити такі елементи управління (рисунок 34):

  • три елементи управління типу Label. Створюються об’єкти з іменами label1, label2, label3;
  • два елементи управління типу Button. Створюються об’єкти з іменами button1, button2;
  • один елемент управління типу ComboBox. Створюється об’єкт з іменем comboBox1;
  • два елементи управління типу TextBox. Створюються об’єкти з іменами textBox1, textBox2.

C# - Windows Forms. Форма "FormAddWorker.cs"

Рис. 34. Форма “FormAddWorker.cs”

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

  • у формі властивість Text = “Add worker” (далі FormAddWorker.Text);
  • FormAddWorker.ControlBox = False;
  • FormAddWorker.StartPosition = CenterScreen;
  • FormAddWorker.FormBorderStyle = FixedDialog;
  • в елементі управління label1 властивість Text = “Name of worker” (label1.Text);
  • label2.Text = “Position”;
  • label3.Text = “M/F”;
  • button1.Text = “Add”;
  • button2.Text = “Cancel”;
  • button1.DialogResult = OK;
  • button2.DialogResult = Cancel;
  • textBox1.Modifiers = Public. Елемент управління textBox1 стає доступним з інших форм і методів;
  • textBox2.Modifiers = Public;
  • comboBox1.Modifiers = Public.

В елементі управління comboBox1 потрібно у властивість Items занести рядки, як показано на рисунку 35.

C# - Windows Forms. Властивість Items елементу управління comboBox1

Рис. 35. Властивість Items елементу управління comboBox1

Після проектування вікно форми FormAddWorker показано на рисунку 36.

C# - Windows Forms. Форма FormAddWorker

Рис. 36. Форма FormAddWorker

 

4.2. Проектування форми “FormDelWorker.cs” видалення працівника

За зразком проектування попередньої форми (пункт 4.1) проектується форма видалення працівника яка розміщується у файлі FormDelWorker.cs.

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

  • два елементи управління типу Label. Створюється два об’єкти з іменами label1, label2;
  • два елементи управління типу Button. Створюється два об’єкти з іменами button1, button2

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

  • FormDelWorker.Text = “Delete worker”;
  • FormDelWorker.FormBorderStyle = FixedDialog;
  • FormDelWorker.StartPosition = CenterScreen;
  • FormDelWorker.ControlBox = False;
  • label1.Text = “Delete worker. Are you sure?”;
  • label2.Modifiers = Public. Цей елемент управління буде видимий з головної форми і буде формуватись з неї;
  • button1.Text = “OK”;
  • button1.DialogResult = OK;
  • button2.Text = “Cancel”;
  • button2.DialogResult = Cancel.

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

C# - Windows Forms. Форма FormDelWorker.cs

Рис. 37. Форма FormDelWorker.cs

 

4.3. Проектування форми “FormEditWorker.cs” редагування інформації про працівника

Форма FormEditWorker.cs призначена для редагування інформації про працівника і буде викликатись командою

Worker->Edit...

Форма FormEditWorker.cs створюється так само як і попередні форми. На формі розміщуються такі елементи управління:

  • три елементи управління типу Label. Створюються об’єкти з іменами label1, label2, label3;
  • два елементи управління типу Button. Створюються об’єкти з іменами button1, button2;
  • один елемент управління типу ComboBox. Створюється об’єкт з іменем comboBox1;
  • два елементи управління типу TextBox. Створюються об’єкти з іменами textBox1, textBox2.

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

  • FormEditWorker.Text = “Edit worker”;
  • FormEditWorker.FormBorderStyle = FixedDialog;
  • FormEditWorker.StartPosition = CenterScreen;
  • FormEditWorker.ControlBox = False;
  • label1.Text = “Name of worker”;
  • label2.Text = “Position”;
  • label3.Text = “M/F”;
  • textBox1.Modifiers = Public;
  • textBox2.Modifiers = Public;
  • comboBox1.Modifiers = Public;
  • comboBox1.Items = { “M”, “F” };
  • button1.Text = “Edit”;
  • button2.Text = “Cancel”;
  • button1.DialogResult = OK;
  • button2.DialogResult = Cancel.

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

C# - Windows Forms. Вікно редагування інформації про працівника

Рис. 38. Вікно редагування інформації про працівника

 

4.4. Проектування форми “FormAddAccount.cs” додавання матеріального засобу

Форма FormAddAccount.cs призначена для додавання рядка матеріального засобу. На формі розміщуються такі елементи управління:

  • 6 елементів управління типу Label. Створюються об’єкти label1, label2, label3, label4, label5, label6;
  • 6 елементів управління типу TextBox. Створюються об’єкти textBox1, textBox2, textBox3, textBox4, textBox5, textBox6;
  • 2 елементи управління типу Button. Створюються об’єкти button1, button2.

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

  • FormAddAccount.Text = “Add Inventory”;
  • FormAddAccount.FormBorderStyle = FixedDialog;
  • FormAddAccount.ControlBox = False;
  • FormAddAccount.StartPosition = CenterScreen;
  • label1.Text = “Number”;
  • label2.Text = “Date”;
  • label3.Text = “Inventory number”;
  • label4.Text = “Object name”;
  • label5.Text = “Count”;
  • label6.Text = “Price”;
  • button1.Text = “Add”;
  • button1.DialogResult = OK;
  • button2.Text = “Cancel”;
  • button2.DialogResult = Cancel;
  • textBox1.Modifiers = Public;
  • textBox2.Modifiers = Public;
  • textBox3.Modifiers = Public;
  • textBox4.Modifiers = Public;
  • textBox5.Modifiers = Public;
  • textBox6.Modifiers = Public.

На рисунку 39 зображено вікно форми FormAddAccount.cs після налаштування.

C# - Windows Forms. Вікно FormAddAccount.cs після налаштування

Рис. 39. Вікно FormAddAccount.cs після налаштування

 

4.5. Проектування форми “FormDelAccount.cs” видалення рядка матеріального засобу

Форма FormDelAccount.cs є вікно запиту-підтвердження видалення рядка матеріального засобу.

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

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

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

  • FormDelAccount.Text = “Delete Inventory”;
  • FormDelAccount.FormBorderStyle = FixedDialog;
  • FormDelAccount.ControlBox = False;
  • FormDelAccount.StartPosition = CenterScreen;
  • label1.Text = “Are you sure you want to delete?”;
  • label2.Modifiers = Public. Цей рядок буде змінюватись у головній формі, тому має бути видимим ззовні;
  • button1.Text = “Delete”;
  • button1.DialogResult = OK;
  • button2.Text = “Cancel”;
  • button2.DialogResult = Cancel.

На рисунку 40 відображено загальний вигляд форми

C# - Windows Forms. Загальний вигляд форми FormDelAccount

Рис. 40. Загальний вигляд форми FormDelAccount

 

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

Форма FormEditAccount.cs призначена для редагування інформації поточного рядка таблиці Account. На формі розміщуються такі елементи управління:

  • 6 елементів управління типу Label: label1, label2, label3, label4, label5, label6;
  • 6 елементів управління типу TextBox: textBox1, textBox2, textBox3, textBox4, textBox5, textBox6;
  • 2 елементи управління типу Button: button1, button2.

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

  • FormEditAccount.Text = “Edit Inventory”;
  • FormEditAccount.FormBorderStyle = FixedDialog;
  • FormEditAccount.ControlBox = False;
  • FormEditAccount.StartPosition = CenterScreen;
  • label1.Text = “Number”;
  • label2.Text = “Date”;
  • label3.Text = “Inventory number”;
  • label4.Text = “Object name”;
  • label5.Text = “Count”;
  • label6.Text = “Price”;
  • button1.Text = “Add”;
  • button1.DialogResult = OK;
  • button2.Text = “Cancel”;
  • button2.DialogResult = Cancel;
  • textBox1.Modifiers = Public;
  • textBox2.Modifiers = Public;
  • textBox3.Modifiers = Public;
  • textBox4.Modifiers = Public;
  • textBox5.Modifiers = Public;
  • textBox6.Modifiers = Public.

Після налаштування вигляд форми FormEditAccount.cs зображено на рисунку 41.

C# - Windows Forms. Форма FormEditAccount.cs

Рис. 41. Форма FormEditAccount.cs

 

5. Реалізація програмного коду

Залишається тільки написати програмний код обробників подій.

5.1. Програмування обробників подій головної форми Form1
5.1.1. Програмування подій Click та CellEnter елементу управління dataGridView1. Властивість Filter. Врахування зв’язку між таблицями при їх відображенні

На даний момент відображаються усі дані таблиць Worker та Account. Однак, у нашому випадку, потрібно відкорегувати відображення даних у таблицях за наступною вимогою.

Якщо в таблиці Worker вибрати працівника, то таблиця Account має відображати дані, що стосуються тільки цього працівника. Як відомо, таблиці Worker та Account є зв’язані між собою за полем ID_Worker. Це означає, що таблиця Account повинна відображати дані, що відповідають значенню ID_Worker активного (виділеного) рядка таблиці Worker.

У нашому випадку потрібно запрограмувати дві події для елементу управління dataGridView1:

  • подію Click (рисунок 43). Ця подія генерується, коли користувач зробив клік на деякому рядку;
  • подію CellEnter (рисунок 44). Ця подія генерується, коли рядок таблиці отримує фокус введення.

C# - Windows Forms. Подія Click елементу управління dataGridView1

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

C# - Windows Forms. Подія CellEnter елементу управління dataGridView1

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

У даній темі процес програмування обробника події опускається. Детальний приклад програмування події описується в темі:

Текст обробників подій наступний:

private void dataGridView1_Click(object sender, EventArgs e)
{
    // створити фільтр, який виведе в dataGridView2 те що потрібно
    int id;
    int index;

    index = dataGridView1.CurrentRow.Index;

    // взяти значення id = Worker.ID_Worker
    id = (int)dataGridView1.Rows[index].Cells[0].Value;
    accountBindingSource.Filter = "ID_Worker = " + id.ToString();
}

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    // створити фільтр, який виведе в dataGridView2 те що потрібно
    int id;
    int index;

    index = dataGridView1.CurrentRow.Index;

    // взяти значення id = Worker.ID_Worker
    id = (int)dataGridView1.Rows[index].Cells[0].Value;
    accountBindingSource.Filter = "ID_Worker = " + id.ToString();
}

Як видно з вищенаведеного коду, текст обробників подій однаковий. Важливим тут є поле Filter об’єкту accountBindingSource, що був створений системою при підключенні до таблиці Account. Це поле, є, фактично, фрагментом умови у запиті на мові SQL. На мові SQL умова визначається ключовим словом WHERE.

Наприклад, якщо у Filter вказати

ID_Worker = 5

то цей рядок буде перетворений у фрагмент SQL-коду

WHERE ID_Worker = 5

 

5.1.2. Тестовий запуск програми на виконання. Текст програми

Тепер можна запустити додаток і перевірити його роботу. При зміні рядка в таблиці Worker автоматично виводяться зв’язані з цим рядком дані таблиці Account. Як відомо, дані зв’язані полем ID_Worker.

На даний момент, текст модуля 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 Oblik01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'accountDataSet.Account' table. You can move, or remove it, as needed.
            this.accountTableAdapter.Fill(this.accountDataSet.Account);

            // TODO: This line of code loads data into the 'accountDataSet.Worker' table. You can move, or remove it, as needed.
            this.workerTableAdapter.Fill(this.accountDataSet.Worker);
        }

        private void dataGridView1_Click(object sender, EventArgs e)
        {
            // створити фільтр, який виведе в dataGridView2 те що потрібно
            int id;
            int index;

            index = dataGridView1.CurrentRow.Index;
            // взяти значення id = Worker.ID_Worker
            id = (int)dataGridView1.Rows[index].Cells[0].Value; // працює
            accountBindingSource.Filter = "ID_Worker = " + id.ToString();
        }

        private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            // створити фільтр, який виведе в dataGridView2 те що потрібно
            int id;
            int index;

            index = dataGridView1.CurrentRow.Index;

            // взяти значення id = Worker.ID_Worker
        id = (int)dataGridView1.Rows[index].Cells[0].Value; // працює
        accountBindingSource.Filter = "ID_Worker = " + id.ToString();
        }
    }
}

 

5.1.3. Програмування команди “Worker” => “Add…”

Якщо користувач вибрав команду “Add…” з меню Worker, то повинно викликатись вікно FormAddWorker.cs. У цьому вікні вводяться дані нового працівника.

Текст обробника події Click вибору команди меню “Worker” => “Add…” має такий вигляд:

C# - Windows Forms. Подія Click команди меню "Worker" => "Add..."

Рис. 45. Подія Click команди меню “Worker” => “Add…”

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

private void addToolStripMenuItem_Click(object sender, EventArgs e)
{
    FormAddWorker f = new FormAddWorker(); // створити форму

    if (f.ShowDialog() == DialogResult.OK) // відобразити форму
    {
        // якщо OK, то додати працівника
        string WName, WPosition, WSex;

        WName = f.textBox1.Text;
        WPosition = f.textBox2.Text;
        WSex = f.comboBox1.Items[f.comboBox1.SelectedIndex].ToString();

        // працює
        this.workerTableAdapter.Insert(WName, WPosition, WSex); // вставка
        this.workerTableAdapter.Fill(this.accountDataSet.Worker); // відображення
    }
}

У вищенаведеному коді викликається вікно FormAddWorker, яке було спроектоване у п. 4.1. Потім з цього вікна заповнюються внутрішні змінні WName, WPosition, WSex.

В майбутньому, уся робота зі зміни даних в таблиці Worker буде здійснюватись з об’єктом workerTableAdapter, що був створений системою при підключенні до бази даних.

Вставка рядка здійснюється методом Insert() об’єкта workerTableAdapter. Цей метод формується системою програмно при підключенні таблиці Worker. У методі програмно формуються параметри, що відповідають полям таблиці Worker. Це є дуже зручно.

Метод Fill() фіксує зміни в базі даних.

 

5.1.4. Програмування команди “Worker” => “Delete”

При виклику команди Delete з меню Worker викликається форма підтвердження FormDelWorker. Текст обробника події команди Delete наступний

private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
    // Worker => Delete
    FormDelWorker f = new FormDelWorker(); // створити форму
    int id_worker;
    string WName, WPosition, WSex;
    int index;

    // взяти номер поточного (виділеного) рядка в dataGridView1
    index = dataGridView1.CurrentRow.Index;

    // заповнити внутрішні змінні з поточного рядка dataGridView1
    id_worker = Convert.ToInt32(dataGridView1[0, index].Value);
    WName = Convert.ToString(dataGridView1[1, index].Value);
    WPosition = Convert.ToString(dataGridView1[2, index].Value);
    WSex = Convert.ToString(dataGridView1[3, index].Value);

    // сформувати інформаційний рядок
    f.label2.Text = WName + " " + WPosition;

    if (f.ShowDialog() == DialogResult.OK)
    {
        workerTableAdapter.Delete(id_worker, WName, WPosition, WSex); // метод Delete
        this.workerTableAdapter.Fill(this.accountDataSet.Worker);
    }
}

У цьому обробнику важливим є метод Delete() об’єкту workerTableAdapter. У цьому методі потрібно вказати значення полів рядка, що видаляється.

 

5.1.5. Програмування команди “Worker” => “Edit…”

Редагування працівника здійснюється у формі FormEditWorker.cs (див. п. 4.3) командою “Edit…” меню Worker. Текст обробника події вибору команди

private void editToolStripMenuItem_Click(object sender, EventArgs e)
{
    // Worker => Edit...
    FormEditWorker f = new FormEditWorker(); // створити форму
    int index;
    string WName, WPosition, WSex;
    int id_worker;

    if (dataGridView1.RowCount <= 1) return;

    // отримати позицію виділеного рядка в dataGridView1
    index = dataGridView1.CurrentRow.Index;

    if (index == dataGridView1.RowCount - 1) return; //

    // отримати дані рядка
    id_worker = (int)dataGridView1.Rows[index].Cells[0].Value;
    WName = (string)dataGridView1.Rows[index].Cells[1].Value;
    WPosition = (string)dataGridView1.Rows[index].Cells[2].Value;
    WSex = (string)dataGridView1.Rows[index].Cells[3].Value;

    // заповнити поля форми f
    f.textBox1.Text = WName;
    f.textBox2.Text = WPosition;

    if (WSex == "M") f.comboBox1.SelectedIndex = 0;
    else f.comboBox1.SelectedIndex = 1;

    if (f.ShowDialog() == DialogResult.OK) // викликати форму FormEditWorker
    {
        string nWName, nWPosition, nWSex;

        // отримати нові (змінені) значення з форми
        nWName = f.textBox1.Text;
        nWPosition = f.textBox2.Text;
        nWSex = f.comboBox1.Items[f.comboBox1.SelectedIndex].ToString();

        // змінити в адаптері
        this.workerTableAdapter.Update(nWName, nWPosition, nWSex, id_worker, WName, WPosition, WSex);
        this.workerTableAdapter.Fill(this.accountDataSet.Worker);
    }
}

Фактичні зміни в таблиці здійснює метод Update() адаптера даних workerTableAdapter. Цей метод отримує старі та нові значення рядка таблиці Worker, що змінюється.

 

5.1.6. Програмування команди “Inventory” => “Add…”

За зразком команди Worker => “Add…” реалізується програмний код команди “Inventory” => “Add…”. Текст обробника події наступний:

private void addToolStripMenuItem1_Click(object sender, EventArgs e)
{
    // Inventory => Add...
    FormAddAccount f = new FormAddAccount(); // вікно

    if (f.ShowDialog() == DialogResult.OK)
    {
        int Id_Worker;
        int index;
        string ANum, ADate, AInvNum, AObjName;
        short ACount;
        double APrice;

        // взяти значення ID_Worker з таблиці Worker
        index = dataGridView1.CurrentRow.Index; // позиція в dataGridView1
        Id_Worker = (int)dataGridView1.Rows[index].Cells[0].Value;

        // взяти значення інших полів з форми FormAddAccount
        ANum = f.textBox1.Text;
        ADate = f.textBox2.Text;
        AInvNum = f.textBox3.Text;
        AObjName = f.textBox4.Text;
        ACount = Convert.ToInt16(f.textBox5.Text);
        APrice = Convert.ToDouble(f.textBox6.Text);

        this.accountTableAdapter.Insert(Id_Worker, ANum, ADate, AInvNum, AObjName, ACount, APrice);
        this.accountTableAdapter.Fill(this.accountDataSet.Account);
    }
}

Метод Insert() об’єкту accountTableAdapter отримує вхідними параметрами значення полів таблиці Account.

 

5.1.7. Програмування команди “Inventory” => “Delete”

Текст обробника події вибору команди Delete з меню Inventory:

private void deleteToolStripMenuItem1_Click(object sender, EventArgs e)
{
    // Inventory => Delete
    FormDelAccount f = new FormDelAccount();
    int id_account, id_worker;
    string ANum, ADate, AInvNum, AObjName;
    short ACount;
    double APrice;
    int index;

    // взяти індекс виділеного (поточного) рядка в dataGridView2
    index = dataGridView2.CurrentRow.Index;

    // взяти значення полів рядка з номером index
    id_account = Convert.ToInt32(dataGridView2[0, index].Value);
    id_worker = Convert.ToInt32(dataGridView2[1, index].Value);
    ANum = Convert.ToString(dataGridView2[2, index].Value);
    ADate = Convert.ToString(dataGridView2[3, index].Value);
    AInvNum = Convert.ToString(dataGridView2[4, index].Value);
    AObjName = Convert.ToString(dataGridView2[5, index].Value);
    ACount = Convert.ToInt16(dataGridView2[6, index].Value);
    APrice = Convert.ToDouble(dataGridView2[7, index].Value);

    // сформувати інформаційний рядок у вікні FormDelAccount
    f.label2.Text = ANum + " / " + ADate + " / " + AInvNum + " / " +
    AObjName + " / " + ACount + " / " + APrice;

    if (f.ShowDialog() == DialogResult.OK) // вивести вікно
    {
        this.accountTableAdapter.Delete(id_account, id_worker,
        ANum, ADate, AInvNum, AObjName, ACount, APrice); // видалити рядок
        this.accountTableAdapter.Fill(this.accountDataSet.Account); // зафіксувати зміни
    }
}

 

5.1.8. Програмування команди “Inventory” => “Edit…”

Текст обробника події наступний

private void editToolStripMenuItem1_Click(object sender, EventArgs e)
{
    // Inventory => Edit...
    FormEditAccount f = new FormEditAccount();
    int index;
    int id_account;
    int id_worker;
    string ANum, ADate, AInvNum, AObjName;
    short ACount;
    double APrice;

    if (dataGridView2.RowCount <= 1) return;

    // взяти номер поточного рядка в dataGridView2
    index = dataGridView2.CurrentRow.Index;

    if (index == dataGridView2.RowCount-1) return; //

    // отримати дані рядка
    id_account = (int)dataGridView2.Rows[index].Cells[0].Value;
    id_worker = (int)dataGridView2.Rows[index].Cells[1].Value;
    ANum = (string)dataGridView2.Rows[index].Cells[2].Value;
    ADate = (string)dataGridView2.Rows[index].Cells[3].Value;
    AInvNum = (string)dataGridView2.Rows[index].Cells[4].Value;
    AObjName = (string)dataGridView2.Rows[index].Cells[5].Value;
    ACount = (short)dataGridView2.Rows[index].Cells[6].Value;
    APrice = (double)dataGridView2.Rows[index].Cells[7].Value;

    // заповнити даними рядка поля у FormEditAccount
    f.textBox1.Text = ANum;
    f.textBox2.Text = ADate;
    f.textBox3.Text = AInvNum;
    f.textBox4.Text = AObjName;
    f.textBox5.Text = Convert.ToString(ACount);
    f.textBox6.Text = Convert.ToString(APrice);

    // заповнити поля форми FormEditAccount
    if (f.ShowDialog() == DialogResult.OK) // викликати форму
    {
        // нові значення рядка
        string nANum, nADate, nAInvNum, nAObjName;
        short nACount;
        double nAPrice;

        // взяти нові значення
        nANum = f.textBox1.Text;
        nADate = f.textBox2.Text;
        nAInvNum = f.textBox3.Text;
        nAObjName = f.textBox4.Text;
        nACount = Convert.ToInt16(f.textBox5.Text);
        nAPrice = Convert.ToDouble(f.textBox6.Text);

        // оновити дані в рядку
        this.accountTableAdapter.Update(id_worker,nANum,nADate, nAInvNum, nAObjName,nACount,nAPrice,
              id_account,id_worker, ANum,ADate,AInvNum,AObjName,ACount,APrice);
        this.accountTableAdapter.Fill(this.accountDataSet.Account);
    }
}

 

5.1.9. Програмування фільтру за прізвищем у таблиці “Worker”. Подія TextChanged елементу управління textBox1

З метою забезпечення зручності, у програмі можна використовувати фільтр за полем WName таблиці Worker. Для цього у програмі використовується елемент управління textBox1 (рисунок 46). Для забезпечення швидкої обробки тексту з textBox1, введений текст обробляється в події TextChanged (рисунок 46).

C# - Windows Forms. Елемент управління textBox1. Подія TextChanged

Рис. 46. Елемент управління textBox1. Подія TextChanged

Події TextChanged відповідає обробник події textBox1_TextChanged(). Щоб відфільтрувати записи у полі WName таблиці Worker, потрібно в об’єкті workerBindingSource заповнити значення властивості Filter. Ця властивість відповідає частині “…WHERE …” SQL-команди “SELECT … FROM … WHERE …”. У нашому випадку, потрібно сформувати рядок

WName LIKE 'Text%'

де Text – текст, що введений у рядку textBox1.Text.

Текст обробника події наступний

// фільтр у textBox1
private void textBox1_TextChanged(object sender, EventArgs e)
{
    workerBindingSource.Filter = "WName LIKE '" + textBox1.Text + "%'";
}

Після цього, в таблиці Worker будуть виводитись тільки ті записи, що починаються на текст, що набраний в textBox1.Text. Якщо в textBox1.Text не введено нічого, то будуть виводитись усі записи (рядки) таблиці Worker.

 

5.1.10. Програмування команди “Вихід”

Текст обробника події Click команди “Вихід”

// Вихід
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
    Close();
}

 

5.2. Програмування події Load форми FormAddWorker

У події Load форми FormAddWorker потрібно зробити початкову ініціалізацію значень полів форми.

Текст обробника події Load форми FormAddWorker (Worker -> Add…):

private void FormAddWorker_Load(object sender, EventArgs e)
{
    textBox1.Text = "";
    textBox2.Text = "";
    comboBox1.SelectedIndex = 1;
    textBox1.Focus(); // при відкритті вікна, textBox1 отримує фокус
}

 

5.3. Програмування події Load форми FormEditWorker

Текст обробника події FormEditWorker

private void FormEditWorker_Load(object sender, EventArgs e)
{
    textBox1.Focus();
}

 

5.4. Програмування події Load форми FormAddAccount

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

private void FormAddAccount_Load(object sender, EventArgs e)
{
    textBox1.Text = "";
    textBox2.Text = "";
    textBox3.Text = "";
    textBox4.Text = "";
    textBox5.Text = "";
    textBox6.Text = "";
    textBox1.Focus();
}

 

5.5. Програмування події Load форми FormEditAccount

Текст обробника події наступний

private void FormEditAccount_Load(object sender, EventArgs e)
{
    textBox1.Focus();
}

 

6. Перенаправлення обробників подій кліку на кнопках швидкого виклику на команди меню

На цьому етапі потрібно зробити щоб команди меню викликались натиском відповідної кнопки на головній формі. Призначення кнопок наступне:

  • кнопка “Add…” має викликати команду меню “Worker->Add…”;
  • кнопка “Delete” має викликати команду “Worker -> Delete”;
  • кнопка “Edit…” має викликати команду “Worker -> Edit”;
  • кнопка “Add record…” має викликати команду “Inventory -> Add…”;
  • кнопка “Delete record” має викликати команду “Inventory-> Delete”;
  • кнопка “Edit record…” має викликати команду “Inventory -> Edit”.

C#. Додаток типу Windows Forms. Команда меню "Worker -> Add..."

Рис. 47. Команда меню “Worker -> Add…” і кнопка “Add…”

Не потрібно заново програмувати обробники події Click для кнопок. Засобами MS Visual Studio налаштовуються відповідні обробники подій, як показано на рисунку 48. Для події Click кнопки Add… (button1) призначається обробник події addToolStripMenuItem_Click()

C#. Елемент управління MenuItem. Метод обробки події addToolStripMenuItem_Click()

Рис. 48. Призначення методу обробки події addToolStripMenuItem_Click() для кнопки “Add…”

Так само призначаються іншим кнопкам форми відповідні обробники подій:

  • команді Delete призначається обробник deleteToolStripMenuItem_Click();
  • команді Edit… призначається обробник editToolStripMenuItem_Click();
  • команді Add record… призначається обробник addToolStripMenuItem1_Click();
  • команді Delete record призначається обробник deleteToolStripMenuItem1_Click();
  • команді Edit record… призначається обробник editToolStripMenuItem1_Click().

 

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

Тепер можна запустити програму на виконання.

У даній темі продемонстровано використання засобів MS Visual Studio для керування базою даних Microsoft Access.

Як було показано, не потрібно програмно формувати запити на мові SQL. Для цього, в об’єктах, що створює система, потрібно правильно налаштувати відповідні властивості. Таким чином, досягається мінімум написання програмного коду. Тому що більшість роботи виконується у діалогових вікнах, де налаштовуються зовнішній вигляд, зв’язки, відображення.

У роботі детально висвітлюються:

  • організація навігації по таблицях за принципом “головний”“підлеглий”. При зміні активного запису у головній таблиці відповідно виводяться зв’язані з ним записи підлеглої таблиці;
  • використання об’єктів типу TabelAdapter, BindingSource для зручного оперування даними в таблицях;
  • зручний виклик команд зміни даних в таблицях (INSERT, UPDATE, DELETE) шляхом виклику відповідних методів, що генеруються MS Visual Studio;
  • створення розрахункового поля та задавання точності виведення 2 знаки після коми;
  • програмування фільтру для виведення записів таблиці за заданим шаблоном;
  • використання віконного інтерфейсу MS Visual Studio для зручного налаштування вигляду (відображення) полів таблиць бази даних.

 


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