Практична робота №6. Семестр 1
В цій практичній роботі ми розберемось яким чином на сітці з даними приховати стовпці з відображення, фізично не видаляючи їх, та, що головніше перейменовувати заголовки полів не порушуючи їх назви. Наприклад: в БД поле має назву «name», у всіх запитах на редагування, видалення та створення - ми мусимо використовувати «name», але ж користувач має в підписі стовпця бачити щось виду «ПІБ», або «Ім’я». Також, навіщо користувачу на сітці з даними бачити числа в стовпцях «id», «id_posadu», «id_viddilu»…? З такими речами миритися ми не будемо, і саме з ними і будемо боротись.
Отже почнемо. У Вас в результаті попередньої лабораторної роботи отрималось, хоч і примітивне, але ж все-таки автоматизоване робоче місце бібліотекаря, тепер ми з усіх форм, включаючи і підлеглі, будемо прибирати з відображення непотрібні для користувача стовпці в таблицях, та будемо позбуватися трансліту в назвах стовпців.
Приведені в прикладах методи роботи з сітками будуть однотипними, (на інших формах додатку ви введете їх самі згідно з даним прикладом) різниця буде лише в назвах полів, які потрібно буде певним чином опрацювати. Так як у нас за відображення даних на сітці відповідає функція private void (string q, DataGridView d) - і нас це влаштовує, тому ми просто її розширимо трьома параметрами: в першому ми передамо масив значень, де містяться назви стовпців, які потрібно приховати, в другому і третьому будуть по черзі міститися оригінальні назви стовпців і нові назви, розташовані в відповідному порядку. Також для того, щоб не порушити функціональність вашої системи ми використаємо механізм перевантаження методів, це нам дозволить мати і користуватись одночасно трьома варіантами fill_grid. Перший – старий, який нічого не приховує та не перейменовує, другий буде мати можливість тільки приховувати стовпці, а третій буде і приховувати і перейменовувати одночасно, користуватися ви будете любим із них по мірі необхідності.
При здачі лабораторної роботи не забудьте також по називати правильно форми, щоб не було в проекті «form1», а, на приклад, «Персонал».
Для прикладу візьмемо форуму видачі книжок розглянуту в минулій лабораторній роботі, нагадаємо розташування візуальних компонентів на формі:
Та вкладка редагувати
Також з минулої практичної приведемо і другу, підлеглу форму. На ній присутня сітка з даними яку також було б непогано опрацювати. В цій формі аналогічно до функції fill_grid ми перевантажимо конструктор форми і функцію заповнення даними трьома видами, перший буде без змін, другий вид буде тільки приховувати стовпці, а третій і приховувати і преіменовувати, тому в нас при динамічному створенні підлеглої форми будуть присутні три додаткових параметри які і будуть відповідати за конфігурацію стовпців в відображенні.
В результаті наших дій ми маємо отримати таку першу форму:
І відповідно підлегла форма:
Приведемо код першої форми, місця коду, де відбулися зміни, будуть певним чином виділені.
public partial class Form1 : Form
{
static string cs = new MySqlConnectionStringBuilder() //Створюємо рядок підключення
{
UserID = "root",
Password = "fjrud7sg",
Database = "cs_test",
Server = "127.0.0.1"
}.ConnectionString;
public static MySqlConnection con = new MySqlConnection(cs); //Оголошуємо підключення
//=-=-=-=-=-=-=-= Друге перевантаження функції (приховуємо і переіменовуємо)
private void fill_grid(string q, DataGridView d, string[] f,string [] wn,string [] nn)
{ //Виконуємо запит і відображаємо результат на сітці та ховаємо у відображенні стовпці f
//та переіменовуємо стовпці wn в nn
fill_grid(q, d, f); // викликаємо перевантажену функцію яка заповнює сітку та ховає "непотрібні" поля
for (int i = 0; i <= wn.Length-1;i++ ) { //перебираємо кожне значення в wn
d.Columns[wn[i]].HeaderText = nn[i];//присвоюємо стовпцю з назвою елемента wn нову назву з nn
}
}
//=-=-=-=-=-=-=-= Перше перевантаження функції (тільки приховуємо)
private void fill_grid(string q, DataGridView d, string[] f)
{ //Виконуємо запит і відображаємо результат на сітці та ховаємо у відображенні стовпці f
fill_grid(q,d);//викликаємо перевантажену функцію, яка заповнює сітку
foreach (string fn in f) //перебераємо всі значення f
{
d.Columns[fn].Visible = false;//ховаємо заданий стовпець
}
}
//Наша стара функція ми її залишимо, щоб, якщо потрібно можна було б її використати
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 Form1() //створення (конструктор) форми
{
InitializeComponent();
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[] { "Книга","Автор","Читач","Телефон","Бібліотекар","Видано","Повернення"}); //нові зрозумілі користувачу назви стовпців
// в переліку полів оператор as переіменовує поля для того, щоб у нас не було
// полів типу name_1
tabControl1.SelectedIndex = 0;// перемикаємося на вкладку додати
}
private void видалитиToolStripMenuItem_Click(object sender, EventArgs e)
{
string id = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[0].Value + ""; // беремо ід з сітки
if (id != "") // якщо вдалося взяти значення
{
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 button1_Click(object sender, EventArgs e) //вибір книжки
{
string select_query = "SELECT * FROM `books`;";//запит який буде відображатися на сітці форми 2
string search_query = "SELECT * FROM `books` WHERE CONCAT(`name`,`aughthor`) LIKE '%{0}%';"; //запит для пошуку
// замість {0} буде підставлений текст поля вводу для пошуку
Form2 f2 = new Form2(con,select_query,search_query,"id","name",// створюємо другу форму
//=-=-=-=-=-=-=-= Наші додаткові параметри (тут викликається змінений конструктор, який буде розглянуто в другій частині практичної)
new string[]{"id"},//стовпці, які потрібно приховати
new string[] {"name","aughthor","publish"},//старі "незрозумілі" назви
new string[]{"Назва","Автор","Видана"});//нові назви на які буде переіменовано
//"id" - поле ідентифікатору яке повертається "name" - поле яке буде відображено в полі вводу
if (f2.ShowDialog() == DialogResult.OK) //якщо користувач здійснив вибір
{
textBox1.Text = f2.name_field; //показуємо що вибрав
textBox1.Tag = f2.id_field;//запамятовуємо ідентифікатор обраного запису
}
}
private void button2_Click(object sender, EventArgs e)// вибір бібліотекаря
//див. вибір книги
//обробника різняться лише запитами
//та іменами назв полів для відображення
{
string select_query = "SELECT * FROM `users`;";
string search_query = "SELECT * FROM `users` WHERE CONCAT(`name`,`phone`) LIKE '%{0}%';";
Form2 f2 = new Form2(con, select_query, search_query, "id", "name",
//=-=-=-=-=-=-=-= Наші додаткові параметри (тут викликається змінений конструктор, який буде розглянуто в другій частині практичної)
new string[] { "id", "id_viddilu" },
new string[] { "name", "phone", "data" },
new string[] { "Імя", "Телефон", "Дата" });
if (f2.ShowDialog() == DialogResult.OK)
{
textBox2.Text = f2.name_field;
textBox2.Tag = f2.id_field;
}
}
private void button3_Click(object sender, EventArgs e)// вибір бібліотекаря
//див. вибір книги
//обробника різняться лише запитами
//та іменами назв полів для відображення
{
string select_query = "SELECT * FROM `clients`;";
string search_query = "SELECT * FROM `clients` WHERE CONCAT(`name`,`phone`) LIKE '%{0}%';";
Form2 f2 = new Form2(con,select_query,search_query,"id","name",
//=-=-=-=-=-=-=-= Наші додаткові параметри (тут викликається змінений конструктор, який буде розглянуто в другій частині практичної)
new string[]{"id"},
new string[] {"name","phone","adress"},
new string[] {"Імя","Телефон","Адресса"});
if (f2.ShowDialog() == DialogResult.OK)
{
textBox3.Text = f2.name_field;
textBox3.Tag = f2.id_field;
}
}
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;
}
else { MessageBox.Show("Дати співпадають!"); }
}
private void textBox4_TextChanged(object sender, EventArgs e)//пошук
{
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` "+
// використовується функція для обєднання значень полів, а потім
//шукається співпадання вже з обєднаним полем
"WHERE CONCAT(`books`.`name`,`books`.`aughthor`,`clients`.`name`,`clients`.`phone`,`users`.`name`) LIKE '%"+textBox4.Text+"%';",
dataGridView1,
//=-=-=-=-=-=-=-= Наші додаткові параметри (тут викликається змінений конструктор, який буде розглянуто в другій частині практичної)
new string[] { "bid", "uid", "cid", "id" },
new string[] { "book", "aughthor", "client", "phone", "personal", "get_date", "return_date" },
new string[] { "Книга", "Автор", "Читач", "Телефон", "Бібліотекар", "Видано", "Повернення" });
}
private void button5_Click(object sender, EventArgs e)//очищення пошуку
{
textBox4.Text = "";
}
private void редагуватиToolStripMenuItem_Click(object sender, EventArgs e)//редагування
{
tabControl1.SelectedIndex = 1;//показуємо вкладку редагувати
//переносимо дані рядка сітки в поля редагування
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 button8_Click(object sender, EventArgs e)// вибір книги
//процедура аналогічна іншим викликам другої форми
//див. вище
{
string select_query = "SELECT * FROM `books`;";
string search_query = "SELECT * FROM `books` WHERE CONCAT(`name`,`aughthor`) LIKE '%{0}%';";
Form2 f2 = new Form2(con, select_query, search_query, "id", "name",
//=-=-=-=-=-=-=-= Наші додаткові параметри (тут викликається змінений конструктор, який буде розглянуто в другій частині практичної)
new string[]{"id"},
new string[] {"name","aughthor","publish"},
new string[]{"Назва","Автор","Видана"});
if (f2.ShowDialog() == DialogResult.OK)
{
textBox7.Text = f2.name_field;
textBox7.Tag = f2.id_field;
}
}
private void button7_Click(object sender, EventArgs e)// вибір бібліотекаря
//процедура аналогічна іншим викликам другої форми
//див. вище
{
string select_query = "SELECT * FROM `users`;";
string search_query = "SELECT * FROM `users` WHERE CONCAT(`name`,`phone`) LIKE '%{0}%';";
Form2 f2 = new Form2(con, select_query, search_query, "id", "name",
//=-=-=-=-=-=-=-= Наші додаткові параметри (тут викликається змінений конструктор, який буде розглянуто в другій частині практичної)
new string[] {"id","id_viddilu"},
new string[]{"name","phone","data"},
new string[] {"Імя","Телефон","Дата"});
if (f2.ShowDialog() == DialogResult.OK)
{
textBox6.Text = f2.name_field;
textBox6.Tag = f2.id_field;
}
}
private void button6_Click(object sender, EventArgs e)// вибір читача
//процедура аналогічна іншим викликам другої форми
//див. вище
{
string select_query = "SELECT * FROM `clients`;";
string search_query = "SELECT * FROM `clients` WHERE CONCAT(`name`,`phone`) LIKE '%{0}%';";
Form2 f2 = new Form2(con, select_query, search_query, "id", "name",
//=-=-=-=-=-=-=-= Наші додаткові параметри (тут викликається змінений конструктор, який буде розглянуто в другій частині практичної)
new string[] { "id" },
new string[] { "name", "phone", "adress" },
new string[] { "Імя", "Телефон", "Адресса" });
if (f2.ShowDialog() == DialogResult.OK)
{
textBox5.Text = f2.name_field;
textBox5.Tag = f2.id_field;
}
}
private void button10_Click(object sender, EventArgs e)// очищення полів вводу після редагування
{
textBox5.Text = ""; textBox6.Text = "";
textBox7.Text = "";
dateTimePicker3.Value = DateTime.Now;
dateTimePicker4.Value = DateTime.Now;
tabControl1.SelectedIndex =0;
}
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;//перемикаємося на вкладку додати
}
}
}
Код другої, підлеглої форми
public partial class Form2 : Form
{
private static 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 fill_grid(string q, DataGridView d, string[] f, string[] wn, string[] nn)
{ //Виконуємо запит і відображаємо результат на сітці та ховаємо у відображенні стовпці f
//та переіменовуємо стовпці wn в nn
fill_grid(q, d, f);
for (int i = 0; i <= wn.Length - 1; i++)
{
d.Columns[wn[i]].HeaderText = nn[i];
}
}
//=-=-=-=-=-=-=-= Перше перевантаження функції занесення даних на сітку
private void fill_grid(string q, DataGridView d, string[] f)
{ //Виконуємо запит і відображаємо результат на сітці та ховаємо у відображенні стовпці f
fill_grid(q, d);
foreach (string fn in f)
{
d.Columns[fn].Visible = false;
}
}
private void run_query(string q)
{
if (con.State.ToString() != "Open") con.Open();
MySqlCommand com = new MySqlCommand(q, con);
com.ExecuteNonQuery(); //Виконання без повернення результатів запиту
}
public string id_field { get; set; } //зберігаємо ід. запису для повернення
public string name_field { get; set; }//зберігаємо назву запису для повернення
private string sel_q;//зберігаємо запит який потрібно відобразити на сітці
private string srch_q;//зберігаємо запит пошуку по таблиці
private string id_name;//назва поля фдентифікатору запису
private string name_name;//назва поле фмені яке повертається для відображення
public Form2(MySqlConnection c,string sel_q,string sq,string id,string name)//старий конструктор форми
//c зєднання,sel_q - запит для відображення,sq - запит для пошуку,id - поле ідентифікатору,name - поле назви
{
InitializeComponent();
con = c;//зберігаємо підключення
run_select(sel_q, sq,id,name);//процедура ініціалізації даних форми
}
//=-=-=-=-=-=-=-= Перше перевантаження конструктора форми який лише дозволяє приховувати стовпці
public Form2(MySqlConnection c,string sel_q,string sq,string id,string name,string[] f)//конструктор форми
//c зєднання,sel_q - запит для відображення,sq - запит для пошуку,id - поле ідентифікатору,name - поле назви
//f - імена стовпців, які потрібно "сховати"
{
InitializeComponent();
con = c;//зберігаємо підключення
run_select(sel_q, sq,id,name,f);//процедура ініціалізації даних форми
}
//=-=-=-=-=-=-=-= Друге перевантаження конструктора форми, ховає + переіменовує
public Form2(MySqlConnection c, string sel_q, string sq, string id, string name, string[] f, string[] wn, string[] nn)//конструктор форми
//c зєднання,sel_q - запит для відображення,sq - запит для пошуку,id - поле ідентифікатору,name - поле назви
//f - імена стовпців, які потрібно "сховати", та переіменовує стовпці wn в nn
{
InitializeComponent();
con = c;//зберігаємо підключення
run_select(sel_q, sq, id, name,f,wn,nn);//процедура ініціалізації даних форми
}
//як ви бачите, конструктор спирається на одну і ту ж функцію run_select яку також нам потрібно перевантажити, додати ще два варіанти з різними аргументами
// це стара не перевантажена функція
public void run_select(string select_query,string search_query,string id_,string name_)
{
sel_q = select_query;//зберігаємо запит на відображення
srch_q = search_query;//зберігаємо запит для пошуку
id_name = id_;// зберігаємо поле ідентифікатору
name_name = name_;//зберігаємо поле імені
fill_grid(sel_q, dataGridView1);//заповнюємо сітку форми
label2.Text = "Нічого не вибрано";//мітка для відображення вибору
}
//=-=-=-=-=-=-=-= Перше перевантаження функції яка лише приховує стовпці
public void run_select(string select_query, string search_query, string id_, string name_, string[] f)
{
sel_q = select_query;//зберігаємо запит на відображення
srch_q = search_query;//зберігаємо запит для пошуку
id_name = id_;// зберігаємо поле ідентифікатору
name_name = name_;//зберігаємо поле імені
fill_grid(sel_q, dataGridView1,f);//заповнюємо сітку форми
label2.Text = "Нічого не вибрано";//мітка для відображення вибору
}
//=-=-=-=-=-=-=-= Друге перевантаження функції приховує + перейменовує стовпці
public void run_select(string select_query, string search_query, string id_, string name_, string[] f, string[] wn, string[] nn)
{
sel_q = select_query;//зберігаємо запит на відображення
srch_q = search_query;//зберігаємо запит для пошуку
id_name = id_;// зберігаємо поле ідентифікатору
name_name = name_;//зберігаємо поле імені
fill_grid(sel_q, dataGridView1,f,wn,nn);//заповнюємо сітку форми
label2.Text = "Нічого не вибрано";//мітка для відображення вибору
}
private void textBox1_TextChanged(object sender, EventArgs e)//зміна поля пошуку
{
fill_grid(String.Format(srch_q, textBox1.Text), dataGridView1);//форматуємо запит для пошуку - підставляємо значення поля в потрібне місце
}
private void button2_Click(object sender, EventArgs e)//користувач відмовився від вибору
{
this.DialogResult = DialogResult.Cancel;//форма закриваєтья, статус відмінено
}
private void button1_Click(object sender, EventArgs e)//вибір запису
{
id_field = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[id_name].Value+"";//беремо значення ідентифікатору
name_field = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[name_name].Value + "";//беремо значення поля імені
if ((id_field != "") && (name_field != ""))//якщо значення не порожні
{ this.DialogResult = DialogResult.OK; }//форма закривається, статус - ОК
else { MessageBox.Show("Потрібно щось обрати!"); }//повідомлення про помилку
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)//змінилася вибрана клітинка на сітці
{
label2.Text="Обрано: ("+//пишемо на мітці поточний вибір
dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[id_name].Value+") "+
dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells[name_name].Value + "";
}
}
В процесі використовується лише трете перевантаження функції, але два інших її види доступно для використання. Система викликає потрібну функцію згідно з параметрами переданими їй. Другий перевантажений метод буде потрібний якщо ви перейменували поля за допомогою запиту до БД, і Вам лише потрібно приховати непотрібні стовпці.
Аналогічно до даного прикладу переробіть і інші форми минулої практичної.