RUS_-_Karejev_-_Razrabotka_Windows-prilozhenij
.pdf
увеличить изображение
Рис. 11.15. Контекстное меню "Проводника"
Рис. 11.16. Добавление нового клиента
увеличить изображение
Рис. 11.17. Клиент, добавленный в окно "Проводника"
В проводнике можно также скопировать клиента в группе для последующего добавления его в другую группу (рис. 11.18, 11.19).
увеличить изображение
Рис. 11.18. Копирование клиента из группы
увеличить изображение
Рис. 11.19. Вставка клиента в другую группу При вставке клиента в другую группу появляется промежуточная форма перевода клиента (рис. 11.20).
Рис. 11.20. Промежуточная форма перевода клиента в другую группу В результате клиент перемещается в другую группу (рис. 11.21).
Рис. 11.24. Стандартное окно предупреждения препятствует потере данных при случайном выходе из программы
Описание базы данных
Прежде чем приступать к разработке программы, необходимо спроектировать базу данных, в которой будут находиться наши данные. БД, переведенная в формат MS Access, называется EducationCenter. В учебном центре обучаются клиенты (слушатели) на разных направлениях (администрирование, программирование, графика, офисные курсы и т. д.), и у каждого направления есть свои курсы. Офис-менеджер регистрирует клиентов в базе данных и добавляет их в группы. Группы могут иметь статус набираемых, обучаемых и закончивших обучение. Итоговые суммы доходов и расходов помещаются в отдельную таблицу. База данных также содержит информацию о сотрудниках.
База данных EducationCenter находится в каталоге (Code\Glava11\ EducationCenter).
В таблицах 11.1–11.14 приводится описание таблиц в БД и структура каждой таблицы.
|
|
Таблица 11.1. Описание таблиц |
№ |
Таблица |
Описание |
1 |
Clients |
Данные клиентов |
2 |
Course |
Описание курсов в учебном центре |
3 |
Data |
Таблица итоговых сумм (прихода и расхода) за день |
4 |
Directions |
Описание направлений курсов |
5Employees Данные о сотрудниках учебного центра
6Expenses Денежные расходы
7Group_clients Промежуточная таблица для групп и клиентов
8Groups Данные о группах
9GroupStatus Состояния групп
10Income Денежные приходы
11Payment_type Виды оплат
12PlanRealization Разницы между суммой прихода и реализованной суммой
13RealizedTable Реализованные деньги клиентов
Структура таблиц
|
|
|
|
|
|
Таблица 11.2. Clients |
|||||||
Поле |
|
|
Тип данных |
|
Описание |
||||||||
ClientID |
|
|
Счетчик |
|
|
Номер клиента |
|||||||
Fname |
|
|
Текстовый |
|
|
Имя |
|||||||
Lname |
|
|
Текстовый |
|
|
Фамилия |
|||||||
FathName |
|
|
Текстовый |
|
|
Отчество |
|||||||
LinkData |
|
|
Текстовый |
|
|
Контактные данные |
|||||||
Recorddate |
|
|
Дата/Время |
|
|
Дата записи |
|||||||
Note |
|
|
Текстовый |
|
|
Заметки |
|||||||
PaymentType |
Текстовый |
|
|
Вид оплаты |
|||||||||
IsRinged |
|
|
Логический |
|
|
Был ли оповещен клиент по телефону |
|||||||
|
Таблица 11.3. Course |
||||||||||||
Поле |
|
Тип данных |
|
Описание |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
||||
CourseID |
|
Счетчик |
|
Номер курса |
|
|
|
||||||
|
|
|
|
|
|
|
|
||||||
CourseName |
Текстовый |
|
Название курса |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
||||
PriceText |
|
Текстовый |
|
Цена в виде текста |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
||||
DirectionID |
|
Числовой |
|
Номер направления |
|
|
|
||||||
|
|
|
|
|
|
|
|
||||||
PriceNumber |
Числовой |
|
Цена курса |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
||||
Note |
|
Текстовый |
|
Заметки по курсу |
|
|
|
||||||
|
|
|
|
|
Таблица 11.4. Data |
||||||||
Поле |
|
|
|
|
Тип данных |
Описание |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
||
DataID |
|
|
|
|
Счетчик |
|
|
|
Номер |
|
|
||
|
|
|
|
|
|
|
|
|
|
||||
CurrentDate |
|
|
|
|
Дата/Время |
Текущая дата |
|
|
|||||
|
|
|
|
|
|||||||||
amountYesterday |
Денежный |
Всего вчера |
|
|
|||||||||
|
|
|
|
|
|
|
|||||||
AmountToday |
|
Денежный |
Всего сегодня |
|
|
||||||||
|
|
|
|
|
|
|
|||||||
IncomeToday |
|
Денежный |
Приход на сегодня |
|
|
||||||||
|
|
|
|
|
|
|
|||||||
expanseToday |
|
Денежный |
Расход на сегодня |
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
||||
Note |
|
|
|
|
Текстовый |
Заметки |
|
|
|||||
|
|
|
|
Таблица 11.5. Directions |
|||||||||
Поле |
|
Тип данных |
|
|
|
Описание |
|
||||||
DirectionID |
Счетчик |
Номер направления |
|
||||||||||
DirectName |
Текстовый |
Наименование направления |
|
||||||||||
Note |
|
Текстовый |
Заметки |
|
|||||||||
Таблица 11.6. Employees |
|
|
|
|
|
|
|
|
|||||||||||||||
Поле |
|
Тип данных |
|
|
|
|
Описание |
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
EmployeeID |
Счетчик |
Номер сотрудника |
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LastName |
|
Текстовый |
Фамилия |
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FirstName |
|
Текстовый |
Имя |
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
FatherName |
Текстовый |
Отчество |
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
LinkData |
|
Текстовый |
Контактные данные |
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
BirthDay |
|
Дата/Время |
Дата рождения |
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
DirectionID |
|
Числовой |
Номер направления |
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Address |
|
Текстовый |
Адрес |
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Notes |
|
Текстовый |
Заметки |
|
|
|
|
|
|
|
|
||||||||||||
|
Таблица 11.7. Expenses |
|
|
|
|
|
|
|
|
||||||||||||||
Поле |
|
|
|
|
Тип данных |
|
|
Описание |
|
|
|
||||||||||||
ExpenseID |
|
|
|
|
Счетчик |
|
|
|
|
Номер расхода |
|
|
|
||||||||||
DataID |
|
|
|
|
Числовой |
|
|
|
|
Номер даты |
|
|
|
||||||||||
Note |
|
|
|
|
Текстовый |
Заметки |
|
|
|
||||||||||||||
Summa |
|
|
|
|
Денежный |
Сумма прихода |
|
|
|
||||||||||||||
ClientID |
|
|
|
|
Числовой |
|
|
|
|
Номер клиента |
|
|
|
||||||||||
EmployeeID |
|
|
|
|
Числовой |
|
|
|
|
Номер сотрудника |
|
|
|
||||||||||
payment_typeID |
Числовой |
|
|
|
|
Номер вида оплаты |
|
|
|
||||||||||||||
Таблица 11.8. Group_clients |
|
|
|
|
|
|
|
|
|||||||||||||||
Поле |
|
|
Тип данных |
|
Описание |
|
|
|
|
||||||||||||||
GroupClientID |
Счетчик |
|
|
Номер |
|
|
|
|
|
|
|
|
|||||||||||
GroupID |
|
|
Числовой |
|
|
Номер группы |
|
|
|
|
|||||||||||||
ClientID |
|
|
Числовой |
|
|
Номер клиента |
|
|
|
|
|||||||||||||
IsPaid |
|
|
Логический |
|
|
Оплатил |
|
|
|
|
|
|
|
|
|||||||||
Notes |
|
|
Текстовый |
|
|
Заметки |
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
Таблица 11.9. Groups |
|||||||||||||||||
Поле |
|
Тип данных |
|
|
|
|
Описание |
||||||||||||||||
GroupID |
|
Счетчик |
|
Номер группы |
|||||||||||||||||||
BeginDate |
|
Дата/время |
|
Дата начала обучения |
|||||||||||||||||||
EndDate |
|
Дата/время |
|
Дата конца обучения |
|||||||||||||||||||
BeginTime |
|
Дата/время |
|
Время начала обучения |
|||||||||||||||||||
EndTime |
|
Дата/время |
|
Время конца обучения |
|||||||||||||||||||
ClientsCount |
|
Числовой |
|
Кол-во клиентов в группе |
|||||||||||||||||||
ClassNumber |
Числовой |
|
Номер класса |
||||||||||||||||||||
CourseID |
|
Числовой |
|
Номер курса |
|||||||||||||||||||
EmployeeID |
|
Числовой |
|
Номер преподователя в группе |
|||||||||||||||||||
Note |
|
Текстовый |
|
Заметки |
|
|
|
|
|
|
|
|
|||||||||||
StatusID |
|
Числовой |
|
Номер статуса группы |
|||||||||||||||||||
Таблица 11.10. GroupStatus |
|
|
|
|
|
|
|
|
|||||||||||||||
Поле |
|
Тип данных |
|
|
Описание |
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
StatusID |
|
Счетчик |
Номер статуса |
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
StatusName |
Текстовый |
Наименование |
|
|
|
|
|||||||||||||||||
|
|
Таблица 11.11. Income |
|
|
|
|
|
|
|
|
|||||||||||||
Поле |
|
|
|
|
Тип данных |
|
|
Описание |
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
IncomeID |
|
|
|
|
Счетчик |
|
|
|
|
Номер прихода |
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
IsRealized |
|
|
|
|
Логический |
Сумма реализована |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
DataID |
|
|
|
|
Числовой |
|
|
|
|
Номер даты |
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
Summa |
|
|
|
|
Денежный |
Сумма прихода |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
payment_typeID |
Числовой |
|
|
|
|
Номер вида оплаты |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
Note |
|
|
|
|
Текстовый |
Заметки |
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
ClientID |
|
|
|
|
Числовой |
|
|
|
|
Номер клиента |
|
|
|
||||||||||
Таблица 11.12. Payment_type |
|||||||||||||||||||||||
Поле |
|
|
|
|
|
|
Тип данных |
|
Описание |
|
|
||||||||||||
payment_typeID |
|
|
Счетчик |
|
|
Номер вида оплаты |
|
|
|||||||||||||||
payment_typeName |
Текстовый |
|
|
Вид оплаты |
|
|
|||||||||||||||||
Note |
|
|
|
|
|
|
Текстовый |
|
|
Заметки |
|
|
|||||||||||
|
Таблица 11.13. PlanRealization |
||||||||||||||||||||||
Поле |
|
|
|
|
|
Тип данных |
|
Описание |
|
||||||||||||||
ID |
|
|
|
|
|
Счетчик |
|
Номер записи |
|
||||||||||||||
IncomeID |
|
|
|
|
|
Числовой |
|
Номер прихода |
|
||||||||||||||
SummaPlan |
|
|
|
|
|
Денежный |
|
Запланнированная сумма |
|
||||||||||||||
SummaRealization |
Денежный |
|
Реализованная сумма |
|
|||||||||||||||||||
IsRealized |
|
|
|
|
|
Логический |
|
Реализовано |
|
||||||||||||||
DateRealization |
|
Дата/время |
|
Дата реализации |
|
||||||||||||||||||
Cause |
|
|
|
|
|
Текстовый |
|
Причина реализации |
|
||||||||||||||
Таблица 11.14. RealizedTable |
|||||||||||||||||||||||
Поле |
|
|
|
Тип данных |
|
|
Описание |
|
|||||||||||||||
ID |
Счетчик |
Номер записи |
RealizedSumm |
Денежный |
Сумма реализации |
|
|
|
RealizingDate |
Дата/время |
Дата реализации |
|
|
|
Note |
Текстовый |
Заметки |
|
|
|
ClientID |
Числовой |
Номер клиента |
Схема связи таблиц в БД
Схема связей таблиц приводится на рис. 11.25. Лучше всего открыть файл базы данных и изучить связи в окне схемы баз данных
MS Access.
увеличить изображение
Рис. 11.25. Схема базы данных EducationCenter
Разработка приложения
Перейдем теперь непосредственно к приложению. В таблицах 11.15 и 11.16 приводится описание классов, используемых во всем приложении.
Таблица 11.15. Список классов, управляющих формами
Имя класса |
Описание класса |
frmManager |
Управляет главной формой |
frmAuthorization |
Форма авторизации |
frmDirection |
Форма направления |
frmCourse |
Форма курса |
frmGroup |
Форма группы |
frmClient |
Форма клиента |
frmSearchClient |
Форма поиска клиента |
frmEmployee |
Форма сотрудников |
frmPaymentType Форма оплат
Таблица 11.16. Список дополнительных классов
Имя класса |
Описание класса |
ManagerTreeNode Абстрактный класс узла дерева в проводнике
ClientTreeNode Класс клиента в проводнике
GroupTreeNode Класс группы в проводнике
CourseTreeNode Класс курса в проводнике
DirectionTreeNode Класс направления в проводнике
CustomListItem Класс, представляющий item в ListView проводника
Описание создания программы
Далее мы последовательно будет создавать приложение Education Center. В окончательном итоге был создан результирующий файл Manager.sln (Code\Glava11\Educationcenter\Manager), содержащий ссылки на все промежуточные проекты. В папке также имеются отдельные проекты — например, пользовательские элементы управления.
Для каждой формы я привожу рисунок, на котором имеются надписи свойства Name элементов. Для большинства элементов в тексте я также привожу значения свойств, определяемых в режиме дизайна. Впрочем, большинство незначительных свойств лучше попытаться восстановить по внешнему виду, приводимому на соответствующих рисунках. Возможно, вам даже удастся найти более оптимальные значения. Если же вы будете затрудняться в настройке этих элементов — смотрите исходные проекты. (Напомню, что свойства элементов, значения которых были изменены, выделяются жирным шрифтом)
Методы InitializeComponent, Dispose, а также объявление элементов управлений во всех классах были убраны. Эти места выделены жирным шрифтом. Все комментарии, а также документирование XML-тегами в кодах также выделены жирным шрифтом.
Форма frmManager (Manager.cs)
Свойству Text формы устанавливаем значение Education Center.
Помещаем на форму из окна ToolBox следующие элементы управления:
ToolBar. Называем его tbMain. В коллекцию Buttons элемента tbMain добавляем кнопки класса ToolBarButton:
tbnRefreshMainDB — кнопка обновления главной БД;
tbnEmployees — кнопка открытия формы сотрудников frmEmployees;
tbnFind — кнопка открытия формы поиска клиентов frmSearchClient.
Создаем обработчик события ButtonClick для tbMain (см. код), который управляет функциональностью нажатия кнопок на tbMain.
TabControl. Называем его tcManager.
Свойству Dock элемента tcManager устанавливаем значение Fill. В коллекцию TabPages элемента tcManager добавляем вкладки класса TabPage:
tpWaitingRoom — свойству Text устанавливаем значение "Приемная";
tpBaseTables — свойству Text устанавливаем значение "Основные таблицы";
tpPayment — свойству Text устанавливаем значение "Оплаты";
tpExplorer — свойству Text устанавливаем значение "Проводник";
tpStatistic — свойству Text устанавливаем значение "Статистика".
Помещаем панель на страницу tpWaitingRoom, и свойству Dock панели устанавливаем Bottom. В нее добавляем кнопки btnCreateGroup (свойство Text у кнопки "Создать группу"), btnDeleteGroup (свойство Text у кнопки "Удалить группу"),
btnCreateClient (свойство Text у кнопки "Создать клиента"), btnDeleteClient (свойство Text у кнопки "Удалить клиента"). Для этих кнопок создаем обработчики события Click (btnCreateGroup_Click, btnDeleteGroup_Click, btnCreateClient_Click,
btnDeleteClient_Click соответственно, см. код программы)
На эту же страницу добавляем другую панель, и свойству Dock панели устанавливаем Top. Помещаем на эту панель 2 элемента ComboBox: cmbDirections и cmbGroupStatus и 2 Label-а со свойствами Text "Направления" и "Отображаемые группы". Для этих элементов ComboBox создаем обработчики события SelectionChangeCommitted (и реализацию этих
обработчиков в коде программы). Затем на эту же панель добавляем кнопку btnShowGroups, которая будет заполнять курсы данного выбранного направления и группы с данным выбранным статусом. Создаем для этой кнопки обработчик события Click (см. код программы).
На эту же страницу добавляем еще панель, и свойству Dock панели устанавливаем Fill. В эту панель добавляем DataGrid dgCourses (свойству Dock устанавливаем значение Left, а свойству CaptionText устанавливаем значение "Курсы"), Splitter (не изменяем свойства), панель (свойству Dock устанавливаем Fill). В последнюю добавленную панель добавляем DataGrid dgGroups (свойству Dock устанавливаем Top, а свойству CaptionText устанавливаем значение "Группы"), Splitter (свойству Dock устанавливаем значение Top), DataGrid dgClients (свойству Dock устанавливаем значение Fill, а свойству CaptionText устанавливаем значение "Клиенты") (рис. 11.25).
увеличить изображение
Рис. 11.26. Форма frmManager, страница "Приемная"
Переходим на страницу "Основные таблицы". Помещаем на страницу панель (свойству Dock устанавливаем значение Right), DataGrid dgMainTable (свойству Dock устанавливаем значение Left). На панель добавляем GroupBox и несколько элементов
RadioButton: rbClients, rbGroups, rbCourses, rbDirections, rbIncomeMain, rbOutMain, rbRealizedTableMain,
rbPaymentTypeMain, rbDataMain, rbGroupClientsMain, rbStatusMain со свойствами Text "Клиенты", "Группы", "Курсы",
"Направления", "Приходы", "Расходы", "Реализация", "Виды оплат", "Данные", "Группы-Клиенты", "Статусы группы" соответственно. Для радиокнопки rbClients создаем обработчик события CheckedChanged, и у остальных RadioButton-ов из окна событий выбираем на событие CheckedChanged обработчик rbClients_ CheckedChanged. В итоге у всех RadioButton-ов
будет один и тот же обработчик события —rbClients_ CheckedChanged (см. код программы). (рис. 11.27).
увеличить изображение
Рис. 11.27. Форма frmManager, страница "Основные таблицы"
Переходим на страницу "Оплаты". Помещаем на страницу панель (свойству Dock устанавливаем значение Bottom), на эту панель помещаем 5 элементов TextBox txtResultIncome, txtResultOut, txtBalance, txtYesterdaySumm, txtResultCount со
свойствами Text "Итого приход", "Итого расход", "Баланс", "Вчера" и "Всего" соответственно. Добавляем Button btnCalculate и создаем для него обработчик события Click (см. код программы). Также на эту панель помещаем 2 кнопки навигации по записям btnNextDate и btnPrevDate. Для каждой из кнопок создаем обработчиков события Click. Помещаем кнопку btnShowPaymentTypeForm, которая будет открывать форму frmPaymentType, и создаем для этой кнопки обработчик события Click. Помещаем на эту же страницу еще одну панель (свойству Dock устанавливаем значение Fill), на эту панель помещаем DataGrid dgIncome (свойству Dock устанавливаем значение Left, свойству CaptionText устанавливаем значение "Приход"), Splitter и DataGrid dgOut (свойству Dock устанавливаем значение Fill, свойству CaptionText устанавливаем значение "Расход") ( рис. 11.28).
увеличить изображение
Рис. 11.28. Форма frmManager, страница "Оплаты"
Переходим на страницу "Проводник". Помещаем на эту страницу панель (свойству Dock устанавливаем значение Bottom), на эту панель помещаем StatusBar sbMain, добавляем на страницу другую панель (свойству Dock устанавливаем значение Fill),
на эту панель помещаем TreeView tvManager (свойству Dock устанавливаем значение Left), Splitter, ListView lvManager
(свойству Dock устанавливаем значение Fill). Для tvManager создаем обработчики tvManager_AfterSelect, а для lvManager
— lvManager_MouseDown, lvManager_Click, lvManager_DoubleClick (см. код программы) (рис. 11.29).
увеличить изображение
Рис. 11.29. Форма frmManager, страница "Проводник"
Переходим на страницу "Статистика". Помещаем на эту страницу панель (свойству Dock устанавливаем значение Top), на эту панель помещаем элемент GroupBox. В GroupBox помещаем ComboBox cmbFilteringDirection и создаем для него обработчик cmbFilteringDirection_SelectionChangeCommitted (см. код программы), помещаем Label со свойством Text "Направления". Также в GroupBox помещаем два элемента TextBox: txtOweToEdCenter, txtEdCenterOwe и два элемента Label со свойствами
Text "Должны учебн. центру" и "Должен учеб. центр" соответственно. Добавляем также кнопку btnCalculateOwe со свойством Text "Расчет" и создаем для нее обработчик btnCalculateOwe_Click. Затем на страницу добавляем DataGrid dgStatistic
(свойство Dock устанавливаем Fill) (рис. 11.30).
увеличить изображение
Рис. 11.30. Форма frmManager, страница "Статистика"
Соединение с базой данных
После того как на форме были размещены элементы управления, на форму необходимо добавить элементы управления для подключения к базе данных.
Открываем окно Server Explorer (если оно не отображается, выберите в меню View —> Server Explorer). Устанавливаем соединение с базой данных EducationCenter.mdb. После этого переносим таблицы из базы на форму. Автоматически будут созданы адаптеры класса OleDbDataAdapter. Далее генерируем DataSet для всех таблиц на одном из адаптеров. Элемент DataSet называем
mainDataSet. В созданной схеме DataSet необходимо соединить таблицы между собой так же, как они соединены в базе данных
(рис. 11.25).
Добавляем в класс формы следующие объекты (глобальные поля, константы, свойства):
private string MainConnectionString = "DataSource=EducationCenter.mdb; Provider=Microsoft.Jet.OLEDB.4.0; persist security info=False; User ID=admin";
private int currentDataID;
