Лабораторна 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);
}
На даному етапі форма функціонально змінена, і, тепер відображаються і підставляються значення із таблиці відділів замість чисел-ідентифікаторів. Вам лишилося лише по аналогії додати підстановку із таблиці посад.