Лабораторна 4. Семестр 1. Створення випадаючих списків на базі таблиць

 

         Метою даної практичної роботи буде реалізація випадаючого списку із полями назв та ідентифікаторів з підставної таблиці (візьмемо для прикладу таблицю відділів, підставлення з таблиці посад реалізуйте самостійно)

         Отже модифікуємо практичну роботу 2 (додання, редагування, видалення співробітників бібліотеки). На форму додамо два випадаючих списки – один на вкладку «Додати» інший для «Редагувати».

         Обов’язково перевірте поля посада та відділ мусять бути числовими в таблиці користувачів, тобто містити числа які будуть рівні ідентифікаторам в таблицях відділів та посад відповідно (зовнішні ключі)

         Розглянемо приклад реалізації підстановки для відділів, посади реалізуєте самостійно.

         По-перше нам потрібна функція яка заповнить випадаючий список парами значень ідентифікатор=назва із таблиці відділів. Зробимо її універсальною.

        public void fill_combobox(string q,string f_id,string f_name,ComboBox c) //q - запит, f_id - поле ідентифікатора, f_name - поле назви для відображення, c - випадаючий список який буде заповнено

        {

            DataGridView dgv = new DataGridView() { Parent=this}; //створюємо проміжну сітку з даними для зручності, обовязково вказуємо за власника поточну форму

            fill_grid(q, dgv); //виконуємо запит і заповнюємо сітку

            c.Items.Clear();//очищуємо всі елементи списку що були до цього

            Dictionary<string,string> comboSource = new Dictionary<string,string>(); // Створюємо словник для збереження пар ключ=значення

            foreach (DataGridViewRow r in dgv.Rows) //перебераємо рядки сітки

            {

                comboSource.Add(r.Cells[f_id].Value + "", r.Cells[f_name].Value+""); // додаємо до словника значення

            }

            c.DataSource = new BindingSource(comboSource, null); //розміщуємо словник у випадаючому списку

            c.DisplayMember = "Value"; //в списку відображається значення

            c.ValueMember = "Key"; //ключ не візуальний, але привязаний до значення

            c.Text = ""; // в списку не вибрано нічого

        }

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

fill_grid("SELECT * FROM `users`;", dataGridView1);

на:

fill_grid("SELECT `users`.`id`,`users`.`name`,`viddilu`.`viddil`,`users`.`phone`,`users`.`data`"

+" FROM `users` JOIN `viddilu` on `viddilu`.`id`=`users`.`id_viddilu`;", dataGridView1);

 

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

public Form1()

        {

            InitializeComponent();

            con.Open(); //Підключаємося

            tabControl1.SelectedIndex=0; //Показуємо вкладку "Додати"

            fill_grid("SELECT `users`.`id`,`users`.`name`,`viddilu`.`viddil`,`users`.`phone`,`users`.`data`"+

                      " FROM `users` JOIN `viddilu` on `viddilu`.`id`=`users`.`id_viddilu`;", dataGridView1);

            fill_combobox("SELECT * FROM `viddilu`;", "id", "viddil", comboBox1); //Ось тут відбувається заповнення першого випадаючого списку

        }

         Тепер модифікуємо функції пошуку по імені та по телефону потрібно замінити запит функції заповнення сітки на запит об’єднання двох таблиць:

fill_grid("SELECT `users`.`id`,`users`.`name`,`viddilu`.`viddil`,`users`.`phone`,`users`.`data`"+

                      " FROM `users` JOIN `viddilu` on `viddilu`.`id`=`users`.`id_viddilu`"+

                      " WHERE `users`.`name` LIKE '%" + s + "%';", dataGridView1);  //функція оновлення сітки для пошуку по імені

fill_grid("SELECT `users`.`id`,`users`.`name`,`viddilu`.`viddil`,`users`.`phone`,`users`.`data`"+

                      " FROM `users` JOIN `viddilu` on `viddilu`.`id`=`users`.`id_viddilu`"+

                      " WHERE `users`.`phone` LIKE '%" + s + "%';", dataGridView1);  //функція оновлення сітки для пошуку по телефону

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

З видаленням все просто, поміняти потрібно лише оновлення сітки – це ми зробили в пункті 2.

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

private void button3_Click(object sender, EventArgs e)

        {

            string name = textBox3.Text + "";

            string phone = textBox4.Text + "";

            string data = textBox5.Text + "";

            string v_id = comboBox1.SelectedValue + "";// записуємо значення ключа зі списку у змінну

            if (v_id == "") v_id = "0";// якщо не вибрано змінна буде рівна «0»

            run_query("INSERT INTO `users` VALUES (NULL,'" + name + "','" + phone + "','" + data + "',"+v_id+");");//додаємо один аргумент до запиту (НЕ ЗАБУВАЙТЕ у вас в лабораторній буде ще список посад, тому додати потрібно буде 2 аргументи, відповідно всього буде по два - змінних, списків)

            fill_grid("SELECT `users`.`id`,`users`.`name`,`viddilu`.`viddil`,`users`.`phone`,`users`.`data`" +

                      " FROM `users` JOIN `viddilu` on `viddilu`.`id`=`users`.`id_viddilu`;", dataGridView1);

            textBox3.Text = ""; textBox4.Text = ""; textBox5.Text = "";

comboBox1.Text = "";//очищуємо список

        }

Перейдемо до редагування, так як редагування в нас функціонально іде в три етапи, модифікувати потрібно буде всі три, почнемо з найменшого – кнопки відміни редагування:

private void button5_Click(object sender, EventArgs e)

        {

            textBox6.Text = ""; textBox7.Text = ""; textBox8.Text = "";

            tabControl1.SelectedIndex = 0;

            comboBox2.Text = "";//очищуємо список (не забувайте про посади, у Вас списків буде два)

  }

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

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");

            fill_combobox("SELECT * FROM `viddilu`;", "id", "viddil", comboBox2); // Заповнюємо другий випадаючий список

            string v = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["viddil"].Value + "";//записуємо назву відділу в змінну

            foreach (KeyValuePair<string, string> d in comboBox2.Items) { if (d.Value == v) comboBox2.SelectedItem = d; }// шукаємо в списку назву відділу і підставляємо його

            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+"";

            string v_id = comboBox2.SelectedValue + "";//беремо обраний ідентифікатор відділа з списку

            if (v_id == "") v_id = "0";// якщо нічого не вибрано тоді присвоюємо змінній «0»

            data=Convert.ToDateTime(data).ToString("yyyy-MM-dd");

            run_query("UPDATE `users` SET `name`='"+name+"',`phone`='"+phone+"',`data`='"+data+"',`id_viddilu`="+v_id+" WHERE `id`="+id+";");// додаємо аргумент, ідентифікатора відділу у запит рдагування таблиці

            fill_grid("SELECT `users`.`id`,`users`.`name`,`viddilu`.`viddil`,`users`.`phone`,`users`.`data`" +

                      " FROM `users` JOIN `viddilu` on `viddilu`.`id`=`users`.`id_viddilu`;", dataGridView1);

            button5_Click(this, null);

        }

На даному етапі форма функціонально змінена, і, тепер відображаються і підставляються значення із таблиці відділів замість чисел-ідентифікаторів. Вам лишилося лише по аналогії додати підстановку із таблиці посад.