Практична робота 5. Семестр 2
Метою даної лабораторної роботи буде розробити механізм примусового блокування операцій, тобто, якщо оператор інформаційної системи обрав елемент меню редагувати, то заборонити йому будь-які дії, доки він не закінчить редагування, або не натисне кнопку відмінити. Також будемо блокувати сітку із даними, щоб користувач в процесі редагування не міг вибрати інший рядок таблиці. І ще, реалізуємо механізм підтвердження при видаленні запису із таблиці. В народі, може чули, це називають «захистом від дурня».
І так, для прикладу, розберемо дві форми – форму бібліотекарів та видачі книжок, механізми блокування будуть подібними, вважайте, що другу ми розглядаємо для закріплення матеріалу.
Для початку нам потрібно додати в контекстне меню елемент «Додати», так як нашої панелі вкладок при старті форми вже не буде. Це буде логічна точка входу в режим редагування.

Тепер нам потрібно у властивостях панелі вкладок змінити Visible на false.

Тепер перевіряємо: чи є у вкладках редагувати та додати кнопки відміни. Якщо їх немає – додайте.

Вкладка додати

Вкладка редагувати
Тепер нам потрібно реалізувати блокування тих чи інших компонент, в залежності від ситуації. Оголосимо в коді класу форми декілька службових функцій для зручності.
/*
* Початок допоміжних функцій,які допомагають здійснювати
* блокування сітки та інших компонент при редагуванні та доданні,
* також присутні функції для відображення та приховування компонент
*/
public void disable_components(Control [] c) //блокує пакетно передані візуальні компоненти
{
foreach (Control e in c) e.Enabled = false; //перебираємо через змінну e компоненти та блокуємо їх
}
public void enable_components(Control [] c) //розблоковує пакетно передані компоненти
{
foreach (Control e in c) e.Enabled = true; //перебираємо через змінну e компоненти та розблоковуємо їх
}
public void hide_components(Control [] c) //ховаємо пакетно передані компоненти
{
foreach (Control e in c) e.Visible = false;//перебираємо через змінну е компоненти та ховаємо їх
}
public void show_components(Control[] c) //показуємо пакетно передані компоненти
{
foreach (Control e in c) e.Visible = true;//перебираємо через змінну е компоненти та показуємо їх
}
public bool alert_message(string msg,string cap) //показує повідомлення і повертає істину, якщо натиснута кнопка так
{
//показуємо повідомлення msg із заголовком cap і якщо відповідь так тоді повертаемо істину
if (MessageBox.Show(msg, cap, MessageBoxButtons.YesNo) == DialogResult.Yes) return true;
return false;//в іншому випадку повертаємо хибність
}
/*
* Кінець допоміжних функцій блокування
*/
Будемо тепер приміняти функції для реалізації видалення, редагування та додання записів до таблиці. Перелічимо події, які відповідають за відповідні операції.
private void deleteToolStripMenuItem_Click(object sender, EventArgs e) //подія натиску елемента меню "Видалити"
{
//дізнаємося ідентифікатор запису
string id = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["id"].Value + "";
//дізнаємося ім’я запису
string name = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["name"].Value+"";
//додаємо відображення повідомлення, і перевіряємо відповідь
if ((id != "")&&(alert_message("Ви дійсно бажаєте видалити запис "+name+" ?","Питання")))
{
//якщо існує ідентифікатор і дана відповідь так
run_query("DELETE FROM `users` WHERE `id`=" + id + ";");//видаляємо запис
fill_grid("SELECT * FROM `users`;", dataGridView1,//оновлюємо сітку
new string[] { "id", "id_viddilu" },//приховуємо "непотрібні" стовпці
new string[] { "name", "phone", "data" },//перейменовуємо "name", "phone", "data"
new string[] { "Імя", "Телефон", "Дата" });//на нові імена "Ім’я", "Телефон", "Дата"
}
}
private void button3_Click(object sender, EventArgs e) //Додання нового запису
{
string name = textBox3.Text + "";//беремо ім’я із поля вводу
string phone = textBox4.Text + "";//беремо телефон
string data = textBox5.Text + "";//беремо дату
//виконуємо запит додання рядка до таблиці
run_query("INSERT INTO `users`(`id`,`name`,`phone`,`data`) VALUES (NULL,'"+name+"','"+phone+"','"+data+"');");
fill_grid("SELECT * FROM `users`;", dataGridView1,//оновлюємо сітку
new string[] { "id", "id_viddilu" },//приховуємо "непотрібні" стовпці
new string[] { "name", "phone", "data" },//перейменовуємо "name", "phone", "data"
new string[] { "Імя", "Телефон", "Дата" });//на "І’мя", "Телефон", "Дата"
textBox3.Text = ""; textBox4.Text = ""; textBox5.Text = ""; //очищуємо поля
button6_Click(this,null);//викликаємо "Відмінити" для розблокування і приховування компонент
}
private void button5_Click(object sender, EventArgs e) //Подія кнопки відміни редагування
{
textBox6.Text = ""; textBox7.Text = ""; textBox8.Text = "";//очищуємо поля вводу
tabControl1.SelectedIndex = 0;//перемикаємо на вкладку додати
/*
* Нам потрібно розблокувати сітку, панель пошуку, вкладку додати.
* І сховати панель вкладок, і цю кнопку
*/
enable_components(new Control[] { dataGridView1, groupBox1, tabPage1 }); //розблоковуємо сітку, панель пошуку, вкладку додати
hide_components(new Control[] { tabControl1, button5 }); //ховаємо панель вкладок, і цю кнопку
}
private void редагуватиToolStripMenuItem_Click(object sender, EventArgs e) //подія елемента меню редагувати
{
//переносимо в поле вводу ім’я
textBox6.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["name"].Value+"";
//переносимо в поле вводу телефон
textBox7.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["phone"].Value + "";
//переносимо в поле вводу дату
textBox8.Text = Convert.ToDateTime(dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["data"].Value+"").ToString("dd.MM.yyyy");
/*
* Показуємо панель вкладок, кнопку відмінити (1)
* Вимикаємо сітку, пошук, вкладку додати (2)
*/
show_components(new Control[] {tabControl1,button5}); //(1)
disable_components(new Control [] {dataGridView1,groupBox1,tabPage1});//(2)
tabControl1.SelectedIndex = 1;//показуємо вкладку редагувати
}
private void button4_Click(object sender, EventArgs e)//подія кнопки примінити редагування
{
//беремо ім’я, телефон та дату із полів вводу
string name = textBox6.Text; string phone = textBox7.Text; string data = textBox8.Text;
//дізнаємося ідентифікатор запису із сітки з даними
string id=dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["id"].Value+"";
//переводимо дату до потрібного нам формату
data=Convert.ToDateTime(data).ToString("yyyy-MM-dd");
//виконуємо запит на редагування запису
run_query("UPDATE `users` SET `name`='"+name+"',`phone`='"+phone+"',`data`='"+data+"' WHERE `id`="+id+";");
fill_grid("SELECT * FROM `users`;", dataGridView1,//оновлюємо сітку
new string[] { "id", "id_viddilu" },//прибираємо "непотрібні" стовпці з відображення
new string[] { "name", "phone", "data" },//перейменовуємо "name", "phone", "data"
new string[] { "Імя", "Телефон", "Дата" }); //на "Ім’я", "Телефон", "Дата"
button5_Click(this, null); //натискаємо на кнопку відміни редагування, щоб розблокувати і сховати компоненти
}
private void button6_Click(object sender, EventArgs e) //подія кнопки відміни додання запису
{
enable_components(new Control[] {dataGridView1,tabPage2,groupBox1});//розблоковуємо сітку, вкладку редагувати і панель пошуку
hide_components(new Control [] {tabControl1});//ховаємо панель вкладок
}
private void додатиToolStripMenuItem_Click(object sender, EventArgs e) //подія додати запис контекстного меню сітки
{
show_components(new Control[] { tabControl1, button6 });//показуємо панель вкладок, та кнопку відмінити редагування
disable_components(new Control[] { dataGridView1, tabPage2, groupBox1 });//блокуємо сітку, вкладку редагувати, панель пошуку
}
Далі розглянемо форму видачі книг читачам. В нас тут є відмінність у тому, що пошук у нас не згрупований на панелі, і нам прийдеться його блокувати по компонентно.
По аналогії перевіряємо: чи є кнопка відмінити в редагування та видачі книги, якщо немає то створюємо, і в контекстному меню створюємо елемент меню «Видати», який і буде початком операції видачі книги. Приведемо можливі назви компонент:

Елемент «Видати»

Кнопка відміни видачі книги

Кнопка відміни редагування книги
Знову нам знадобляться наші допоміжні функції, якщо бажаєте ви можете їх скопіювати на цю форму, або викликати їх з простору імен іншої форми. Тут ми їх просто скопіюємо в код поточної форми.
/*
* Початок допоміжних функцій, які допомагають здійснювати
* блокування сітки та інших компонентів при редагуванні та доданні,
* також присутні функції для відображення та приховування компонент
*/
public void disable_components(Control [] c) //блокує пакетно передані візуальні компоненти
{
foreach (Control e in c) e.Enabled = false; //перебираємо через змінну e компоненти та блокуємо їх
}
public void enable_components(Control [] c) //розблоковує пакетно передані компоненти
{
foreach (Control e in c) e.Enabled = true; //перебираємо через змінну e компоненти та розблоковуємо їх
}
public void hide_components(Control [] c) //ховаємо пакетно передані компоненти
{
foreach (Control e in c) e.Visible = false;//перебираємо через змінну е компоненти та ховаємо їх
}
public void show_components(Control[] c) //показуємо пакетно передані компоненти
{
foreach (Control e in c) e.Visible = true;//перебираємо через змінну е компоненти та показуємо їх
}
public bool alert_message(string msg,string cap) //показує повідомлення і повертає істину, якщо натиснута кнопка так
{
//показуємо повідомлення msg із заголовком cap і якщо відповідь так тоді повертаємо істину
if (MessageBox.Show(msg, cap, MessageBoxButtons.YesNo) == DialogResult.Yes) return true;
return false;//в іншому випадку повертаємо хибність
}
/*
* Кінець допоміжних функцій блокування
*/
Ці функції вже були розглянуті, тому зупинятися на них ми не будемо.
Перейдемо одразу до подій новостворених елементів, тут будуть наведені і події, які змінені, наприклад елемент меню видалити.
private void button9_Click(object sender, EventArgs e)//редагування рядка
{
string id = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value + ""; //визначаємо ідентифікатор
if (id != "")//якщо вдалося визначити ідентифікатор запису
{
string cid = textBox5.Tag+"";//ід. читача
string uid = textBox6.Tag + "";//ід. бібліотекаря
string bid = textBox7.Tag + "";//ід.книги
string gd=dateTimePicker4.Value.ToString("yyyy-MM-dd");//дата видачі
string rd = dateTimePicker3.Value.ToString("yyyy-MM-dd");//тата повернення
//запит на редагування
run_query("UPDATE `inuse` SET `id_user`="+uid+",`id_client`="+cid+",`book_id`="+bid+",`get_date`='"+gd+"',`return_date`='"+rd+"' WHERE `id`=" + id + ";");
//оновлення сітки
fill_grid("SELECT `inuse`.`id`,`books`.`name` as 'book', `books`.`aughthor`, " +
"`clients`.`name` as 'client',`clients`.`phone`,`users`.`name` as 'personal', " +
"`inuse`.`get_date`,`inuse`.`return_date`,`users`.`id` as 'uid',`books`.`id` as 'bid', " +
"`clients`.`id` as 'cid' FROM `inuse` " +
"JOIN `books` on `books`.`id`=`inuse`.`book_id` " +
"JOIN `clients` on `clients`.`id`=`inuse`.`id_client` " +
"JOIN `users` on `users`.`id`=`inuse`.`id_user`;", dataGridView1, new string[] { "bid", "uid", "cid", "id" },
new string[] { "book", "aughthor", "client", "phone", "personal", "get_date", "return_date" },
new string[] { "Книга", "Автор", "Читач", "Телефон", "Бібліотекар", "Видано", "Повернення" });
tabControl1.SelectedIndex = 0;//перемикаємося на вкладку додати
button10_Click(this,null);//викликаємо подію відміни редагування, для приховування компонентів
// і розблокування пошуку
}
}
private void видатиToolStripMenuItem_Click(object sender, EventArgs e) //подія контекстного меню видати
{
//вимикаємо сітку, пошук, вкладку редагувати
disable_components(new Control [] { dataGridView1, textBox4, button5, tabPage2 });
//показуємо вкладки, кнопку відміни
show_components(new Control [] {tabControl1,button10});
tabControl1.SelectedIndex = 0;//перемикаємося на вкладку видачі книги
}
private void button11_Click(object sender, EventArgs e) //кнопка відмінити видачу книги
{
//розблоковуємо сітку, пошук, вкладку редагувати
enable_components(new Control [] { dataGridView1, textBox4, button5, tabPage2 });
//ховаємо вкладки, кнопку відміни
hide_components(new Control [] {tabControl1,button10});
}
private void видалитиToolStripMenuItem_Click(object sender, EventArgs e) //подія видалення виданої книги
{
string id = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value + ""; // беремо ід. з сітки
if ((id != "")&&(alert_message("Видалити поточний запис із таблиці?","Питання"))) // якщо вдалося взяти значення
// і якщо користувач відповів схвально
{
run_query("DELETE FROM `inuse` WHERE `id`=" + id + ";");//видаляємо
//оновлюємо сітку, приховуємо "непотрібні" стовпці та переіменовуємо назви стовпців
fill_grid("SELECT `inuse`.`id`,`books`.`name` as 'book', `books`.`aughthor`, " +
"`clients`.`name` as 'client',`clients`.`phone`,`users`.`name` as 'personal', " +
"`inuse`.`get_date`,`inuse`.`return_date`,`users`.`id` as 'uid',`books`.`id` as 'bid', " +
"`clients`.`id` as 'cid' FROM `inuse` " +
"JOIN `books` on `books`.`id`=`inuse`.`book_id` " +
"JOIN `clients` on `clients`.`id`=`inuse`.`id_client` " +
"JOIN `users` on `users`.`id`=`inuse`.`id_user`;", dataGridView1, new string[] { "bid", "uid", "cid", "id" },
new string[] { "book", "aughthor", "client", "phone", "personal", "get_date", "return_date" },
new string[] { "Книга", "Автор", "Читач", "Телефон", "Бібліотекар", "Видано", "Повернення" });
//оновлюємо сітку
tabControl1.SelectedIndex = 0;//показуємо вкладку додати
}
}
private void редагуватиToolStripMenuItem_Click(object sender, EventArgs e)//елемент контекстного меню редагування
{
tabControl1.SelectedIndex = 1;//показуємо вкладку редагувати
show_components(new Control[] { tabControl1, button10 });//показуємо панель вкладок, кнопку відмінити
disable_components(new Control[] { dataGridView1, tabPage1, textBox4, button5 });//блокуємо, панель вкладок та пошук
//переносимо дані рядка сітки в поля редагування
textBox7.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["book"].Value + "";//книга
textBox7.Tag = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["bid"].Value + "";//ід. книги
textBox6.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["personal"].Value + "";//бібліотекар
textBox6.Tag = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["uid"].Value + "";//ід. бібліотекаря
textBox5.Text = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["client"].Value + "";//читач
textBox5.Tag = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["cid"].Value + "";//ід. читача
dateTimePicker4.Value = DateTime.Parse(dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["get_date"].Value + "");//дата видачі
dateTimePicker3.Value = DateTime.Parse(dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["return_date"].Value + "");//дата орієнтовного повернення
}
private void button10_Click(object sender, EventArgs e)// очищення полів вводу після редагування
{
hide_components(new Control[] { tabControl1, button10 });//ховаємо панель вкладок, кнопку відмінити
enable_components(new Control[] { dataGridView1,tabPage1, textBox4, button5 });//розблоковуємо, панель вкладок та пошук
//очищаємо поля редагування
textBox5.Text = ""; textBox6.Text = ""; textBox7.Text = "";
//встановлюємо поточну дату в поля вибору дат
dateTimePicker3.Value = DateTime.Now;
dateTimePicker4.Value = DateTime.Now;
tabControl1.SelectedIndex = 0;//перемикаємося на вкладку видачі книги
}
private void button4_Click(object sender, EventArgs e) //видача книги
{
string get_d = dateTimePicker1.Value.ToString("yyyy-MM-dd");//дати приведені до формату mySQL
string ret_d = dateTimePicker2.Value.ToString("yyyy-MM-dd");
if (get_d != ret_d)
{// введені дати не мають співпадати
run_query(String.Format("INSERT INTO `inuse` VALUES(NULL,{0},{1},{2},'{3}','{4}');", //запит на додання
textBox2.Tag, textBox3.Tag, textBox1.Tag, get_d, ret_d));//{0},{1},{2},'{3}','{4}' - заміняться цими значеннями
fill_grid("SELECT `inuse`.`id`,`books`.`name` as 'book', `books`.`aughthor`, " +
"`clients`.`name` as 'client',`clients`.`phone`,`users`.`name` as 'personal', " +
"`inuse`.`get_date`,`inuse`.`return_date`,`users`.`id` as 'uid',`books`.`id` as 'bid', " +
"`clients`.`id` as 'cid' FROM `inuse` " +
"JOIN `books` on `books`.`id`=`inuse`.`book_id` " +
"JOIN `clients` on `clients`.`id`=`inuse`.`id_client` " +
"JOIN `users` on `users`.`id`=`inuse`.`id_user`;", dataGridView1,
new string[] { "bid", "uid", "cid", "id" },
new string[] { "book", "aughthor", "client", "phone", "personal", "get_date", "return_date" },
new string[] { "Книга", "Автор", "Читач", "Телефон", "Бібліотекар", "Видано", "Повернення" }); //оновлюємо сітку
textBox1.Text = ""; textBox2.Text = "";//очищаємо введені данні
textBox3.Text = ""; textBox4.Text = "";
dateTimePicker1.Value = DateTime.Now;//встановлюємо поточні дати в поля вводу дат
dateTimePicker2.Value = DateTime.Now;
button11_Click(this, null);//викликаємо подію відміни видачі книги, щоб розблокувати та сховати потрібні компоненти
}
else { MessageBox.Show("Дати співпадають!"); }
}
Як ви бачите, немає нічого складного при блокуванні і форм з підстановкою значень. Механізми одні і ті ж самі в 90% випадках будуть співпадати.
Для успішної здачі лабораторної роботи, Вам, потрібно буде реалізувати вищеописані механізми блокування дій користувача на всіх ваших формах, які редагують вміст таблиць БД.