Лабораторна робота 3. Створення форм-довідників
Метою роботи буде написання додатку для перегляду та редагування довідників. Довідниками вважаються форми на яких відображається і редагується вміст таких таблиць БД: бібліотекарі, читачі, книги, відділи та посади.
Для кожної з цих таблиць використаємо свою форму. Нам знадобиться ще одна форма, яка буде викликати інші форми роботи з таблицями, умовно назвемо її «Головною».
Для реалізації задуманого нам потрібно, щоб в таблиці користувачів існували поля для зв’язування з таблицями посади, та відділи (INT NOT NULL AUTO_INCREMENT UNSIGNED).
Отже так як в C# немає статичних форм і середовище (по замовчуванню) при відображенні форми її створює а при закритті знищує то нам потрібно аби за реквізити підключення (логін, пароль і т.д) відповідала головна форма так як поки вона працює – працює і Ваш додаток. Отже приведемо для приклада вигляд форми
Тут все просто – по натисненні елементу меню викликаються інші форми ми, для прикладу розглянемо форми читачів та книг. Наголошую, що в даному прикладі розглянуто лише механізм виконання запитів та використання спільного підключення, тому вони тут спрощені лише до однієї сітки з даними, а у Вас, при здачі лабораторної роботи вони мусять бути такі як в попередній, тобто з пошуком, редагуванням, видаленням та додаванням рядків.
Отже наші форми (для прикладу) такі:
Ну і аналогічна форма 3:
Ще раз нагадую, що в прикладі ілюструється лише управління підключенням та виконанням запитів між декількома формами, при здачі вони мають бути доповнені функціоналом як в попередній лабораторній роботі.
Отже підключення тепер в нас буде на першій – головній формі, його потрібно оголосити СТАТИЧНИМИ методами класу.
Обов’язково ви маєте додати посилання на MySQL.Data і в простір імен обов’язково прописати using MySql.Data.MySqlClient;
public partial class Form1 : Form
{
static string cs = new MySqlConnectionStringBuilder() //Створюємо рядок підключення
{
UserID = "root",
Password = "*******",
Database = "cs_test",
Server = "127.0.0.1"
}.ConnectionString;
public static MySqlConnection con = new MySqlConnection(cs); //Оголошуємо підключення
public Form1()
{
InitializeComponent();
con.Open(); //Підключаемося
}
private void читачіToolStripMenuItem_Click(object sender, EventArgs e) //виклик другої форми
{
Form2 f2 = new Form2(con); //створення форми 2, другий параметр наше підключення
f2.ShowDialog();//відображення форми, головна форма «заблокована» доки не закрита форма 2
}
private void книгиToolStripMenuItem_Click(object sender, EventArgs e) //виклик другої форми
{
Form3 f3 = new Form3(con); //створення форми 3, другий параметр наше підключення
f3.ShowDialog();();//відображення форми, головна форма «заблокована» доки не закрита форма 3
}
}
Так як, ми змінили механізм створення двох форм додавши до нього ще один параметр, то в нас додаток не відкомпілюється доки ми не змінимо конструктор інших форм. Та ще нам потрібно додати приватні функції виклику запитів з поверненням результатів і без.
Код форми 2:
public partial class Form2 : Form
{
private MySqlConnection con; // тут ми зберігаємо з’єднання передане нам при створенні форми
private void fill_grid(string q, DataGridView d) // процедура заповнення сітки даними запиту, мусить бути приватною, щоб не конфліктувати з іншими формами
{ //Виконуємо запит і відображаємо результат на сітці
DataTable dt = new DataTable();
if (con.State.ToString() != "Open") con.Open();
MySqlCommand com = new MySqlCommand(q, con);
MySqlDataReader dr = com.ExecuteReader(); //Виконання із поверненням кузультатів запиту
dt.Load(dr);
d.DataSource = dt;
dr.Close();
}
private void run_query(string q) //виконання запиту без повернення результатів, повиння бути приватною, щоб не конфліктувала з іншими формами
{
if (con.State.ToString() != "Open") con.Open();
MySqlCommand com = new MySqlCommand(q, con);
com.ExecuteNonQuery(); //Виконання без повернення результатів запиту
}
public Form2(MySqlConnection c) // конструктор створення форми, додаємо змінну підключення с
{
InitializeComponent();
con = c; // запям’ятовуємо передане нам з’єднання з сервером
fill_grid("SELECT * FROM `users`;", dataGridView1); // при відображенні форми виводимо вміст таблиці читачів (користувачів)
}
// Тут Вам потрібно буде дописати події які будуть відповідати за пошук, додання, редагування та видалення покрокова інструкція знаходиться в попередній лабораторній роботі
}
Тепер розглянемо код третьої форми, він буде відрізнятися лише запитом який відображає таблицю при створенні форми в конструкторі форми.
Код форми 3:
public partial class Form3 : Form
{
private MySqlConnection con; // тут ми зберігаємо з’єднання передане нам при створенні форми
private void fill_grid(string q, DataGridView d) // процедура заповнення сітки даними запиту, мусить бути приватною, щоб не конфліктувати з іншими формами
{ //Виконуємо запит і відображаємо результат на сітці
DataTable dt = new DataTable();
if (con.State.ToString() != "Open") con.Open();
MySqlCommand com = new MySqlCommand(q, con);
MySqlDataReader dr = com.ExecuteReader(); //Виконання із поверненням кузультатів запиту
dt.Load(dr);
d.DataSource = dt;
dr.Close();
}
private void run_query(string q) //виконання запиту без повернення результатів, повиння бути приватною, щоб не конфліктувала з іншими формами
{
if (con.State.ToString() != "Open") con.Open();
MySqlCommand com = new MySqlCommand(q, con);
com.ExecuteNonQuery(); //Виконання без повернення результатів запиту
}
public Form2(MySqlConnection c) // конструктор створення форми, додаємо змінну підключення с
{
InitializeComponent();
con = c; // запям’ятовуємо передане нам з’єднання з сервером
fill_grid("SELECT * FROM `books`;", dataGridView1); // при відображенні форми виводимо вміст таблиці читачів (користувачів)
}
// Тут Вам потрібно буде дописати події які будуть відповідати за пошук, додання, редагування та видалення покрокова інструкція знаходиться в попередній лабораторній роботі
}
Як ви бачите з наведеного вище коду головна форма просто зберігає реквізити доступу та компоненту підключення в статичних медодах, і після підключення в конструкторі форми динамічно передає дочірнім формам, при їх створенні.
Далі, так як функції виконання запитів називаються однаково, у кожній формі, при написанні програмного коду, ви просто виконуєте метод класу, а так як він приватний він в любому випадку виконається з потрібної форми.
Тепер лишилося тільки розібратися з одним моментом, чи можна підключити до нового проекту форму з минулої лабораторної роботи.
Якщо потрібно використати вже існуючі форми то потрібно
1. Скопіювати файли Form1.cs, Form1.Designer.cs, Form1.resx (якщо це форма 1) до папки нового проекту.
2. В Solution Explorer натискаємо правою кнопкою по рядку з назвою проекту та вибираємо add->existing item та вибираємо файл з формою яку треба підключити (Form1.cs)
3. Тепер потрібно відкрити в режимі редагування додану форму та вказати новий Namespace в підключеній формі.
4. Далі потрібно вибрати переіменувати у файлах форми
Після цього форма інтегрувалася до проекту і з нею можна працювати як зі звичайною.
Потрібно лише переконатися, що в проекті немає форми з таким самим іменем. Якщо така форма існує потрібно буде і її переіменувати як в останніх двох пунктах.