Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

sql server+c++

.pdf
Скачиваний:
18
Добавлен:
07.06.2015
Размер:
2.12 Mб
Скачать

private: System::Void Form1_Load

(System::Object^ sender, System::EventArgs^ e)

{

this->SchoolsTableAdapter->Fill(this->KSADataSet->Schools); this->GroupsTableAdapter->Fill(this->KSADataSet->Groups); this->HostelsTableAdapter->Fill(this->KSADataSet->Hostels); this->DeptsTableAdapter->Fill(this->KSADataSet->Depts); this->StudentsTableAdapter->Fill(this->KSADataSet->Students); this->JointTableAdapter->Fill(this->KSADataSet->Joint);

}

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

private: System::Void StudentsBindingNavigatorSaveItem_Click (System::Object^ sender, System::EventArgs^ e)

{

this->Validate(); this->StudentsBindingSource->EndEdit();

this->StudentsTableAdapter->Update(this->KSADataSet->Students); this->JointBindingSource->EndEdit(); this->JointTableAdapter->Update(this->KSADataSet->Joint);

}

Рис. 4.39. Програма-клієнт зі зв’язком «багато до багатьох»

59

Б. Локальне об’єднання стовпців. Попередній випадок, тобто об’єднання стовпців при виконанні запиту з бази даних, не зовсім коректний при модифікації додаткової таблиці, для якої об’єднуються стовпці за допомогою формули, у межах одного об’єкта DataSet. При додаванні до неї нових стрічок до моменту обновлення з базою даних на сервері – об’єднаний стовпець буде пустим. Тому доцільно використовувати обчислювальні можливості об’єкта DataSet.

Додамо у XSD-схемі до таблиці Debts новий стовпець з назвою SubjTeacher. Для цього необхідно натиснути правою кнопкою миші на таблиці та в контекстному меню вибрати пункт AddColumn (п.52). Далі для стовпця SubjTeacher у вікні Properties для параметра Expression вписати обчислювальний вираз (п. 54) (деталі в Додатках):

TRIM(Subject) + ' ' + TRIM(Teacher)

та зберегти XSD-схему . Решта дій по налаштуванню зв’язку «багато до багатьох» є аналогічними до попередніх.

52

а)

53

б)

54

Рис. 4.40. Створення локального обчислювального стовпця

60

4.3.6. Редагування довідкових таблиць у додатковому вікні.

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

Кожну довідкову таблицю будемо редагувати в окремому вікні. Для початку додамо на основну форму програми компоненту

MenuStrip та заповнимо її назвами таблиць, як на рис. 4.41.

Рис. 4.41. Заповнення переліку меню

Тепер необхідно створити нові Windows Forms вікна та розмістити у них довідкові таблиці.

Для створення нового Windows Forms вікна необхідно додати до нашого проекту новий елемент. Для цього натисніть правою кнопкою миші на назві проекту у вікні Solution Explorer та в контекстному підменю виберіть пункт New Item (рис. 4.42).

55

56

Рис. 4.42. Додавання нового Windows Forms вікна

61

Далі у діалоговому вікні Add New Item (рис. 4.43) виберіть елемент Windows Form (п. 58), вкажіть для нього назву (п. 59) та додайте його до форми (п. 60).

5758

59

60

Рис. 4.43. Діалогове вікно для додавання нових елементів в проект

У новостворене Windows Forms вікно перетягніть з Data Sources довідкову таблицю (рис. 4.44). Збережіть проект.

Рис. 4.44. Розміщення довідкової таблиці на новій формі

Тепер можемо прив’язати вікно для редагування довідкової таблиці Groups до відповідного пункту меню. Для цього двічі натисніть мишею по відповідному пункту меню (рис. 4.41) та додайте до функції оброблення натиснення цього меню 2 стрічки коду.

62

private: System::Void groupsToolStripMenuItem_Click

(System::Object^ sender, System::EventArgs^ e)

{

Groups^ groups = gcnew Groups(); groups->Show();

}

Після цього обов’язково підключіть вгорі файлу основної форми Form1.h за допомогою директиви файл вікна довідкової таблиці.

#include "Groups.h"

Аналогічні дії проведіть і для решти довідкових таблиць.

Оскільки нові вікна мають власні копії об’єкта DataSet, то, відповідно, після внесення змін до бази даних необхідно обновити дані на основній формі програми. Для цього розмістіть компонент кнопки Button на основній формі програми та двічі натисніть мишею на ній. У автоматично згенерованій функції оброблення події натиснення миші необхідно вписати код для обновлення даних.

private: System::Void button1_Click

(System::Object^ sender, System::EventArgs^ e)

{

KSADataSet->Joint->Clear(); KSADataSet->Students->Clear(); KSADataSet->Groups->Clear(); KSADataSet->Schools->Clear(); KSADataSet->Hostels->Clear(); KSADataSet->Depts->Clear();

Form1_Load(this,e);

}

При обновленні даних в першу чергу необхідно у визначеній послідовності очистити таблиці об’єкта DataSet, а потім знову заповнити. При заповненні даних ми повторно викликаємо функцію оброблення події завантаження форми програми Form1_Load().

У кінцевому результаті багатовіконна програма-клієнт має виглядати як на рис. 4.45, де додаткові вікна викликаються з меню основного вікна.

63

Рис. 4.45. Багатовіконна програма-клієнт

4.3.7. Відображення на формі рекурсивного зв’язку.

Рекурсивний зв’язок типу дерево реалізується аналогічно до звичайного зв’язку «один до багатьох».

61

62

Рис. 4.46. Розміщення таблиць з рекурсивним зв’язком

64

У вікні Data Sources (рис. 4.46) таблиця TreeInstitute входить в набір об’єкта DataSet у двох якостях: як головна (п. 61), і як підлегла до себе самої (п. 62). Розмістимо їх на формі програми.

Тепер налаштуємо компонент DataGridView головної таблиці за схемою підтримки цілісності значень (розділ 4.3.4.А2, стр. 50) стовпця зовнішнього ключа.

68

6367

66

64

65

69

Рис. 4.47. Налаштування стовпця на відображення значення за зовнішнім ключем

Для стовпця FK_ID (п.63) налаштуйте такі параметри (рис. 4.47):

64.Для параметра ColumnType виберіть зі списку значення

DataGridViewComboBoxColumn;

65.Для параметра DataSource встановіть незалежний новий курсор BindingSource. Для цього розкрийте гілки дерев Other Data Sources, Project Data Sources та в об’єкті DataSet виберіть таблицю TreeInstitute.

66.Для параметра ValueMember виберіть стовпець ID, що виступає у ролі ключа для зв’язування.

67.Для параметра DisplayMember виберіть стовпець Surname, значення якого має відображатися.

68.У параметрі HeaderText перейменуйте надпис для стовпця FK_ID на контекстно-зрозумілий, наприклад Boss.

69.Підтвердіть вибрані параметри кнопкою ОК.

65

При перетягуванні таблиць з вікна Data Sources на форму програми майстер згенерує дві однакові стрічки для заповнення таблиці TreeInstitute. Залишити треба лише одну.

private: System::Void Form1_Load

(System::Object^ sender, System::EventArgs^ e)

{

this->TreeInstituteTableAdapter->Fill(this->KSADataSet->TreeInstitute);

}

Після запуску на виконання програма-клієнт для роботи з даними з ієрархічною структурою буде виглядати як на рис. 4.48.

Рис. 4.48. Програма-клієнт з рекурсивним зв’язком

Інший можливий варіант для навігації по стрічках деревовидної структури бази даних полягає у тому, щоб використовувати елемент керування TreeView (деревовидний список). На жаль, елемент керування TreeView не має засобів для швидкого зв’язування з джерелом даних. Для того, щоб зв’язати деревовидний список з даними, необхідно написати відповідний програмний код.

Рис. 4.49. Деревовидна структура навігації по БД

66

4.3.8. Робота з компонентою DataGrid.

Ця компонента є схожою до DataGridView. Основний її недолік – відсутність можливості відображення стовпців з випадаючими списками. Натомість, вона має унікальну можливість навігації по зв’язаним таблицям усередині об’єкта DataSet, від головного елементу до підлеглого, від підлеглого до його підлеглого і т.д., і назад.

71

70

Рис. 4.50. Налаштування компоненти DataGrid на відображення даних

Для ілюстрації її роботи розмістимо на формі програми компоненту DataGrid (рис. 4.50, п. 70). Далі необхідно, щоб майстер створив для елементу форми об’єкт DataSet, а для кожної таблиці компоненти BindingSource та TableAdapter. Найпростіший шлях – це перетягнути ці таблиці з вікна Data Sources на компоненту DataGrid (п.71). Останньою необхідно перетягувати ту таблицю, з якою необхідно зв’язати DataGrid, та від якої починається навігація. Після цього слід відкорегувати послідовність завантаження даних у таблиці об’єкта DataSet.

private: System::Void Form1_Load

(System::Object^ sender, System::EventArgs^ e)

{

this->SchoolsTableAdapter->Fill(this->KSADataSet->Schools); this->HostelsTableAdapter->Fill(this->KSADataSet->Hostels); this->GroupsTableAdapter->Fill(this->KSADataSet->Groups); this->DeptsTableAdapter->Fill(this->KSADataSet->Depts); this->StudentsTableAdapter->Fill(this->KSADataSet->Students); this->JointTableAdapter->Fill(this->KSADataSet->Joint);

}

67

74

72

73

Рис. 4.51. Навігація по зв’язаним таблицям

Якщо для таблиці існує залежна від неї таблиця, тоді навпроти даних відображається знак «+». При його розкритті відображається назва зовнішнього ключа (п. 72), натиснувши на яку, можна перейти на залежні дані. Якщо для залежної таблиці існує залежна від неї таблиця, то знову ж таки, аналогічно до попереднього, можемо перейти до цих залежних стрічок. У заголовку компоненти DataGrid відображаються стрічки з даними, за якими здійснився перехід (п. 73). Стрілочка у верхньому правому куті (п. 74) дає змогу повернутися на рівень назад.

4.3.9. Фільтрація даних.

Для великих за розмірами баз даних для пришвидшення роботи з ними, а також для звуження діапазонів пошуку потрібної інформації необхідно здійснювати фільтрування. Перший випадок, вибірка лише необхідної інформації з бази даних сервера, дає можливість економити як локальні ресурси, так і завантаженість мережі. Локальна фільтрація ж призначена для пошуку чи обмеження виводу інформації в межах об’єкта DataSet. Другий варіант є простішим для реалізації, оскільки для нього не потрібно враховувати обмеження зовнішнього ключа між таблицями.

68

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]