Практична робота 5. Семестр 2


 

 

 

 

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

         І так, для прикладу, розберемо дві форми – форму бібліотекарів та видачі книжок, механізми блокування будуть подібними, вважайте, що другу ми розглядаємо для закріплення матеріалу.

         Для початку нам потрібно додати в контекстне меню елемент «Додати», так як нашої панелі вкладок при старті форми вже не буде. Це буде логічна точка входу в режим редагування.

Описание: C:\Users\Sergiy\AppData\Local\Temp\SNAGHTML278bae1.PNG

         Тепер нам потрібно у властивостях панелі вкладок змінити 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 });//блокуємо сітку, вкладку редагувати, панель пошуку

 }

 

         Далі розглянемо форму видачі книг читачам. В нас тут є відмінність у тому, що пошук у нас не згрупований на панелі, і нам прийдеться його блокувати по компонентно.

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

Описание: C:\Users\Sergiy\AppData\Local\Temp\SNAGHTML57544ed.PNG

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

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

Кнопка відміни редагування книги

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

/*

         * Початок допоміжних функцій, які допомагають здійснювати

         * блокування сітки та інших компонентів при редагуванні та доданні,

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

         */

 

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% випадках будуть співпадати.

         Для успішної здачі лабораторної роботи, Вам, потрібно буде реалізувати вищеописані механізми блокування дій користувача на всіх ваших формах, які редагують вміст таблиць БД.