Когда вы заканчиваете изучать очередной учебник по программированию, даже как следует разобравшись со всеми его примерами, вы задаетесь вопросом — как же научиться собирать все эти детали мозаики в целое, из чего и состоят программы? Эта лекция целиком посвящена достаточно сложной программе , используемой на практике в крупном учебном центре для организации его деятельности. Почему же решено было написать свою программу, а не воспользоваться одним из существующих пакетов делопроизводства, например, мощным пакетом "1С Бухгалтерия"? Дело в том, что была необходимость в создании программы с предельно ясным и понятным интерфейсом, различным для трех групп пользователей — администраторов, менеджеров или операторов. В программе есть три группы пользователей:
Если пользователь не входит ни в одну группу, тогда он принадлежит группе FailGroup, и он не сможет запустить программу.
Открытый исходный код позволяет быстро модифицировать и изменять программу по мере необходимости. Итак, готовое решение перед вами, и если вы наберетесь терпения и до конца вникнете в его работу, а лучше — самостоятельно воспроизведете всю функциональность, то можно будет сказать, что вы отлично разобрались с теми объектами и классами, которые были приведены во всей этой книге.
Приложение в качестве базы данных использует MS SQL Server, здесь вся структура ее была сохранена, но преобразована в базу данных MS Access для облегчения локальной переносимости. Впрочем, вы без труда сможете преобразовать все подключения к базе данных в исходном виде.
Файл программы расположен в каталоге Code\Glava11\Educationcenter\Manager\bin\Debug\Manager.exe, приложение настроено на подключение к базе данных, расположенной в той же самой папке. Дополнительно, в каталоге Code\Glava11\Educationcenter\DataBase\ EducationCenter.mdb находится копия базы данных. При авторизации можно ввести любой пароль — соответствующие участки кода в форме Authorization.cs закомментированы.
При запуске программы пользователи вводят учетную запись домена и пароль. В данном случае администратор сети учебного центра создал эти группы в домене. После авторизации программа проверяет группу пользователя и определяет необходимый интерфейс (рис. 11.1).
(рис 11.1) Авторизация пользователяДалее загружаются данные из БД и появляется главная рабочая форма (рис. 11.2).
(рис 11.2) Главное окно программы. Вкладка "Приемная"На форме расположены следующие вкладки:

(рис 11.4) Вкладка "Основные таблицы"(рис 11.3) Вкладка "Оплаты"
(рис 11.6) "Проводник"(рис 11.5) "Статистика"На панели инструментов расположены следующие кнопки:
. При нажатии на эту кнопку все изменения в текущих таблицах будут внесены в базу данных.
. При нажатии на эту кнопку появляется форма сотрудников (рис. 11.7).
(рис 11.7) Поиск клиентов. При нажатии на эту кнопку открывается форма поиска клиентов (рис. 11.8.)
(рис 11.8) "Поиск клиентов"Выбрав произвольный курс на вкладке "Приемная", можно нажатием кнопки "Создать группу" открыть форму создания новой группы (рис. 11.9 и рис. 11.10).

(рис 11.10) Форма "Создание группы"(рис 11.9) Созданная группа добавляется в список группВ выбранную группу можно добавлять клиентов (рис. 11.10 и рис. 11.11).

(рис 11.11) Добавление клиента в группу(рис 11.10) Результат добавления нового клиентаДля повторного просмотра данных клиента можно, щелкнув правой кнопкой мыши на его записи, вызвать контекстное меню и выбрать пункт "Личные данные".
На форме клиента имеются дополнительные вкладки:

(рис 11.13) "Оплата и реализация"(рис 11.12) "Архив"
(рис 11.14) "Группы клиента" Проводник позволяет просматривать, а также быстро создавать необходимые нам объекты (направления, курсы, группы, клиентов) (рис. 11.15, 11.16, 11.17).

(рис 11.16) Контекстное меню "Проводника"(рис 11.15) Добавление нового клиента
(рис 11.17) Клиент, добавленный в окно "Проводника"В проводнике можно также скопировать клиента в группе для последующего добавления его в другую группу (рис. 11.18, 11.19).

(рис 11.19) Копирование клиента из группы(рис 11.18) Вставка клиента в другую группу При вставке клиента в другую группу появляется промежуточная форма перевода клиента (рис. 11.20).
(рис 11.20) Промежуточная форма перевода клиента в другую группуВ результате клиент перемещается в другую группу (рис. 11.21).
(рис 11.21) Клиент переведен в другую группуПосле произведения оплаты клиентом курса, сумма помещается в окно прихода (рис. 11.22).
(рис 11.22) Вкладка "Оплаты"При завершении работы с программой появляется диалоговое окно, предлагающее обновить базу данных, если были произведены изменения (рис. 11.23). Также стандартное окно предупреждения выхода из программы не позволяет случайно закрыть ее (рис. 11.24).

(рис 11.24) При завершении работы с программой предлагается обновить базу данных(рис 11.23) Стандартное окно предупреждения препятствует потере данных при случайном выходе из программы
Прежде чем приступать к разработке программы, необходимо спроектировать базу данных, в которой будут находиться наши данные. БД, переведенная в формат MS Access, называется EducationCenter. В учебном центре обучаются клиенты (слушатели) на разных направлениях (администрирование, программирование, графика, офисные курсы и т. д.), и у каждого направления есть свои курсы. Офис-менеджер регистрирует клиентов в базе данных и добавляет их в группы. Группы могут иметь статус набираемых, обучаемых и закончивших обучение. Итоговые суммы доходов и расходов помещаются в отдельную таблицу. База данных также содержит информацию о сотрудниках.
База данных EducationCenter находится в каталоге (Code\Glava11\ EducationCenter).
В таблицах 11.1–11.14 приводится описание таблиц в БД и структура каждой таблицы.
| № | Таблица | Описание |
|---|---|---|
| 1 | Clients | Данные клиентов |
| 2 | Course | Описание курсов в учебном центре |
| 3 | Data | Таблица итоговых сумм (прихода и расхода) за день |
| 4 | Directions | Описание направлений курсов |
| 5 | Employees | Данные о сотрудниках учебного центра |
| 6 | Expenses | Денежные расходы |
| 7 | Group_clients | Промежуточная таблица для групп и клиентов |
| 8 | Groups | Данные о группах |
| 9 | GroupStatus | Состояния групп |
| 10 | Денежные приходы | |
| 11 | Payment_type | Виды оплат |
| 12 | PlanRealization | Разницы между суммой прихода и реализованной суммой |
| 13 | RealizedTable | Реализованные деньги клиентов |
| Поле | Тип данных | Описание |
|---|---|---|
| ClientID | Счетчик | Номер клиента |
| Fname | Текстовый | Имя |
| Lname | Текстовый | Фамилия |
| FathName | Текстовый | Отчество |
| LinkData | Текстовый | Контактные данные |
| Recorddate | Дата/Время | Дата записи |
| Note | Текстовый | Заметки |
| PaymentType | Текстовый | Вид оплаты |
| IsRinged | Логический | Был ли оповещен клиент по телефону |
| Поле | Тип данных | Описание |
|---|---|---|
| CourseID | Счетчик | Номер курса |
| CourseName | Текстовый | Название курса |
| PriceText | Текстовый | Цена в виде текста |
| DirectionID | Числовой | Номер направления |
| PriceNumber | Числовой | Цена курса |
| Note | Текстовый | Заметки по курсу |
| Поле | Тип данных | Описание |
|---|---|---|
| DataID | Счетчик | Номер |
| CurrentDate | Дата/Время | Текущая дата |
| amountYesterday | Денежный | Всего вчера |
| AmountToday | Денежный | Всего сегодня |
| IncomeToday | Денежный | Приход на сегодня |
| expanseToday | Денежный | Расход на сегодня |
| Note | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| DirectionID | Счетчик | Номер направления |
| DirectName | Текстовый | Наименование направления |
| Note | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| EmployeeID | Счетчик | Номер сотрудника |
| LastName | Текстовый | Фамилия |
| FirstName | Текстовый | Имя |
| FatherName | Текстовый | Отчество |
| LinkData | Текстовый | Контактные данные |
| BirthDay | Дата/Время | Дата рождения |
| DirectionID | Числовой | Номер направления |
| Address | Текстовый | Адрес |
| Notes | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| ExpenseID | Счетчик | Номер расхода |
| DataID | Числовой | Номер даты |
| Note | Текстовый | Заметки |
| Summa | Денежный | Сумма прихода |
| ClientID | Числовой | Номер клиента |
| EmployeeID | Числовой | Номер сотрудника |
| payment_typeID | Числовой | Номер вида оплаты |
| Поле | Тип данных | Описание |
|---|---|---|
| GroupClientID | Счетчик | Номер |
| Числовой | Номер группы | |
| ClientID | Числовой | Номер клиента |
| IsPaid | Логический | Оплатил |
| Notes | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| Счетчик | Номер группы | |
| BeginDate | Дата/время | Дата начала обучения |
| EndDate | Дата/время | Дата конца обучения |
| BeginTime | Дата/время | Время начала обучения |
| EndTime | Дата/время | Время конца обучения |
| ClientsCount | Числовой | Кол-во клиентов в группе |
| ClassNumber | Числовой | Номер класса |
| CourseID | Числовой | Номер курса |
| EmployeeID | Числовой | Номер преподователя в группе |
| Note | Текстовый | Заметки |
| StatusID | Числовой | Номер статуса группы |
| Поле | Тип данных | Описание |
|---|---|---|
| StatusID | Счетчик | Номер статуса |
| StatusName | Текстовый | Наименование |
| Поле | Тип данных | Описание |
|---|---|---|
| IncomeID | Счетчик | Номер прихода |
| IsRealized | Логический | Сумма реализована |
| DataID | Числовой | Номер даты |
| Summa | Денежный | Сумма прихода |
| payment_typeID | Числовой | Номер вида оплаты |
| Note | Текстовый | Заметки |
| ClientID | Числовой | Номер клиента |
| Поле | Тип данных | Описание |
|---|---|---|
| payment_typeID | Счетчик | Номер вида оплаты |
| payment_typeName | Текстовый | Вид оплаты |
| Note | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| ID | Счетчик | Номер записи |
| IncomeID | Числовой | Номер прихода |
| SummaPlan | Денежный | Запланнированная сумма |
| Денежный | Реализованная сумма | |
| IsRealized | Логический | Реализовано |
| DateRealization | Дата/время | Дата реализации |
| Cause | Текстовый | Причина реализации |
| Поле | Тип данных | Описание |
|---|---|---|
| ID | Счетчик | Номер записи |
| RealizedSumm | Денежный | Сумма реализации |
| RealizingDate | Дата/время | Дата реализации |
| Note | Текстовый | Заметки |
| ClientID | Числовой | Номер клиента |
Схема связей таблиц приводится на рис. 11.25. Лучше всего открыть файл базы данных и изучить связи в окне схемы баз данных MS Access.
(рис 11.25) Схема базы данных EducationCenter
Перейдем теперь непосредственно к приложению. В таблицах 11.15 и 11.16 приводится описание классов, используемых во всем приложении.
| Имя класса | Описание класса |
|---|---|
| frmManager | Управляет главной формой |
| frmAuthorization | Форма авторизации |
| frmDirection | Форма направления |
| frmCourse | Форма курса |
| frmGroup | Форма группы |
| frmClient | Форма клиента |
| frmSearchClient | Форма поиска клиента |
| frmEmployee | Форма сотрудников |
| frmPaymentType | Форма оплат |
| Имя класса | Описание класса |
|---|---|
| ManagerTreeNode | Абстрактный класс узла дерева в проводнике |
| ClientTreeNode | Класс клиента в проводнике |
| GroupTreeNode | Класс группы в проводнике |
| CourseTreeNode | Класс курса в проводнике |
| DirectionTreeNode | Класс направления в проводнике |
| CustomListItem | Класс, представляющий item в ListView проводника |
Далее мы последовательно будет создавать приложение
Для каждой формы я привожу рисунок, на котором имеются надписи свойства Name элементов. Для большинства элементов в тексте я также привожу значения свойств, определяемых в режиме дизайна. Впрочем, большинство незначительных свойств лучше попытаться восстановить по внешнему виду, приводимому на соответствующих рисунках. Возможно, вам даже удастся найти более оптимальные значения. Если же вы будете затрудняться в настройке этих элементов — смотрите исходные проекты. (Напомню, что свойства элементов, значения которых были изменены, выделяются жирным шрифтом)
Методы InitializeComponent, Dispose, а также объявление элементов управлений во всех классах были убраны. Эти места выделены жирным шрифтом. Все комментарии, а также документирование XML-тегами в кодах также выделены жирным шрифтом.
Свойству Text формы устанавливаем значение .
Помещаем на форму из окна 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 ). На панель добавляем 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, страница "Основные таблицы" TextBox txtResultIncome, txtResultOut, txtBalance, txtYesterdaySumm, txtResultCount со свойствами Text "Итого приход", "Итого расход", "Баланс", "Вчера" и "Всего" соответственно. Добавляем Button btnCalculate и создаем для него обработчик события Click (см. код программы). Также на эту панель помещаем 2 кнопки навигации по записям btnNextDate и btnPrevDate. Для каждой из кнопок создаем обработчиков события Click. Помещаем кнопку btnShowPaymentTypeForm, которая будет открывать форму frmPaymentType, и создаем для этой кнопки обработчик события Click. Помещаем на эту же страницу еще одну панель (свойству Dock устанавливаем значение Fill ), на эту панель помещаем DataGrid dgIncome (свойству Dock устанавливаем значение Left, свойству CaptionText устанавливаем значение "Приход"), 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;
private TreeNode selectedNode;
private string selectedNodeName = "";
private TreeNodeType treeNodeType;
private TreeNode MainTreeNode = null;
private DirectionTreeNode[] dtns = null;
private Color itemColor;
private bool ItemCanMove = false;
private CustomListItem selectedItem; // Выбранный заголовок item на элементе ListView проводника
private CurrencyManager currManagerIncome;
private CurrencyManager currManagerOut;
private CurrencyManager currManagerPaymentType;
private CurrencyManager currManagerTotal;
internal frmAuthorization.UserGroup userGroup;
private bool SelectingClient = false; // Переменная, отвечающая за возможность выбора клиента
CurrencyManager cmClientsTable;
CurrencyManager cmGroupsTable;
TreeNode oldGroupNode;
static private int dataID = 0;
static internal int DataID
{
get { return dataID; }
}
Добавим в класс формы frmManager методы, указываемые в таблице 11.17.
| Сигнатура методов | Описание методов |
|---|---|
private void LoadCoursesDataGrid(int directionID) |
Загрузка объекта DataGrid списком курсов |
private void InitDefaultSettings() |
Восстановление настроек по умолчанию |
internal void CheckEmployeesBirthDays() |
Проверка наличия дней рождения |
internal void PasteDateRow() |
Вставка новой записи текущей даты в таблицу. data, если таковой не существует |
private void SetAllowDBNullForMainDataSet() |
Разрешение null-значений для таблиц |
internal void FillPaymentsPage() |
Загрузка страницы оплат |
private void AddNewClient() |
Добавление нового клиента |
private void AddNewGroup() |
Добавление новой группы из проводника |
private void AddNewGroupWaitingRoom() |
Добавление новой группы со страницы "Приемная" |
private void AddNewCourse() |
Добавление нового курса |
private void AddNewDirection() |
Добавление нового направления |
internal void Explorer() |
Заполнение метода данными из главной БД |
private void FillListView(TreeNodeType treeNodeType, TreeNode treeNode) |
Заполнение элемента ListView данными узла дерева |
private void TransferClients(TreeNode oldGroup, TreeNode newGroup) |
Перевод выбранных клиентов из одной группы в другую |
private void SearchClient() |
Поиск клиентов |
private void OpenEmployees() |
Форма сотрудников |
private void InsertToDataGrid(DataTable table) |
Заполнение элемента DataGrid на странице "Основные таблицы" |
internal void LoadMainDataBase() |
Загрузка главной БД |
private void UpdateMainData() |
Обновление главной БД |
private void ChangeStatus(ListView.SelectedListViewItemCollection items, StatusType status) |
Изменение статуса группы из проводника |
private void CalculateTotalPage(DataRow currentTotalRow) |
Итоговые расчеты на текущую запись в таблице data |
private void OpenItemInForm(TreeNodeType treeNodeType) |
Открывание заголовка item в элементе ListView |
private void AddNewClientWaitingRoom() |
Добавление нового клиента со страницы "Приемная" |
private void SetWitdhForDataGrids() |
Установка размера окон — используется при изменении размера окон |
private void DesigneDataGrids() |
Установка дизайна элементов DataGrid |
private double ClientIncomeSumm(int clientID) |
Сумма прихода клиента |
private double ClientRealizedSumm(int clientID) |
Реализованная сумма клиента |
private void GetOweStatistic() |
Вычисление должников — метод требуется для страницы "Статистика" |
private void RemoveTempFindControl() |
Удаление временных контролов поиска со страницы "Приемная" |
private DataRow GetTablesRow(DataTable table, int rowIndex, CurrencyManager currManager) |
Создание новой или отображение существующей записи таблицы на вкладке "Приемная" |
Листинг формы frmManager:
using System;
using System.Drawing;
using System.Data;
using System.Data.SqlTypes;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.Globalization;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.InteropServices;
using System.Reflection;
using Manager.Forms;
using System.Threading;
namespace Manager
{
internal class frmManager : System.Windows.Forms.Form
{
//Элементы управления
#region Константы
const int Delta = 10; // Смещение заголовка item по оси Х вправо относительно курсора
#endregion
#region Глобальные переменные
#region Путь к БД
private string MainConnectionString = "Data Source=EducationCenter.mdb;Provider=Microsoft.Jet.OLEDB.4.0;persist security info=False;User ID=admin";
#endregion
#region Глобальные поля
private int currentDataID;
private TreeNode selectedNode;
private string selectedNodeName = "";
private TreeNodeType treeNodeType;
private TreeNode MainTreeNode = null;
private DirectionTreeNode[] dtns = null;
private Color itemColor;
private CustomListItem selectedItem; // Выбранный заголовок item на элементе ListView в проводнике.
private CurrencyManager currManagerIncome;
private CurrencyManager currManagerOut;
private CurrencyManager currManagerPaymentType;
private CurrencyManager currManagerTotal;
internal frmAuthorization.UserGroup userGroup;
private bool SelectingClient = false; // Переменная, определяющая возможность выбора клиента
CurrencyManager cmClientsTable;
CurrencyManager cmGroupsTable;
TreeNode oldGroupNode;
#endregion
#region Глобальные свойства
static private int dataID = 0;
static internal int DataID
{
get { return dataID; }
}
#endregion
#endregion
#region Конструкторы
// Главный конструктор
internal frmManager()
{
try
{
InitializeComponent();
this.DesigneDataGrids(); // Дизайн таблиц в элементах datagrid.
this.InitDefaultSettings(); // Установка значений по умолчанию.
this.SetAllowDBNullForMainDataSet(); // Дополнительный метод для mainDataSet-a
this.CheckEmployeesBirthDays();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
#endregion
#region Перечисления
/// <summary>
/// Это перечисление содержит константы типов узлов в главном дереве
/// </summary>
internal enum TreeNodeType
{
Top,
Direction,
Course,
Group
}
/// <summary>
/// Это перечисление содержит константы статусов группы
/// </summary>
internal enum StatusType
{
Filling = 1,
Learning = 2,
Finished = 3
}
#endregion
#region Структуры
/// <summary>
/// Item в DataGrid
/// </summary>
public struct DataGridItem
{
private string text;
public string Text
{
get { return text; }
set { text = value; }
}
internal DataGridItem(string text)
{
this.text = text;
}
}
#endregion
#region Мои методы
#region Windows Form Designer generated code
private void InitializeComponent()
{
// Описание метода
}
#endregion
// Загружаем список курсов в объект DataGrid
private void LoadCoursesDataGrid(int directionID)
{
try
{
DataView dvCourses = new DataView(mainDataSet.course);
dvCourses.RowFilter = "directionID = " + directionID.ToString();
dgCourses.DataSource = dvCourses;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Устанавливаем настройки по умолчанию
private void InitDefaultSettings()
{
// Значения по умолчанию в главных таблицах
mainDataSet.PlanRealization.Columns["IsRealized"].DefaultValue = false;
mainDataSet.PlanRealization.Columns["SummaPlan"].DefaultValue = 0;
mainDataSet.PlanRealization.Columns["SummaRealization"].DefaultValue = 0;
mainDataSet.PlanRealization.Columns["Cause"].DefaultValue = "";
mainDataSet.income.Columns["IsRealized"].DefaultValue = false;
mainDataSet.income.Columns["payment_typeID"].DefaultValue = 1;
mainDataSet.income.Columns["clientID"].DefaultValue = 1;
mainDataSet.income.Columns["summa"].DefaultValue = 0;
mainDataSet.expenses.Columns["payment_typeID"].DefaultValue = 1;
mainDataSet.expenses.Columns["clientID"].DefaultValue = 1;
mainDataSet.expenses.Columns["employeeID"].DefaultValue = 1;
mainDataSet.data.Columns["amountYesterday"].DefaultValue = 0;
mainDataSet.data.Columns["amountToday"].DefaultValue = 0;
mainDataSet.data.Columns["incomeToday"].DefaultValue = 0;
mainDataSet.data.Columns["expanseToday"].DefaultValue = 0;
// Добавляем временную колонку EmployeeName в таблицу Employees для отображения
// на форме группы
DataColumn employeeName = new DataColumn("EmployeeName");
employeeName.Expression = "LastName + \' \' + FirstName";
employeeName.DataType = typeof(string);
mainDataSet.employees.Columns.Add(employeeName);
mainDataSet.groups.Columns["beginDate"].DefaultValue = DateTime.Now.Date;
mainDataSet.groups.Columns["endDate"].DefaultValue = DateTime.Now.Date;
mainDataSet.groups.Columns["beginTime"].DefaultValue = DateTime.Now.Date;
mainDataSet.groups.Columns["endTime"].DefaultValue = DateTime.Now.Date;
mainDataSet.clients.Columns["isRinged"].DefaultValue = false;
// Обработчики для главной формы
this.WindowState = FormWindowState.Maximized;
this.Resize += new EventHandler(frmManager_Resize);
this.Closed += new EventHandler(frmManager_Closed);
this.Load += new EventHandler(frmManager_Load);
this.Resize += new EventHandler(frmManager_Resize);
// Устанавливаем размеры окон — метод используется,
// когда изменяются размеры окон
this.SetWitdhForDataGrids();
// Другие настройки *************************
miList.Checked = true;
lvManager.Activation = ItemActivation.OneClick;
string date = "dd MMMM yyyy, dddd";
lblDateTime.Text = DateTime.Now.Date.ToString(date);
hpManager.SetShowHelp(this, true);
// ******************************************
// Связываем объекты CurrencyManager c таблицами
currManagerIncome = (CurrencyManager)this.BindingContext[mainDataSet, "data.dataincome"];
currManagerOut = (CurrencyManager)this.BindingContext[mainDataSet, "data.dataexpenses"];
currManagerPaymentType = (CurrencyManager)this.BindingContext[mainDataSet, "payment_type"];
// Обработчики событий CheckedChanged для RadioButton-ов,
// отображающих таблицы главной БД
rbClients.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbCourses.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbDataMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbDirections.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbEmployees.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbGroupClientsMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbGroups.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbIncomeMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbOutMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbPaymentTypeMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbRealizedTableMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbStatusMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
// Обработчики событий элементов управления.
dgCourses.Click += new EventHandler(dgCourses_Click);
dgGroups.Click += new EventHandler(dgGroups_Click);
dgClients.MouseUp += new MouseEventHandler(dgClients_MouseUp);
dgIncome.MouseUp += new MouseEventHandler(dgIncome_MouseUp);
dgOut.MouseUp += new MouseEventHandler(dgIncome_MouseUp);
btnCreateClient.Click += new EventHandler(btnCreateClient_Click);
btnCalculateOwe.Click += new EventHandler(btnCalculateOwe_Click);
btnFindPasteClient.Click += new EventHandler(btnFindPasteClient_Click);
btnShowGroups.Click += new EventHandler(btnShowGroups_Click);
btnShowPaymentTypeForm.Click += new EventHandler(btnShowPaymentTypeForm_Click);
btnNextDate.Click += new EventHandler(btnNextDate_Click);
btnPrevDate.Click += new EventHandler(btnPrevDate_Click);
btnDeleteClient.Click += new EventHandler(btnDeleteClient_Click);
btnDeleteGroup.Click += new EventHandler(btnDeleteGroup_Click);
cmbFilteringDirection.SelectionChangeCommitted+=new
EventHandler(cmbFilteringDirection_SelectionChangeCommitted);
cmiFindIncomeOutClient.Click+= new EventHandler(cmiFindIncomeOutClient_Click);
tbMain.ButtonClick += new ToolBarButtonClickEventHandler(tbMain_ButtonClick);
miChangePassword.Click += new EventHandler(miChangePassword_Click);
// Настройки и инициализация главной БД
mainDataSet.PlanRealization.RowChanged += new DataRowChangeEventHandler(PlanRealization_RowChanged);
mainDataSet.income.RowChanged += new DataRowChangeEventHandler(income_RowChanged);
dgGroups.DataSource = null;
}
// Проверка дней рождения
internal void CheckEmployeesBirthDays()
{
try
{
DateTime nowDate = DateTime.Now.Date;
ArrayList employees = new ArrayList();
bool flag = false;
foreach (DataRow employeeRow in mainDataSet.employees.Rows)
{
if (employeeRow.IsNull("birthDay"))
continue;
DateTime emplBirthDay = (DateTime)employeeRow["birthDay"];
bool isBirthDay = ((emplBirthDay.Month == nowDate.Month) (emplBirthDay.Day == nowDate.Day));
if (isBirthDay)
{
string emplName = String.Format("{0} {1}.",
employeeRow["LastName"].ToString(),
employeeRow["FirstName"].ToString());
employees.Add(emplName);
flag = true;
}
}
if (flag)
{
BirthDayControl.BirthDay birth = new BirthDayControl.BirthDay(employees);
this.Controls.Add(birth);
birth.Location = new Point(this.Width / 2, this.Height / 2);
birth.BringToFront();
birth.Show();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Вставка новой записи текущей даты в таблицу data, если таковой не существует
internal void PasteDateRow()
{
try
{
string nowDate = DateTime.Now.Date.ToString("dd MMMM yyyy");
foreach (DataRow totalRow in mainDataSet.data.Rows)
{
DateTime dt = (DateTime)totalRow["currentDate"];
if (dt.Date.ToString("dd MMMM yyyy") == nowDate)
{
dataID = (int)totalRow["dataID"];
currentDataID = dataID;
return;
}
}
// Добавляем запись текущего времени в главную таблицу data, с учетом,
// что в data может не быть записи
DataRow newDataRow = mainDataSet.data.NewRow();
newDataRow["currentDate"] = nowDate;
newDataRow["incomeToday"] = 0;
newDataRow["expanseToday"] = 0;
newDataRow["note"] = "";
mainDataSet.data.Rows.Add(newDataRow);
DataRow lastRow = null;
if (mainDataSet.data.Rows.Count != 0)
{
lastRow = mainDataSet.data.Rows[mainDataSet.data.Rows.Count - 1];
newDataRow["amountYesterday"] = (decimal)lastRow["amountToday"];
DataRow lastDataRow = mainDataSet.data.Rows[mainDataSet.data.Rows.Count - 1];
int lastDataID = (int)lastDataRow["dataID"];
dataID = lastDataID;
mainDataSet.income.Columns["dataID"].DefaultValue = lastDataID;
mainDataSet.expenses.Columns["dataID"].DefaultValue = lastDataID;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Разрешение null-значений для таблиц
private void SetAllowDBNullForMainDataSet()
{
try
{
// Разрешение null-значений для таблицы group
mainDataSet.groups.Columns["beginDate"].AllowDBNull = true;
mainDataSet.groups.Columns["endDate"].AllowDBNull = true;
mainDataSet.groups.Columns["beginTime"].AllowDBNull = true;
mainDataSet.groups.Columns["endTime"].AllowDBNull = true;
mainDataSet.groups.Columns["clientsCount"].AllowDBNull = true;
mainDataSet.groups.Columns["classNumber"].AllowDBNull = true;
mainDataSet.groups.Columns["courseID"].AllowDBNull = true;
mainDataSet.groups.Columns["employeeID"].AllowDBNull = true;
mainDataSet.groups.Columns["StatusID"].AllowDBNull = true;
mainDataSet.groups.Columns["note"].AllowDBNull = true;
// Разрешение null-значений для таблицы group
mainDataSet.clients.Columns["recorddate"].AllowDBNull = true;
// Разрешение null-значений для таблицы course
mainDataSet.course.Columns["priceNumber"].AllowDBNull = true;
// Разрешение null-значений для таблицы employees
mainDataSet.employees.Columns["birthDay"].AllowDBNull = true;
// Разрешение null-значений для таблицы GroupClients
mainDataSet.group_clients.Columns["IsPaid"].AllowDBNull = true;
// Разрешение null-значений для таблицы income
mainDataSet.income.Columns["IsRealized"].AllowDBNull = true;
mainDataSet.income.Columns["Payment_TypeID"].AllowDBNull = true;
// Разрешение null-значений для таблицы PlanRealization
mainDataSet.PlanRealization.Columns["IsRealized"].AllowDBNull = true;
mainDataSet.PlanRealization.Columns["DateRealization"].AllowDBNull = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Загружаем страницу оплат
internal void FillPaymentsPage()
{
try
{
dgIncome.DataSource = mainDataSet;
dgIncome.DataMember = "data.dataincome";
dgOut.DataSource = mainDataSet;
dgOut.DataMember = "data.dataexpenses";
currManagerTotal = (CurrencyManager)this.BindingContext[mainDataSet, "data"];
txtYesterdaySumm.DataBindings.Add("Text", mainDataSet, "data.amountYesterday");
txtResultCount.DataBindings.Add("Text", mainDataSet, "data.amountToday");
currManagerTotal.Position = mainDataSet.data.Rows.Count - 1;
DataView dvTotal = new DataView(mainDataSet.data);
int prevDataID = 0;
int lastDataID = 0;
lastDataID = (int)mainDataSet.data.Rows[mainDataSet.data.Rows.Count - 1]["dataID"];
if (mainDataSet.data.Rows.Count - 2 != -1)
prevDataID = (int)mainDataSet.data.Rows[mainDataSet.data.Rows.Count - 2]["dataID"];
else
prevDataID = lastDataID;
dvTotal.RowFilter = "dataID >= " + prevDataID.ToString() + " AND dataID <= " + lastDataID.ToString();
dgMainTable.DataSource = dvTotal;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Добавляем нового клиента
private void AddNewClient()
{
frmClient f = new frmClient(this.mainDataSet);
f.lblClientID.Text = "Новый клиент";
f.Text += selectedNodeName;
MainDataSet.groupsRow group = (MainDataSet.groupsRow)selectedNode.Tag;
f.GroupID = (int)group["groupID"];
f.tpClientGroups.Hide();
if (f.ShowDialog() == DialogResult.OK)
{
try
{
// Добавляем данные в табл. clients
DataRow newClientRow = mainDataSet.clients.NewRow();
newClientRow["fname"] = f.txtFirstName.Text;
newClientRow["lname"] = f.txtLastName.Text;
newClientRow["fathName"] = f.txtFatherName.Text;
newClientRow["linkData"] = f.txtPhones.Text;
newClientRow["recorddate"] = f.dtpRecordDate.Value;
newClientRow["note"] = f.txtNotes.Text;
mainDataSet.clients.Rows.Add(newClientRow);
// Добавляем данные в табл. Group_Clients
DataRow newGroupClientRow = mainDataSet.group_clients.NewRow();
DataRow selectedGroup = (DataRow)selectedNode.Tag;
int clientID = (int)newClientRow[0];
newGroupClientRow["clientID"] = clientID;
newGroupClientRow["groupID"] = (int)selectedGroup[0];
mainDataSet.group_clients.Rows.Add(newGroupClientRow);
selectedGroup["clientsCount"] = lvManager.Items.Count + 1;
// Добавляем данные в табл. income
DataView dvIncome = new DataView(mainDataSet.income);
dvIncome.RowFilter = "clientID = " + clientID.ToString();
if (dvIncome == null)
{
DataRow newIncomeRow = mainDataSet.income.NewRow();
newIncomeRow["ClientID"] = clientID;
newIncomeRow["dataID"] = DataID;
newIncomeRow["IsRealized"] = 0;
mainDataSet.income.Rows.Add(newIncomeRow);
}
// Refresh ListView
this.FillListView(treeNodeType, selectedNode);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
// Добавляем новую группу из проводника
private void AddNewGroup()
{
MainDataSet.groupsRow newGroup = (MainDataSet.groupsRow)mainDataSet.groups.NewRow();
frmGroup f = new frmGroup(mainDataSet);
f.Text += selectedNodeName;
f.lblGroupID.Text = "Новая группа";
if (f.ShowDialog() == DialogResult.OK)
{
try
{
DataRow courseRow = (DataRow)selectedNode.Tag;
int courseID = (int)courseRow["courseID"];
string stringBeginDate = f.dtpBeginDate.Value.ToString("dd MMMM yyyy");
newGroup["beginDate"] = DateTime.Parse(stringBeginDate);
string stringEndDate = f.dtpEndDate.Value.ToString("dd MMMM yyyy");
newGroup["endDate"] = DateTime.Parse(stringEndDate);
string stringBeginTime = f.dtpBeginTime.Value.ToString("HH:mm");
newGroup["beginTime"] = DateTime.Parse(stringBeginTime);
string stringEndTime = f.dtpEndTime.Value.ToString("HH:mm");
newGroup["endTime"] = DateTime.Parse(stringEndTime);
newGroup["classNumber"] = int.Parse(f.cmbClassNumber.Text);
newGroup["clientsCount"] = 0;
newGroup["courseID"] = courseID;
DataRowView employeeRowView = (DataRowView)f.cmEmployees.Current;
newGroup["employeeID"] = (int)employeeRowView.Row["employeeID"];
newGroup["note"] = f.txtNotes.Text;
int statusID = (int)mainDataSet.GroupStatus.Rows[f.cmbEmployee.SelectedIndex]["StatusID"];
newGroup["StatusID"] = statusID;
mainDataSet.groups.AddgroupsRow(newGroup);
GroupTreeNode gtn = new GroupTreeNode();
gtn.Tag = newGroup;
gtn.Text = newGroup["groupID"].ToString();
gtn.ImageIndex = 6;
if (statusID == 1) // Группа набирается
{
gtn.ForeColor = Color.Red;
}
else if (statusID == 2) // Группа обучается
{
gtn.ForeColor = Color.Green;
}
else if (statusID == 3) // Группа закончила обучение
{
gtn.ForeColor = Color.Blue;
}
selectedNode.Nodes.Add(gtn);
this.FillListView(treeNodeType, selectedNode);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
// Добавляем новую группу со страницы 'Приемная'
private void AddNewGroupWaitingRoom()
{
try
{
MainDataSet.groupsRow newGroup = (MainDataSet.groupsRow)mainDataSet.groups.NewRow();
frmGroup f = new frmGroup(mainDataSet);
int courseRowID = dgCourses.CurrentRowIndex;
DataView dvCourses = (DataView)dgCourses.DataSource;
DataRow course = dvCourses[courseRowID].Row;
f.cmbEmployee.DataSource = mainDataSet.employees;
f.cmbEmployee.DisplayMember = mainDataSet.employees.LastNameColumn.ToString();
f.Text += course["courseName"].ToString();
f.lblGroupID.Text = "Новая группа";
if (f.ShowDialog() == DialogResult.OK)
{
try
{
int courseID = (int)course[0];
newGroup["beginDate"] = f.dtpBeginDate.Value;
newGroup["endDate"] = f.dtpEndDate.Value;
newGroup["beginTime"] = f.dtpBeginTime.Value;
newGroup["endTime"] = f.dtpEndTime.Value;
newGroup["classNumber"] = int.Parse(f.cmbClassNumber.Text);
newGroup["clientsCount"] = 0;
newGroup["courseID"] = courseID;
DataRowView employeeRowView = (DataRowView)f.cmEmployees.Current;
newGroup["employeeID"] = (int)employeeRowView.Row["employeeID"];
newGroup["note"] = f.txtNotes.Text;
int statusID = (int)mainDataSet.GroupStatus.Rows[f.cmbStatus.SelectedIndex][0];
newGroup["StatusID"] = statusID;
mainDataSet.groups.AddgroupsRow(newGroup);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Добавляем новый курс
private void AddNewCourse()
{
frmCourse f = new frmCourse();
DataRow newCourse = mainDataSet.course.NewRow();
int newCourseID = (int)newCourse["courseID"];
f.Text += selectedNodeName;
f.lblCourseNumber.Text += newCourseID.ToString();
if (f.ShowDialog() == DialogResult.OK)
{
try
{
DataRow directionRow = (DataRow)selectedNode.Tag;
int directionID = (int)directionRow[0];
newCourse["courseName"] = f.txtCourseName.Text;
newCourse["priceNumber"] = decimal.Parse(f.txtCoursePrice.Text);
newCourse["directionID"] = directionID;
mainDataSet.course.Rows.Add(newCourse);
CourseTreeNode ctn = new CourseTreeNode();
ctn.Tag = newCourse;
ctn.Text = newCourse[1].ToString();
ctn.ImageIndex = 10;
ctn.ForeColor = Color.Green;
selectedNode.Nodes.Add(ctn);
this.FillListView(treeNodeType, selectedNode);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
// Добавляем новое направление
private void AddNewDirection()
{
frmDirection f = new frmDirection();
if (f.ShowDialog() == DialogResult.OK)
{
try
{
DataRow newDirection = mainDataSet.directions.NewRow();
newDirection["directName"] = f.txtDirectionName.Text;
newDirection["note"] = f.txtDirectionNote.Text;
mainDataSet.directions.Rows.Add(newDirection);
DirectionTreeNode dtn = new DirectionTreeNode();
dtn.Tag = newDirection;
dtn.Text = newDirection["directName"].ToString();
dtn.ImageIndex = 11;
dtn.ForeColor = Color.RoyalBlue;
selectedNode.Nodes.Add(dtn);
this.FillListView(treeNodeType, selectedNode);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
/// <summary>
/// Этот метод заполняет дерево данными из главной БД
/// </summary>
internal void Explorer()
{
try
{
tvManager.Sorted = true;
tvManager.Nodes.Clear();
lvManager.Items.Clear();
// Вершина TreeView
MainTreeNode = new TreeNode("Учебный центр");
tvManager.Nodes.Add(MainTreeNode);
tvManager.Nodes[0].ImageIndex = 0;
tvManager.Nodes[0].ForeColor = Color.Blue;
dtns = new DirectionTreeNode[mainDataSet.directions.Rows.Count];
DirectionTreeNode dtn = null;
for (int k = 0; k < mainDataSet.directions.Rows.Count; k++)
{
//Добавляем направление с дочерними узлами
dtn = new DirectionTreeNode();
dtn.NDDataSet = this.mainDataSet;
dtn.DirectionID = (int)mainDataSet.directions.Rows[k]["directionID"];
dtn.DirectionName = dtn.Text = mainDataSet.directions.Rows[k]["directName"].ToString();
dtn.DirectionNote = mainDataSet.directions.Rows[k]["note"].ToString();
dtn.ImageIndex = 11;
dtn.ForeColor = Color.RoyalBlue;
dtn.GetChilds();
dtn.Tag = mainDataSet.directions.Rows[k];
dtns[k] = dtn;
dtn = null;
}
MainTreeNode.Nodes.AddRange(dtns);
MainTreeNode.Expand();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Заполняем ListView данными узла дерева
private void FillListView(TreeNodeType treeNodeType, TreeNode treeNode)
{
try
{
int imageIndexListView = 11;
TreeNode tempTreeNode = null;
lvManager.Columns.Clear();
DataRow selectedDirection = null;
DataRow selectedCourse = null;
DataRow selectedGroup = null;
switch (treeNodeType)
{
case TreeNodeType.Top:
// В ListView находятся направления
tempTreeNode = treeNode;
imageIndexListView = 11;
break;
case TreeNodeType.Direction:
// В ListView находятся курсы
DirectionTreeNode dtn = new DirectionTreeNode();
dtn.NDDataSet = this.mainDataSet;
selectedDirection = (DataRow)selectedNode.Tag;
dtn.DirectionID = (int)selectedDirection["directionID"];
dtn.GetChilds();
tempTreeNode = treeNode;
imageIndexListView = 10;
break;
case TreeNodeType.Course:
// В ListView находятся группы
CourseTreeNode ctn = new CourseTreeNode();
ctn.NDDataSet = this.mainDataSet;
selectedCourse = (DataRow)selectedNode.Tag;
ctn.CourseID = (int)selectedCourse["courseID"];
ctn.GetChilds();
tempTreeNode = treeNode;
imageIndexListView = 6;
break;
case TreeNodeType.Group:
// В ListView находятся клиенты
GroupTreeNode gtn= new GroupTreeNode();
gtn.NDDataSet = this.mainDataSet;
selectedGroup = (DataRow)selectedNode.Tag;
gtn.GroupID = (int)selectedGroup["groupID"];
gtn.GetChilds();
tempTreeNode = gtn;
imageIndexListView = 7;
break;
}
lvManager.Items.Clear();
string str = "";
// В ListView добавляем группы
if (tempTreeNode is CourseTreeNode)
{
// Добавляем в ListView колонки из таблицы groups
for (int i = 0; i < mainDataSet.groups.Columns.Count; i++)
{
ColumnHeader ch = new ColumnHeader();
ch.Text = mainDataSet.groups.Columns[i].Caption;
ch.Width = 100;
lvManager.Columns.Add(ch);
}
MainDataSet.courseRow course = (MainDataSet.courseRow)tempTreeNode.Tag;
DataRow[] groups = course.GetChildRows("coursegroups");
for(int i = 0; i < groups.Length; i++)
{
// В ListViewItem добавляем массив строк данной записи из табл. groups
string[] subitems = new string[groups[i].ItemArray.Length];
for (int j = 0; j < subitems.Length; j++)
{
subitems[j] = groups[i][j].ToString();
}
if ( groups[i]["beginDate"] != null)
{
DateTime beginDate = (DateTime)groups[i]["beginDate"];
subitems[1] = beginDate.Date.ToString("dd MMMM yyyy");
}
if ( groups[i]["endDate"] != null)
{
DateTime endDate = (DateTime)groups[i]["endDate"];
subitems[2] = endDate.Date.ToString("dd MMMM yyyy");
}
if (groups[i]["beginTime"] != null)
{
DateTime beginTime = (DateTime)groups[i]["beginTime"];
subitems[3] = beginTime.ToString("HH:mm");
}
if (groups[i]["endTime"] != null)
{
DateTime endTime = (DateTime)groups[i]["endTime"];
subitems[4] = endTime.ToString("HH:mm");
}
CustomListItem cli = new CustomListItem(subitems, imageIndexListView);
int statusID = (int)groups[i][10];
if (statusID == 1) // Группа набирается
{
cli.ForeColor = Color.Red;
}
else if (statusID == 2) // Группа обучается
{
cli.ForeColor = Color.Green;
}
else if (statusID == 3) // Группа закончила обучение
{
cli.ForeColor = Color.Blue;
}
cli.BindedRow = groups[i];
lvManager.Items.Add(cli);
str = "";
}
}
// В ListView добавляем курсы
else if (tempTreeNode is DirectionTreeNode)
{
DataRow[] courses = selectedDirection.GetChildRows("directionscourse");
foreach(DataRow course in courses)
{
CustomListItem cli = new CustomListItem();
str = course.ItemArray[1].ToString();
cli.Text = str;
cli.BindedRow = course;
cli.ImageIndex = imageIndexListView;
lvManager.Items.Add(cli);
str = "";
}
}
// В ListView добавляем клиентов
else if (tempTreeNode is GroupTreeNode)
{
for(int i = 0; i < tempTreeNode.Nodes.Count; i++)
{
DataRow client = (DataRow)tempTreeNode.Nodes[i].Tag;
CustomListItem cli = new CustomListItem();
str = client["lname"].ToString() + " " + client["fname"].ToString() + " " + client["fathName"].ToString();
cli.Text = str;
cli.BindedRow = (DataRow)tempTreeNode.Nodes[i].Tag;
cli.ImageIndex = imageIndexListView;
lvManager.Items.Add(cli);
str = "";
}
}
else // Добавляем направления в ListView
{
for(int i = 0; i < mainDataSet.directions.Rows.Count; i++)
{
CustomListItem cli = new CustomListItem();
if(mainDataSet.directions.Rows[i].RowState != DataRowState.Deleted)
{
str = mainDataSet.directions.Rows[i][1].ToString();
cli.Text = str;
cli.BindedRow = mainDataSet.directions.Rows[i];
cli.ImageIndex = imageIndexListView;
lvManager.Items.Add(cli);
}
str = "";
}
}
spCount.Text = "Количество записей: " + lvManager.Items.Count.ToString();
for (int i = 0; i < lvManager.Items.Count; i++)
{
lvManager.Items[i].ForeColor = tempTreeNode.Nodes[i].ForeColor;
lvManager.Items[i].ImageIndex = imageIndexListView;
itemColor = lvManager.Items[i].ForeColor; // Цвет текста передвигаемой item
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Перевод выбранных клиентов из одной группы в другую
private void TransferClients(TreeNode oldGroup, TreeNode newGroup)
{
CourseTreeNode newCourse = (CourseTreeNode)newGroup.Parent; // Определяем курс для новой группы
CourseTreeNode oldCourse = (CourseTreeNode)oldGroup.Parent; // Определяем курс старой группы
double CoursePrice = (double)newCourse.CoursePrice; // Стоимость нового курса
// Определяем все оплаты клиента
DataRow oldGroupRow = (DataRow)oldGroup.Tag;
DataRow newGroupRow = (DataRow)newGroup.Tag;
DataRow[] groupClientsRows = oldGroupRow.GetChildRows("groupsgroup_clients");
DataView dvIncome = new DataView(mainDataSet.income);
int clientID = (int)selectedItem.BindedRow["clientID"]; // ID клиента
dvIncome.RowFilter = "(ClientID = " + clientID.ToString() + ") AND (IsRealized <> 1)";
// Определяем сумму клиента на счету
double incomeSumm = 0;
double clientSumm = 0;
double realizedSumm = 0;
foreach (DataRowView drv in dvIncome)
{
DataRow[] planRows = drv.Row.GetChildRows("incomePlanRealization");
foreach(DataRow planRow in planRows)
if ((bool)planRow["IsRealized"]) // Проверка реализации суммы в PlanRealization
{
realizedSumm += (double)planRow["SummaRealization"];
}
incomeSumm += (double)drv.Row["Summa"];
}
clientSumm = incomeSumm - realizedSumm;
frmClientTransfer fct = new frmClientTransfer();
fct.dgClientPayments.DataSource = dvIncome;
fct.txtClientName.Text = selectedItem.BindedRow["lname"].ToString() + " " + selectedItem.BindedRow["fname"].ToString() + " " + selectedItem.BindedRow["fathName"].ToString();
fct.txtAccountSumm.Text = clientSumm.ToString();
fct.lblOldGroupNumber.Text = oldGroupRow["groupID"].ToString();
fct.lblNewGroupNumber.Text = newGroupRow["groupID"].ToString();
fct.lblOldCourseName.Text = oldCourse.Text;
DataRow courseRow = (DataRow)newCourse.Tag;
double newCoursePrice = Convert.ToDouble(courseRow["priceNumber"]);
fct.lblNewCourseName.Text = newCourse.CourseName.ToString();
fct.txtNewCoursePrice.Text = newCoursePrice.ToString();
// Расчет разницы
fct.txtDefferenceCount.Text = Convert.ToString(clientSumm - newCoursePrice);
if (fct.ShowDialog() == DialogResult.OK)
{
lvManager.Items.Add(selectedItem);
DataRow row = mainDataSet.group_clients.NewRow();
row["clientID"] = (int)selectedItem.BindedRow["clientID"];
row["groupID"] = int.Parse(selectedNode.Text);
row["IsPaid"] = true;
mainDataSet.group_clients.Rows.Add(row);
this.FillListView(treeNodeType, selectedNode);
}
}
// Поиск клиентов
private void SearchClient()
{
frmSearchClient f = new frmSearchClient(this.mainDataSet);
f.ShowDialog();
}
// Форма сотрудников
private void OpenEmployees()
{
frmEmployee f = new frmEmployee(this.mainDataSet);
f.ShowDialog();
}
// Загрузка главной БД
internal void LoadMainDataBase()
{
mainOleDbConnection.ConnectionString = MainConnectionString;
try
{
mainDataSet.EnforceConstraints = false;
directionsOleDbDataAdapter.Fill(mainDataSet.directions);
coursesOleDbDataAdapter.Fill(mainDataSet.course);
employeesOleDbDataAdapter.Fill(mainDataSet.employees);
groupStatusOleDbDataAdapter.Fill(mainDataSet.GroupStatus);
groupsOleDbDataAdapter.Fill(mainDataSet.groups);
clientsOleDbDataAdapter.Fill(mainDataSet.clients);
groupClientsOleDbDataAdapter.Fill(mainDataSet.group_clients);
realizedTableOleDbDataAdapter.Fill(mainDataSet.RealizedTable);
dataOleDbDataAdapter.Fill(mainDataSet.data);
paymentTypeOleDbDataAdapter.Fill(mainDataSet.payment_type);
incomeOleDbDataAdapter.Fill(mainDataSet.income);
planRealizationOleDbDataAdapter.Fill(mainDataSet.PlanRealization);
outOleDbDataAdapter.Fill(mainDataSet.expenses);
mainDataSet.EnforceConstraints = true;
foreach (DataRow dr in mainDataSet.directions.Rows)
{
ListItem directionItem = new ListItem(dr);
directionItem.Text = dr[1].ToString();
cmbDirections.Items.Add(directionItem.Text);
cmbFilteringDirection.Items.Add(directionItem.Text);
}
foreach (DataRow dr in mainDataSet.GroupStatus.Rows)
{
ListItem groupStatusItem = new ListItem(dr);
groupStatusItem.Text = dr[1].ToString();
cmbGroupStatus.Items.Add(groupStatusItem.Text);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
System.Environment.Exit(1);
}
}
// Обновление главной БД
private void UpdateMainData()
{
mainOleDbConnection.ConnectionString = MainConnectionString;
try
{
MainDataSet ds = (MainDataSet)mainDataSet.GetChanges();
if (ds != null)
{
ds.EnforceConstraints = false;
dataOleDbDataAdapter.Update(ds);
paymentTypeOleDbDataAdapter.Update(ds);
directionsOleDbDataAdapter.Update(ds);
coursesOleDbDataAdapter.Update(ds);
employeesOleDbDataAdapter.Update(ds.employees);
clientsOleDbDataAdapter.Update(ds);
groupStatusOleDbDataAdapter.Update(ds);
groupsOleDbDataAdapter.Update(ds);
groupClientsOleDbDataAdapter.Update(ds);
realizedTableOleDbDataAdapter.Update(ds);
incomeOleDbDataAdapter.Update(ds);
planRealizationOleDbDataAdapter.Update(ds);
outOleDbDataAdapter.Update(ds);
ds.EnforceConstraints = true;
mainDataSet.AcceptChanges();
}
}
catch(SqlException ex)
{
StringBuilder msg = new StringBuilder();
foreach(SqlError err in ex.Errors)
{
msg.AppendFormat("{0}\n",err.Message);
}
MessageBox.Show(msg.ToString(), ex.Source);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Изменение статуса группы из проводника
private void ChangeStatus(ListView.SelectedListViewItemCollection items, StatusType status)
{
int statusID = 0;
Color color = Color.Black;
switch (status)
{
// Группа набирается
case StatusType.Filling:
statusID = 1;
color = Color.Red;
break;
// Группа обучается
case StatusType.Learning:
statusID = 2;
color = Color.Green;
break;
// Группа закончила обучение
case StatusType.Finished:
statusID = 3;
color = Color.Blue;
break;
}
foreach(ListViewItem lvi in items)
{
CustomListItem item = (CustomListItem)lvi;
item.BindedRow["StatusID"] = statusID;
item.ForeColor = color;
selectedNode.Nodes[item.Index].ForeColor = color;
}
}
// Итоговые расчеты на текущую запись в таблице data
private void CalculateTotalPage(DataRow currentTotalRow)
{
double resultIncome = 0;
double resultOut = 0;
double balance = 0;
int dataID = (int)currentTotalRow[0];
DataRow[] incomeRows = currentTotalRow.GetChildRows("dataincome");
DataRow[] outRows = currentTotalRow.GetChildRows("dataexpenses");
// Определение прихода
foreach (DataRow dr in incomeRows)
{
if (dr[3] == null)
continue;
resultIncome += (double)dr[3];
}
txtResultIncome.Text = resultIncome.ToString("c");
// Определение расхода
foreach (DataRow dr in outRows)
{
if (dr[3] == null)
continue;
resultOut += (double)dr[3];
}
txtResultOut.Text = resultOut.ToString("c");
// Баланс
balance = resultIncome - resultOut;
txtBalance.Text = balance.ToString("c");
// Итоговые расчеты
double yesterdaySumm = Convert.ToDouble(currentTotalRow[2]);
txtYesterdaySumm.Text = yesterdaySumm.ToString("c");
double total = yesterdaySumm + balance;
txtResultCount.Text = total.ToString("c");
currentTotalRow["incomeToday"] = (double)resultIncome; // Приход на сегодня
currentTotalRow["expanseToday"] = (double)resultOut; // Расход на сегодня
currentTotalRow["amountToday"] = yesterdaySumm + balance; // Итог на сегодня. К сумме, полученной вчера, прибавляем баланс на сегодня
}
// Открываем заголовок item в ListView
private void OpenItemInForm(TreeNodeType treeNodeType)
{
// Выбранный элемент в ListView
CustomListItem cli = (CustomListItem)lvManager.SelectedItems[0];
try
{
switch (treeNodeType)
{
case TreeNodeType.Group:
frmClient client = new frmClient(cli.BindedRow, this.mainDataSet);
int clientID = (int)cli.BindedRow[0];
DataView dvClientGroups = new DataView(mainDataSet.group_clients);
dvClientGroups.RowFilter = "clientID = " + clientID.ToString();
DataGridItem[] items = new DataGridItem[dvClientGroups.Count];
int i = 0;
foreach(DataRowView drv in dvClientGroups)
{
DataGridItem dgi = new DataGridItem(drv.Row[1].ToString());
items[i++]= dgi;
}
client.dgClientGroups.SetDataBinding(items, null);
client.Text += selectedNode.Text;
client.ShowDialog();
break;
case TreeNodeType.Course:
frmGroup group = new frmGroup(mainDataSet, cli.BindedRow);
group.Text += selectedNodeName;
group.ShowDialog();
break;
case TreeNodeType.Direction:
frmCourse course = new frmCourse(cli.BindedRow);
course.Text += selectedNodeName;
course.ShowDialog() ;
break;
case TreeNodeType.Top:
frmDirection direction = new frmDirection(cli.BindedRow);
direction.ShowDialog() ;
break;
default: return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Добавляем нового клиента со страницы 'Приемная'
private void AddNewClientWaitingRoom()
{
frmClient f = new frmClient(this.mainDataSet);
DataRow newClientRow = mainDataSet.clients.NewRow();
mainDataSet.clients.Rows.Add(newClientRow);
f.ClientID = (int)newClientRow["clientID"];
f.lblClientID.Text = "Новый клиент";
int groupRowID = dgGroups.CurrentRowIndex;
DataView dvGroups = (DataView)dgGroups.DataSource;
DataRow group = dvGroups[groupRowID].Row;
f.Text += group["groupID"].ToString();
f.GroupID = (int)group["groupID"];
f.MainForm = this;
if (f.ShowDialog() == DialogResult.OK)
{
try
{
// Добавляем данные в табл. clients
newClientRow["fname"] = f.txtFirstName.Text;
newClientRow["lname"] = f.txtLastName.Text;
newClientRow["fathName"] = f.txtFatherName.Text;
newClientRow["linkData"] = f.txtPhones.Text;
newClientRow["recorddate"] = f.dtpRecordDate.Value;
newClientRow["note"] = f.txtNotes.Text;
newClientRow["isRinged"] = false;
// Добавляем данные в табл. Group_Clients
DataRow newGroupClientRow = mainDataSet.group_clients.NewRow();
int clientID = (int)newClientRow["clientID"];
newGroupClientRow["clientID"] = clientID;
newGroupClientRow["groupID"] = (int)group["groupID"];
mainDataSet.group_clients.Rows.Add(newGroupClientRow);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
dgGroups_Click(this.dgGroups, new EventArgs());
}
}
// Устанавливаем размеры окон — используется при изменении размера окон
private void SetWitdhForDataGrids()
{
dgCourses.Size = new Size(this.Width / 4, dgCourses.Size.Height);
panel17.Size = new Size(dgGroups.Width, dgCourses.Height / 2);
panel16.Size = new Size(this.Width / 2, panel16.Height);
}
// Устанавливаем дизайн элементов DataGrid.
private void DesigneDataGrids()
{
try
{
// Дизайн таблицы data
DataGridTableStyle totalTableStyle1 = new DataGridTableStyle();
totalTableStyle1.MappingName = "data";
DataGridTextBoxColumn dataIDStyle1 = new DataGridTextBoxColumn();
dataIDStyle1.MappingName = "dataID";
dataIDStyle1.Width = 50;
dataIDStyle1.HeaderText = "ID";
DataGridTextBoxColumn currentDateStyle1 = new DataGridTextBoxColumn();
currentDateStyle1.MappingName = "currentDate";
currentDateStyle1.Width = 120;
currentDateStyle1.HeaderText = "Текущая дата";
DataGridTextBoxColumn amountYesterdayStyle1 = new DataGridTextBoxColumn();
amountYesterdayStyle1.MappingName = "amountYesterday";
amountYesterdayStyle1.Width = 150;
amountYesterdayStyle1.HeaderText = "Всего вчера";
DataGridTextBoxColumn amountTodayStyle1 = new DataGridTextBoxColumn();
amountTodayStyle1.MappingName = "amountToday";
amountTodayStyle1.Width = 150;
amountTodayStyle1.HeaderText = "Всего Сегодня";
DataGridTextBoxColumn incomeTodayStyle1 = new DataGridTextBoxColumn();
incomeTodayStyle1.MappingName = "incomeToday";
incomeTodayStyle1.Width = 150;
incomeTodayStyle1.HeaderText = "Приход сегодня";
DataGridTextBoxColumn expanseTodayStyle1 = new DataGridTextBoxColumn();
expanseTodayStyle1.MappingName = "expanseToday";
expanseTodayStyle1.Width = 150;
expanseTodayStyle1.HeaderText = "Расход сегодня";
DataGridTextBoxColumn totalNotesStyle1 = new DataGridTextBoxColumn();
totalNotesStyle1.MappingName = "note";
totalNotesStyle1.Width = 300;
totalNotesStyle1.HeaderText = "Заметки";
totalTableStyle1.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dataIDStyle1,
currentDateStyle1,
amountYesterdayStyle1,
amountTodayStyle1,
incomeTodayStyle1,
expanseTodayStyle1,
totalNotesStyle1});
dgMainTable.TableStyles.Add(totalTableStyle1);
// Дизайн dgCourses
DataGridTableStyle coursesTableStyle = new DataGridTableStyle();
coursesTableStyle.MappingName = "course";
DataGridTextBoxColumn courseNameStyle = new DataGridTextBoxColumn();
courseNameStyle.MappingName = "courseName";
courseNameStyle.Width = 225;
courseNameStyle.HeaderText = "Название курса";
DataGridTextBoxColumn coursePriceStyle = new DataGridTextBoxColumn();
coursePriceStyle.MappingName = "priceNumber";
coursePriceStyle.Width = 100;
coursePriceStyle.Format = "#.0";
coursePriceStyle.HeaderText = "Цена курса";
coursesTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
courseNameStyle,
coursePriceStyle});
dgCourses.TableStyles.Add(coursesTableStyle);
// Дизайн dgGroups
DataGridTableStyle groupsTableStyle = new DataGridTableStyle();
groupsTableStyle.MappingName = "groups";
DataGridTextBoxColumn groupIDStyle = new DataGridTextBoxColumn();
groupIDStyle.MappingName = "groupID";
groupIDStyle.Width = 50;
groupIDStyle.HeaderText = "Номер";
DataGridTextBoxColumn beginDateStyle = new DataGridTextBoxColumn();
beginDateStyle.MappingName = "beginDate";
beginDateStyle.Width = 110;
beginDateStyle.Format = "dd MMMM yyyy";
beginDateStyle.HeaderText = "Дата начала";
DataGridTextBoxColumn endDateStyle = new DataGridTextBoxColumn();
endDateStyle.MappingName = "endDate";
endDateStyle.Width = 110;
endDateStyle.Format = "dd MMMM yyyy";
endDateStyle.HeaderText = "Дата окончания";
DataGridTextBoxColumn beginTimeStyle = new DataGridTextBoxColumn();
beginTimeStyle.MappingName = "beginTime";
beginTimeStyle.Width = 110;
beginTimeStyle.Format = "HH:mm";
beginTimeStyle.HeaderText = "Время начала";
DataGridTextBoxColumn endTimeStyle = new DataGridTextBoxColumn();
endTimeStyle.MappingName = "endTime";
endTimeStyle.Width = 110;
endTimeStyle.Format = "HH:mm";
endTimeStyle.HeaderText = "Время окончания";
DataGridTextBoxColumn classNumberStyle = new DataGridTextBoxColumn();
classNumberStyle.MappingName = "classNumber";
classNumberStyle.Width = 110;
classNumberStyle.HeaderText = "Номер класса";
groupsTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
beginTimeStyle,
endTimeStyle,
classNumberStyle,
beginDateStyle,
endDateStyle,
groupIDStyle});
dgGroups.TableStyles.Add(groupsTableStyle);
// Дизайн dgClients
DataGridTableStyle clientsTableStyle = new DataGridTableStyle();
clientsTableStyle.MappingName = "clients";
DataGridTextBoxColumn clientIDStyle = new DataGridTextBoxColumn();
clientIDStyle.MappingName = "clientID";
clientIDStyle.ReadOnly = true;
clientIDStyle.Width = 50;
clientIDStyle.HeaderText = "Номер";
DataGridTextBoxColumn firstNameStyle = new DataGridTextBoxColumn();
firstNameStyle.MappingName = "fname";
firstNameStyle.Width = 130;
firstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn lastNameStyle = new DataGridTextBoxColumn();
lastNameStyle.MappingName = "lname";
lastNameStyle.Width = 130;
lastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn fatherNameStyle = new DataGridTextBoxColumn();
fatherNameStyle.MappingName = "fathName";
fatherNameStyle.Width = 130;
fatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn clientPhoneStyle = new DataGridTextBoxColumn();
clientPhoneStyle.MappingName = "linkData";
clientPhoneStyle.Width = 200;
clientPhoneStyle.HeaderText = "Контакты";
DataGridBoolColumn clientIsRingedStyle = new DataGridBoolColumn();
clientIsRingedStyle.MappingName = "isRinged";
clientIsRingedStyle.Width = 100;
clientIsRingedStyle.AllowNull = false;
clientIsRingedStyle.HeaderText = "Дозвонились";
clientsTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
clientIDStyle,
lastNameStyle,
firstNameStyle,
fatherNameStyle,
clientPhoneStyle,
clientIsRingedStyle});
dgClients.TableStyles.Add(clientsTableStyle);
// Дизайн dgIncome
DataGridTableStyle incomeTableStyle = new DataGridTableStyle();
incomeTableStyle.MappingName = "income";
DataGridTextBoxColumn incomeClientIDStyle = new DataGridTextBoxColumn();
incomeClientIDStyle.MappingName = "clientID";
incomeClientIDStyle.Width = 45;
incomeClientIDStyle.HeaderText = "ID клиента";
incomeClientIDStyle.Alignment = HorizontalAlignment.Center;
DataGridTextBoxColumn incomeSummaStyle = new DataGridTextBoxColumn();
incomeSummaStyle.MappingName = "summa";
incomeSummaStyle.Width = 100;
incomeSummaStyle.Format = "#.0";
incomeSummaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn incomePaymentTypeIDStyle = new DataGridTextBoxColumn();
incomePaymentTypeIDStyle.MappingName = "payment_typeID";
incomePaymentTypeIDStyle.Width = 45;
incomePaymentTypeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn incomeNoteStyle = new DataGridTextBoxColumn();
incomeNoteStyle.MappingName = "note";
incomeNoteStyle.Width = 300;
incomeNoteStyle.HeaderText = "Заметки";
DataGridBoolColumn realizedStyle = new DataGridBoolColumn();
realizedStyle.MappingName = "IsRealized";
realizedStyle.Width = 100;
realizedStyle.HeaderText = "Реализовано";
DataGridTextBoxColumn incomeDataIDStyle = new DataGridTextBoxColumn();
incomeDataIDStyle.MappingName = "dataID";
incomeDataIDStyle.Width = 45;
incomeDataIDStyle.HeaderText = "ID data";
incomeDataIDStyle.Alignment = HorizontalAlignment.Center;
incomeTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
incomeSummaStyle,
incomePaymentTypeIDStyle,
incomeNoteStyle,
incomeClientIDStyle,
incomeDataIDStyle});
incomeTableStyle.HeaderBackColor = dgIncome.HeaderBackColor;
incomeTableStyle.BackColor = dgIncome.BackColor;
incomeTableStyle.ForeColor = dgIncome.ForeColor;
incomeTableStyle.GridLineColor = dgIncome.GridLineColor;
incomeTableStyle.HeaderForeColor = dgIncome.HeaderForeColor;
incomeTableStyle.SelectionBackColor = dgIncome.SelectionBackColor;
incomeTableStyle.SelectionForeColor = dgIncome.SelectionForeColor;
dgIncome.TableStyles.Add(incomeTableStyle);
// Дизайн dgOut
DataGridTableStyle expensesTableStyle = new DataGridTableStyle();
expensesTableStyle.MappingName = "expenses";
DataGridTextBoxColumn expensesClientIDStyle = new DataGridTextBoxColumn();
expensesClientIDStyle.MappingName = "clientID";
expensesClientIDStyle.Width = 45;
expensesClientIDStyle.HeaderText = "ID клиента";
DataGridTextBoxColumn expensesEmployeeIDStyle = new DataGridTextBoxColumn();
expensesEmployeeIDStyle.MappingName = "employeeID";
expensesEmployeeIDStyle.Width = 45;
expensesEmployeeIDStyle.HeaderText = "ID сотрудника";
DataGridTextBoxColumn expensesSummaStyle = new DataGridTextBoxColumn();
expensesSummaStyle.MappingName = "summa";
expensesSummaStyle.Width = 100;
expensesSummaStyle.Format = "#.0";
expensesSummaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn expensesPaymentTypeIDStyle = new DataGridTextBoxColumn();
expensesPaymentTypeIDStyle.MappingName = "payment_typeID";
expensesPaymentTypeIDStyle.Width = 45;
expensesPaymentTypeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn expensesNoteStyle = new DataGridTextBoxColumn();
expensesNoteStyle.MappingName = "note";
expensesNoteStyle.Width = 300;
expensesNoteStyle.HeaderText = "Заметки";
expensesTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
expensesSummaStyle,
expensesPaymentTypeIDStyle,
expensesNoteStyle,
expensesClientIDStyle,
expensesEmployeeIDStyle});
expensesTableStyle.HeaderBackColor = dgOut.HeaderBackColor;
expensesTableStyle.BackColor = dgOut.BackColor;
expensesTableStyle.ForeColor = dgOut.ForeColor;
expensesTableStyle.GridLineColor = dgOut.GridLineColor;
expensesTableStyle.HeaderForeColor = dgOut.HeaderForeColor;
expensesTableStyle.SelectionBackColor = dgOut.SelectionBackColor;
expensesTableStyle.SelectionForeColor = dgOut.SelectionForeColor;
dgOut.TableStyles.Add(expensesTableStyle);
// Дизайн dgWorkTable
// Стиль таблицы directions на странице "Основные таблицы"
DataGridTableStyle directionsTableStyle = new DataGridTableStyle();
directionsTableStyle.MappingName = "directions";
DataGridTextBoxColumn directionIDStyle = new DataGridTextBoxColumn();
directionIDStyle.MappingName = "directionID";
directionIDStyle.Width = 100;
directionIDStyle.HeaderText = "Номер направления";
DataGridTextBoxColumn directionNameStyle = new DataGridTextBoxColumn();
directionNameStyle.MappingName = "directName";
directionNameStyle.Width = 100;
directionNameStyle.HeaderText = "Наименование";
DataGridTextBoxColumn directionNotesStyle = new DataGridTextBoxColumn();
directionNotesStyle.MappingName = "note";
directionNotesStyle.Width = 100;
directionNotesStyle.HeaderText = "Заметки";
directionsTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
directionIDStyle,
directionNameStyle,
directionNotesStyle});
dgWorkTable.TableStyles.Add(directionsTableStyle);
// Стиль таблицы course на странице "Основные таблицы"
DataGridTableStyle dgWorkTableСoursesTableStyle = new DataGridTableStyle();
dgWorkTableСoursesTableStyle.MappingName = "course";
DataGridTextBoxColumn dgWorkTableСourseNameStyle = new DataGridTextBoxColumn();
dgWorkTableСourseNameStyle.MappingName = "courseName";
dgWorkTableСourseNameStyle.Width = 150;
dgWorkTableСourseNameStyle.HeaderText = "Название курса";
DataGridTextBoxColumn dgWorkTableСoursePriceStyle = new DataGridTextBoxColumn();
dgWorkTableСoursePriceStyle.MappingName = "priceNumber";
dgWorkTableСoursePriceStyle.Width = 100;
dgWorkTableСoursePriceStyle.Format = "#.0";
dgWorkTableСoursePriceStyle.HeaderText = "Цена курса";
DataGridTextBoxColumn dgWorkTableDirectionIDStyle = new DataGridTextBoxColumn();
dgWorkTableDirectionIDStyle.MappingName = "directionID";
dgWorkTableDirectionIDStyle.Width = 50;
dgWorkTableDirectionIDStyle.HeaderText = "Номер направления";
DataGridTextBoxColumn dgWorkTableNoteStyle = new DataGridTextBoxColumn();
dgWorkTableNoteStyle.MappingName = "note";
dgWorkTableNoteStyle.Width = 150;
dgWorkTableNoteStyle.HeaderText = "Заметки";
dgWorkTableСoursesTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableСourseNameStyle,
dgWorkTableСoursePriceStyle,
dgWorkTableDirectionIDStyle,
dgWorkTableNoteStyle});
dgWorkTable.TableStyles.Add(dgWorkTableСoursesTableStyle);
// Стиль таблицы data на странице "Основные таблицы"
DataGridTableStyle totalTableStyle = new DataGridTableStyle();
totalTableStyle.MappingName = "data";
DataGridTextBoxColumn totalIDStyle = new DataGridTextBoxColumn();
totalIDStyle.MappingName = "directionID";
totalIDStyle.Width = 100;
totalIDStyle.HeaderText = "Номер";
DataGridTextBoxColumn currentDateStyle = new DataGridTextBoxColumn();
currentDateStyle.MappingName = "currentDate";
currentDateStyle.Width = 100;
currentDateStyle.Format = "dd MMMM yyyy";
currentDateStyle.HeaderText = "Текущая дата";
DataGridTextBoxColumn amountYesterdayStyle = new DataGridTextBoxColumn();
amountYesterdayStyle.MappingName = "amountYesterday";
amountYesterdayStyle.Width = 100;
amountYesterdayStyle.HeaderText = "Всего вчера";
DataGridTextBoxColumn amountTodayStyle = new DataGridTextBoxColumn();
amountTodayStyle.MappingName = "amountToday";
amountTodayStyle.Width = 100;
amountTodayStyle.HeaderText = "Всего cегодня";
DataGridTextBoxColumn incomeTodayStyle = new DataGridTextBoxColumn();
incomeTodayStyle.MappingName = "incomeToday";
incomeTodayStyle.Width = 100;
incomeTodayStyle.HeaderText = "Приход сегодня";
DataGridTextBoxColumn expanseTodayStyle = new DataGridTextBoxColumn();
expanseTodayStyle.MappingName = "expanseToday";
expanseTodayStyle.Width = 100;
expanseTodayStyle.HeaderText = "Расход сегодня";
DataGridTextBoxColumn totalNoteStyle = new DataGridTextBoxColumn();
totalNoteStyle.MappingName = "note";
totalNoteStyle.Width = 100;
totalNoteStyle.HeaderText = "Заметки";
totalTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
totalIDStyle,
currentDateStyle,
amountYesterdayStyle,
amountTodayStyle,
incomeTodayStyle,
expanseTodayStyle,
totalNoteStyle});
dgWorkTable.TableStyles.Add(totalTableStyle);
// Стиль таблицы groups на странице "Основные таблицы"
DataGridTableStyle dgWorkTableGroupsTableStyle = new DataGridTableStyle();
dgWorkTableGroupsTableStyle.MappingName = "groups";
DataGridTextBoxColumn dgWorkTableGroupIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupIDStyle.MappingName = "groupID";
dgWorkTableGroupIDStyle.Width = 100;
dgWorkTableGroupIDStyle.HeaderText = "Номер группы";
DataGridTextBoxColumn dgWorkTableBeginDateStyle = new DataGridTextBoxColumn();
dgWorkTableBeginDateStyle.MappingName = "beginDate";
dgWorkTableBeginDateStyle.Width = 100;
dgWorkTableBeginDateStyle.Format = "dd MMMM yyyy";
dgWorkTableBeginDateStyle.HeaderText = "Дата начала";
DataGridTextBoxColumn dgWorkTableEndDateStyle = new DataGridTextBoxColumn();
dgWorkTableEndDateStyle.MappingName = "endDate";
dgWorkTableEndDateStyle.Width = 100;
dgWorkTableEndDateStyle.Format = "dd MMMM yyyy";
dgWorkTableEndDateStyle.HeaderText = "Дата окончания";
DataGridTextBoxColumn dgWorkTableBeginTimeStyle = new DataGridTextBoxColumn();
dgWorkTableBeginTimeStyle.MappingName = "beginTime";
dgWorkTableBeginTimeStyle.Width = 100;
dgWorkTableBeginTimeStyle.Format = "HH:mm";
dgWorkTableBeginTimeStyle.HeaderText = "Время начала";
DataGridTextBoxColumn dgWorkTableEndTimeStyle = new DataGridTextBoxColumn();
dgWorkTableEndTimeStyle.MappingName = "endTime";
dgWorkTableEndTimeStyle.Width = 100;
dgWorkTableEndTimeStyle.Format = "HH:mm";
dgWorkTableEndTimeStyle.HeaderText = "Время окончания";
DataGridTextBoxColumn dgWorkTableClassNumberStyle = new DataGridTextBoxColumn();
dgWorkTableClassNumberStyle.MappingName = "classNumber";
dgWorkTableClassNumberStyle.Width = 100;
dgWorkTableClassNumberStyle.HeaderText = "Номер класса";
DataGridTextBoxColumn dgWorkTableCourseIDStyle = new DataGridTextBoxColumn();
dgWorkTableCourseIDStyle.MappingName = "courseID";
dgWorkTableCourseIDStyle.Width = 100;
dgWorkTableCourseIDStyle.HeaderText = "Номер курса";
DataGridTextBoxColumn dgWorkTableEmployeeIDStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeeIDStyle.MappingName = "employeeID";
dgWorkTableEmployeeIDStyle.Width = 100;
dgWorkTableEmployeeIDStyle.HeaderText = "Номер сотрудника";
DataGridTextBoxColumn dgWorkTableGroupNoteStyle = new DataGridTextBoxColumn();
dgWorkTableGroupNoteStyle.MappingName = "note";
dgWorkTableGroupNoteStyle.Width = 100;
dgWorkTableGroupNoteStyle.HeaderText = "Заметки";
DataGridTextBoxColumn dgWorkTableStatusIDStyle = new DataGridTextBoxColumn();
dgWorkTableStatusIDStyle.MappingName = "StatusID";
dgWorkTableStatusIDStyle.Width = 100;
dgWorkTableStatusIDStyle.HeaderText = "Номер статуса группы";
dgWorkTableGroupsTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableGroupIDStyle,
dgWorkTableClassNumberStyle,
dgWorkTableBeginDateStyle,
dgWorkTableEndDateStyle,
dgWorkTableBeginTimeStyle,
dgWorkTableEndTimeStyle,
dgWorkTableCourseIDStyle,
dgWorkTableEmployeeIDStyle,
dgWorkTableGroupNoteStyle,
dgWorkTableStatusIDStyle
});
dgWorkTable.TableStyles.Add(dgWorkTableGroupsTableStyle);
// Стиль таблицы clients на странице "Основные таблицы"
DataGridTableStyle dgWorkTableСlientsTableStyle = new DataGridTableStyle();
dgWorkTableСlientsTableStyle.MappingName = "clients";
DataGridTextBoxColumn dgWorkTableClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableClientIDStyle.MappingName = "clientID";
dgWorkTableClientIDStyle.Width = 100;
dgWorkTableClientIDStyle.HeaderText = "Номер клиента";
DataGridTextBoxColumn dgWorkTableFirstNameStyle = new DataGridTextBoxColumn();
dgWorkTableFirstNameStyle.MappingName = "fname";
dgWorkTableFirstNameStyle.Width = 100;
dgWorkTableFirstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn dgWorkTableLastNameStyle = new DataGridTextBoxColumn();
dgWorkTableLastNameStyle.MappingName = "lname";
dgWorkTableLastNameStyle.Width = 100;
dgWorkTableLastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn dgWorkTableFatherNameStyle = new DataGridTextBoxColumn();
dgWorkTableFatherNameStyle.MappingName = "fathName";
dgWorkTableFatherNameStyle.Width = 100;
dgWorkTableFatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn dgWorkTableLinkDataStyle = new DataGridTextBoxColumn();
dgWorkTableLinkDataStyle.MappingName = "linkData";
dgWorkTableLinkDataStyle.Width = 100;
dgWorkTableLinkDataStyle.HeaderText = "Контакты";
DataGridTextBoxColumn dgWorkTableRecordDateStyle = new DataGridTextBoxColumn();
dgWorkTableRecordDateStyle.MappingName = "recorddate";
dgWorkTableRecordDateStyle.Width = 100;
dgWorkTableRecordDateStyle.Format = "dd-MMMM-yyyy";
dgWorkTableRecordDateStyle.HeaderText = "Дата записи";
DataGridTextBoxColumn dgWorkTableClientNoteStyle = new DataGridTextBoxColumn();
dgWorkTableClientNoteStyle.MappingName = "note";
dgWorkTableClientNoteStyle.Width = 100;
dgWorkTableClientNoteStyle.HeaderText = "Заметки";
DataGridTextBoxColumn dgWorkTablePaymentTypeStyle = new DataGridTextBoxColumn();
dgWorkTablePaymentTypeStyle.MappingName = "paymentType";
dgWorkTablePaymentTypeStyle.Width = 100;
dgWorkTablePaymentTypeStyle.HeaderText = "Тип оплаты";
dgWorkTableСlientsTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableClientIDStyle,
dgWorkTableLastNameStyle,
dgWorkTableFirstNameStyle,
dgWorkTableFatherNameStyle,
dgWorkTableLinkDataStyle,
dgWorkTableRecordDateStyle,
dgWorkTableClientNoteStyle,
dgWorkTablePaymentTypeStyle});
dgWorkTable.TableStyles.Add(dgWorkTableСlientsTableStyle);
// Стиль таблицы income на странице "Основные таблицы"
DataGridTableStyle dgWorkTableIncomeTableStyle = new DataGridTableStyle();
dgWorkTableIncomeTableStyle.MappingName = "income";
DataGridTextBoxColumn dgWorkTableIncomeIDStyle = new DataGridTextBoxColumn();
dgWorkTableIncomeIDStyle.MappingName = "incomeID";
dgWorkTableIncomeIDStyle.Width = 100;
dgWorkTableIncomeIDStyle.HeaderText = "ID прихода";
DataGridTextBoxColumn dgWorkTableIncomeClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableIncomeClientIDStyle.MappingName = "clientID";
dgWorkTableIncomeClientIDStyle.Width = 100;
dgWorkTableIncomeClientIDStyle.HeaderText = "ID клиента";
DataGridTextBoxColumn dgWorkTableIncomeSummaStyle = new DataGridTextBoxColumn();
dgWorkTableIncomeSummaStyle.MappingName = "summa";
dgWorkTableIncomeSummaStyle.Width = 100;
dgWorkTableIncomeSummaStyle.Format = "#.0";
dgWorkTableIncomeSummaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn dgWorkTableIncomePaymentTypeIDStyle = new DataGridTextBoxColumn();
dgWorkTableIncomePaymentTypeIDStyle.MappingName = "payment_typeID";
dgWorkTableIncomePaymentTypeIDStyle.Width = 100;
dgWorkTableIncomePaymentTypeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn dgWorkTableIncomeNoteStyle = new DataGridTextBoxColumn();
dgWorkTableIncomeNoteStyle.MappingName = "note";
dgWorkTableIncomeNoteStyle.Width = 100;
dgWorkTableIncomeNoteStyle.HeaderText = "Заметки";
DataGridBoolColumn dgWorkTableRealizedStyle = new DataGridBoolColumn();
dgWorkTableRealizedStyle.MappingName = "IsRealized";
dgWorkTableRealizedStyle.Width = 100;
dgWorkTableRealizedStyle.HeaderText = "Реализовано";
DataGridTextBoxColumn dgWorkTableDataIDStyle = new DataGridTextBoxColumn();
dgWorkTableDataIDStyle.MappingName = "dataID";
dgWorkTableDataIDStyle.Width = 100;
dgWorkTableDataIDStyle.HeaderText = "ID data";
dgWorkTableIncomeTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
dgWorkTableIncomeIDStyle,
dgWorkTableIncomeClientIDStyle,
dgWorkTableIncomeSummaStyle,
dgWorkTableIncomePaymentTypeIDStyle,
dgWorkTableIncomeNoteStyle,
dgWorkTableRealizedStyle,
dgWorkTableDataIDStyle});
dgWorkTableIncomeTableStyle.HeaderBackColor = dgWorkTable.HeaderBackColor;
dgWorkTableIncomeTableStyle.BackColor = dgWorkTable.BackColor;
dgWorkTableIncomeTableStyle.ForeColor = dgWorkTable.ForeColor;
dgWorkTableIncomeTableStyle.GridLineColor = dgWorkTable.GridLineColor;
dgWorkTableIncomeTableStyle.HeaderForeColor = dgWorkTable.HeaderForeColor;
dgWorkTableIncomeTableStyle.SelectionBackColor = dgWorkTable.SelectionBackColor;
dgWorkTableIncomeTableStyle.SelectionForeColor = dgWorkTable.SelectionForeColor;
dgWorkTable.TableStyles.Add(dgWorkTableIncomeTableStyle);
// Стиль таблицы expenses на странице "Основные таблицы"
DataGridTableStyle dgWorkTableExpensesTableStyle = new DataGridTableStyle();
dgWorkTableExpensesTableStyle.MappingName = "expenses";
DataGridTextBoxColumn dgWorkTableExpensesExpenseIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesExpenseIDStyle.MappingName = "expenseID";
dgWorkTableExpensesExpenseIDStyle.Width = 100;
dgWorkTableExpensesExpenseIDStyle.HeaderText = "ID расхода";
DataGridTextBoxColumn dgWorkTableExpensesDataIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesDataIDStyle.MappingName = "dataID";
dgWorkTableExpensesDataIDStyle.Width = 100;
dgWorkTableExpensesDataIDStyle.HeaderText = "ID data";
DataGridTextBoxColumn dgWorkTableExpensesClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesClientIDStyle.MappingName = "clientID";
dgWorkTableExpensesClientIDStyle.Width = 100;
dgWorkTableExpensesClientIDStyle.HeaderText = "ID клиента";
DataGridTextBoxColumn dgWorkTableExpensesEmployeeIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesEmployeeIDStyle.MappingName = "employeeID";
dgWorkTableExpensesEmployeeIDStyle.Width = 100;
dgWorkTableExpensesEmployeeIDStyle.HeaderText = "ID сотрудника";
DataGridTextBoxColumn dgWorkTableExpensesSummaStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesSummaStyle.MappingName = "summa";
dgWorkTableExpensesSummaStyle.Width = 100;
dgWorkTableExpensesSummaStyle.Format = "#.0";
dgWorkTableExpensesSummaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn dgWorkTableExpensesPaymentTypeIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesPaymentTypeIDStyle.MappingName = "payment_typeID";
dgWorkTableExpensesPaymentTypeIDStyle.Width = 100;
dgWorkTableExpensesPaymentTypeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn dgWorkTableExpensesNoteStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesNoteStyle.MappingName = "note";
dgWorkTableExpensesNoteStyle.Width = 100;
dgWorkTableExpensesNoteStyle.HeaderText = "Заметки";
dgWorkTableExpensesTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
dgWorkTableExpensesExpenseIDStyle,
dgWorkTableExpensesDataIDStyle,
dgWorkTableExpensesClientIDStyle,
dgWorkTableExpensesEmployeeIDStyle,
dgWorkTableExpensesSummaStyle,
dgWorkTableExpensesPaymentTypeIDStyle,
dgWorkTableExpensesNoteStyle});
dgWorkTableExpensesTableStyle.HeaderBackColor = dgWorkTable.HeaderBackColor;
dgWorkTableExpensesTableStyle.BackColor = dgWorkTable.BackColor;
dgWorkTableExpensesTableStyle.ForeColor = dgWorkTable.ForeColor;
dgWorkTableExpensesTableStyle.GridLineColor = dgWorkTable.GridLineColor;
dgWorkTableExpensesTableStyle.HeaderForeColor = dgWorkTable.HeaderForeColor;
dgWorkTableExpensesTableStyle.SelectionBackColor = dgWorkTable.SelectionBackColor;
dgWorkTableExpensesTableStyle.SelectionForeColor = dgWorkTable.SelectionForeColor;
dgWorkTable.TableStyles.Add(dgWorkTableExpensesTableStyle);
// Стиль таблицы employees на странице "Основные таблицы"
DataGridTableStyle dgWorkTableEmployeesTableStyle = new DataGridTableStyle();
dgWorkTableEmployeesTableStyle.MappingName = "employees";
DataGridTextBoxColumn dgWorkTableEmployeesEmployeeIDStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesEmployeeIDStyle.MappingName = "employeeID";
dgWorkTableEmployeesEmployeeIDStyle.Width = 100;
dgWorkTableEmployeesEmployeeIDStyle.HeaderText = "Номер сотрудника";
DataGridTextBoxColumn dgWorkTableEmployeesFirstNameStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesFirstNameStyle.MappingName = "FirstName";
dgWorkTableEmployeesFirstNameStyle.Width = 100;
dgWorkTableEmployeesFirstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn dgWorkTableEmployeesLastNameStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesLastNameStyle.MappingName = "LastName";
dgWorkTableEmployeesLastNameStyle.Width = 100;
dgWorkTableEmployeesLastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn dgWorkTableEmployeesFatherNameStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesFatherNameStyle.MappingName = "FatherName";
dgWorkTableEmployeesFatherNameStyle.Width = 100;
dgWorkTableEmployeesFatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn dgWorkTableEmployeesLinkDataStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesLinkDataStyle.MappingName = "linkData";
dgWorkTableEmployeesLinkDataStyle.Width = 100;
dgWorkTableEmployeesLinkDataStyle.HeaderText = "Контакты";
DataGridTextBoxColumn dgWorkTableEmployeesBirthdayStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesBirthdayStyle.MappingName = "birthday";
dgWorkTableEmployeesBirthdayStyle.Width = 100;
dgWorkTableEmployeesBirthdayStyle.Format = "dd-MMMM-yyyy";
dgWorkTableEmployeesBirthdayStyle.HeaderText = "День рождения";
DataGridTextBoxColumn dgWorkTableEmployeesDirectionIDStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesDirectionIDStyle.MappingName = "directionID";
dgWorkTableEmployeesDirectionIDStyle.Width = 100;
dgWorkTableEmployeesDirectionIDStyle.HeaderText = "Номер направления";
dgWorkTableEmployeesTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableEmployeesEmployeeIDStyle,
dgWorkTableEmployeesLastNameStyle,
dgWorkTableEmployeesFirstNameStyle,
dgWorkTableEmployeesFatherNameStyle,
dgWorkTableEmployeesLinkDataStyle,
dgWorkTableEmployeesBirthdayStyle,
dgWorkTableEmployeesDirectionIDStyle});
dgWorkTable.TableStyles.Add(dgWorkTableEmployeesTableStyle);
// Стиль таблицы GroupStatus на странице "Основные таблицы"
DataGridTableStyle dgWorkTableGroupStatusTableStyle = new DataGridTableStyle();
dgWorkTableGroupStatusTableStyle.MappingName = "GroupStatus";
DataGridTextBoxColumn dgWorkTableGroupStatusStatusIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupStatusStatusIDStyle.MappingName = "StatusID";
dgWorkTableGroupStatusStatusIDStyle.Width = 100;
dgWorkTableGroupStatusStatusIDStyle.HeaderText = "Номер статуса";
DataGridTextBoxColumn dgWorkTableStatusNameStyle = new DataGridTextBoxColumn();
dgWorkTableStatusNameStyle.MappingName = "StatusName";
dgWorkTableStatusNameStyle.Width = 100;
dgWorkTableStatusNameStyle.HeaderText = "Имя";
dgWorkTableGroupStatusTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableGroupStatusStatusIDStyle,
dgWorkTableStatusNameStyle});
dgWorkTable.TableStyles.Add(dgWorkTableGroupStatusTableStyle);
// Стиль таблицы payment_type на странице "Основные таблицы"
DataGridTableStyle dgWorkTablePaymentTypeTableStyle = new DataGridTableStyle();
dgWorkTablePaymentTypeTableStyle.MappingName = "payment_type";
DataGridTextBoxColumn dgWorkTablePaymentTypeIDStyle = new DataGridTextBoxColumn();
dgWorkTablePaymentTypeIDStyle.MappingName = "payment_typeID";
dgWorkTablePaymentTypeIDStyle.Width = 100;
dgWorkTablePaymentTypeIDStyle.HeaderText = "Номер вида оплаты";
DataGridTextBoxColumn dgWorkTablePaymentTypeNameStyle = new DataGridTextBoxColumn();
dgWorkTablePaymentTypeNameStyle.MappingName = "payment_typeName";
dgWorkTablePaymentTypeNameStyle.Width = 100;
dgWorkTablePaymentTypeNameStyle.HeaderText = "Наименование оплаты";
DataGridTextBoxColumn dgWorkTablePaymentNotesStyle = new DataGridTextBoxColumn();
dgWorkTablePaymentNotesStyle.MappingName = "note";
dgWorkTablePaymentNotesStyle.Width = 100;
dgWorkTablePaymentNotesStyle.HeaderText = "Заметки";
dgWorkTablePaymentTypeTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTablePaymentTypeIDStyle,
dgWorkTablePaymentTypeNameStyle,
dgWorkTablePaymentNotesStyle});
dgWorkTable.TableStyles.Add(dgWorkTablePaymentTypeTableStyle);
// Стиль таблицы RealizedTable на странице "Основные таблицы"
DataGridTableStyle dgWorkTableRealizedTableStyle = new DataGridTableStyle();
dgWorkTableRealizedTableStyle.MappingName = "RealizedTable";
DataGridTextBoxColumn dgWorkTableRealizedTableIDStyle = new DataGridTextBoxColumn();
dgWorkTableRealizedTableIDStyle.MappingName = "ID";
dgWorkTableRealizedTableIDStyle.Width = 100;
dgWorkTableRealizedTableIDStyle.HeaderText = "Номер реализации";
DataGridTextBoxColumn dgWorkTableRealizedSummStyle = new DataGridTextBoxColumn();
dgWorkTableRealizedSummStyle.MappingName = "realizedSumm";
dgWorkTableRealizedSummStyle.Width = 100;
dgWorkTableRealizedSummStyle.HeaderText = "Реализованная сумма";
DataGridTextBoxColumn dgWorkTableRealizingDateStyle = new DataGridTextBoxColumn();
dgWorkTableRealizingDateStyle.MappingName = "realizingDate";
dgWorkTableRealizingDateStyle.Width = 100;
dgWorkTableRealizingDateStyle.Format = "dd-MMMM-yyyy";
dgWorkTableRealizingDateStyle.HeaderText = "Дата реализации";
DataGridTextBoxColumn dgWorkTableRealizedTableNotesStyle = new DataGridTextBoxColumn();
dgWorkTableRealizedTableNotesStyle.MappingName = "note";
dgWorkTableRealizedTableNotesStyle.Width = 100;
dgWorkTableRealizedTableNotesStyle.HeaderText = "Заметки";
DataGridTextBoxColumn dgWorkTableRealizedTableClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableRealizedTableClientIDStyle.MappingName = "clientID";
dgWorkTableRealizedTableClientIDStyle.Width = 100;
dgWorkTableRealizedTableClientIDStyle.HeaderText = "Номер клиента";
dgWorkTableRealizedTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableRealizedTableIDStyle,
dgWorkTableRealizedSummStyle,
dgWorkTableRealizingDateStyle,
dgWorkTableRealizedTableNotesStyle,
dgWorkTableRealizedTableClientIDStyle});
dgWorkTable.TableStyles.Add(dgWorkTableRealizedTableStyle);
// Стиль таблицы group_clients на странице "Основные таблицы"
DataGridTableStyle dgWorkTableGroupClientsStyle = new DataGridTableStyle();
dgWorkTableGroupClientsStyle.MappingName = "group_clients";
DataGridTextBoxColumn dgWorkTableGroupClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupClientIDStyle.MappingName = "GroupClientID";
dgWorkTableGroupClientIDStyle.Width = 100;
dgWorkTableGroupClientIDStyle.HeaderText = "ID";
DataGridTextBoxColumn dgWorkTableGroupClientsGroupIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupClientsGroupIDStyle.MappingName = "groupID";
dgWorkTableGroupClientsGroupIDStyle.Width = 100;
dgWorkTableGroupClientsGroupIDStyle.HeaderText = "Номер группы";
DataGridTextBoxColumn dgWorkTableGroupClientsClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupClientsClientIDStyle.MappingName = "clientID";
dgWorkTableGroupClientsClientIDStyle.Width = 100;
dgWorkTableGroupClientsClientIDStyle.HeaderText = "Номер клиента";
DataGridBoolColumn dgWorkTableGroupClientsIsPaidStyle = new DataGridBoolColumn();
dgWorkTableGroupClientsIsPaidStyle.MappingName = "IsPaid";
dgWorkTableGroupClientsIsPaidStyle.Width = 50;
dgWorkTableGroupClientsIsPaidStyle.HeaderText = "Оплачено";
DataGridTextBoxColumn dgWorkTableGroupClientsNotesStyle = new DataGridTextBoxColumn();
dgWorkTableGroupClientsNotesStyle.MappingName = "Notes";
dgWorkTableGroupClientsNotesStyle.Width = 100;
dgWorkTableGroupClientsNotesStyle.HeaderText = "Заметки";
dgWorkTableGroupClientsStyle.GridColumnStyles.AddRange( new DataGridColumnStyle[] {
dgWorkTableGroupClientIDStyle,
dgWorkTableGroupClientsGroupIDStyle,
dgWorkTableGroupClientsClientIDStyle,
dgWorkTableGroupClientsIsPaidStyle,
dgWorkTableGroupClientsNotesStyle});
dgWorkTable.TableStyles.Add(dgWorkTableGroupClientsStyle);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Сумма прихода клиента
private double ClientIncomeSumm(int clientID)
{
DataView dvIncome = new DataView(mainDataSet.income);
dvIncome.RowFilter = "clientID = " + clientID.ToString();
double clientIncomeSumm = 0;
foreach (DataRowView drvIncomeClient in dvIncome)
{
if (drvIncomeClient.Row["summa"] != null)
clientIncomeSumm += (double)drvIncomeClient.Row["summa"];
}
return clientIncomeSumm;
}
// Реализованная сумма клиента
private double ClientRealizedSumm(int clientID)
{
DataView dvRealized = new DataView(mainDataSet.RealizedTable);
dvRealized.RowFilter = "clientID = " + clientID.ToString();
double clientRealizedSumm = 0;
foreach (DataRowView drvRealized in dvRealized)
{
clientRealizedSumm += (double)drvRealized.Row["realizedSumm"];
}
return clientRealizedSumm;
}
// Вычисление должников — метод нужен для страницы 'Статистика'
private void GetOweStatistic()
{
try
{
int directionID = cmbFilteringDirection.SelectedIndex + 1;
DataView dvCourses = new DataView(mainDataSet.course);
dvCourses.RowFilter = "directionID = " + directionID.ToString();
double summOweEdCenter = 0;
double summOweToEdCenter = 0;
foreach (DataRowView drvCourse in dvCourses)
{
DataRow course = drvCourse.Row;
DataRow[] groups = course.GetChildRows("coursegroups");
foreach (DataRow group in groups)
{
DataRow[] groupclients = group.GetChildRows("groupsgroup_clients");
foreach (DataRow groupclient in groupclients)
{
DataRow client = groupclient.GetParentRow("clientsgroup_clients");
int clientID = (int)client["clientID"];
double clientIncomeSumm = ClientIncomeSumm(clientID);
double clientRealizedSumm = ClientRealizedSumm(clientID);
// Ищем должников учебного центра
double balance = clientRealizedSumm - clientIncomeSumm;
if (balance > 0)
summOweToEdCenter += balance;
// Должен учебный центр
else if (balance < 0)
summOweEdCenter += balance;
}
}
}
txtEdCenterOwe.Text = summOweEdCenter.ToString("C");
txtOweToEdCenter.Text = summOweToEdCenter.ToString("C");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Удаление временных контролов поиска со страницы 'Приемная'
private void RemoveTempFindControl()
{
try
{
ArrayList tempControls = new ArrayList();
foreach (Control control in this.tcManager.TabPages[2].Controls)
if ((control.Tag != null) (control.Tag.ToString() == "Temp"))
tempControls.Add(control);
foreach (object ob in tempControls)
this.tcManager.TabPages[2].Controls.Remove((Control)ob);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Метод возвращает новую или существующую запись таблицы на вкладке 'Приемная'
private DataRow GetTablesRow(DataTable table, int rowIndex, CurrencyManager currManager)
{
try
{
DataRow row = null;
string tableName = table.TableName;
bool isNew = true;
isNew = (rowIndex != currManager.Position) ? true : false;
if (isNew)
{
row = table.NewRow();
row["dataID"] = DataID;
currManager.Position = rowIndex;
return row;
}
else
{
if (tableName == "income")
{
DataView dvIncome = (DataView)currManagerIncome.List;
row = dvIncome[rowIndex].Row;
}
else if (tableName == "expenses")
{
DataView dvOut = (DataView)currManagerOut.List;
row = dvOut[rowIndex].Row;
}
}
return row;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
return null;
}
}
#endregion
#region Обработчики событий
// Обновление ListView
private void miRefreshListView_Click(object sender, System.EventArgs e)
{
FillListView(treeNodeType, selectedNode);
}
// Отображаем в ListView данные для выделенного элемента в TreeView
private void tvManager_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
try
{
selectedNode = e.Node;
selectedNodeName = e.Node.Text; // Имя выбранного узла
// Заполняем ListView
if (e.Node == MainTreeNode) // Выбрана вершина TreeView
{
this.FillListView(TreeNodeType.Top, e.Node);
SelectingClient = false; // Нельзя выбирать клиентов
this.pnlGroups.Hide();
miNewClient.Enabled = false;
miNewGroup.Enabled = false;
miNewCourse.Enabled = false;
miNewDirection.Enabled = true;
cmiStatus.Enabled = false;
treeNodeType = TreeNodeType.Top;
lvManager.View = View.List;
}
else if (e.Node is DirectionTreeNode) // Выбрано направление
{
this.FillListView(TreeNodeType.Direction, e.Node);
SelectingClient = false; // Нельзя выбирать клиентов
pnlGroups.Hide();
miNewClient.Enabled = false;
miNewGroup.Enabled = false;
miNewCourse.Enabled = true;
miNewDirection.Enabled = false;
cmiStatus.Enabled = false;
treeNodeType = TreeNodeType.Direction;
lvManager.View = View.List;
}
else if (e.Node is CourseTreeNode) // Выбран курс
{
this.FillListView(TreeNodeType.Course, e.Node);
SelectingClient = false; // Нельзя выбирать клиентов
pnlGroups.Show();
miNewClient.Enabled = false;
miNewGroup.Enabled = true;
miNewCourse.Enabled = false;
miNewDirection.Enabled = false;
cmiStatus.Enabled = true;
treeNodeType = TreeNodeType.Course;
lvManager.View = View.Details;
}
else if (e.Node is GroupTreeNode) // Выбрана группа
{
this.FillListView(TreeNodeType.Group, e.Node);
SelectingClient = true; // Можно выбирать клиентов
pnlGroups.Hide();
miNewClient.Enabled = true;
miNewGroup.Enabled = false;
miNewCourse.Enabled = false;
miNewDirection.Enabled = false;
cmiStatus.Enabled = false;
treeNodeType = TreeNodeType.Group;
lvManager.View = View.List;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void rbClients_CheckedChanged(object sender, System.EventArgs e)
{
RadioButton rb = (RadioButton)sender;
this.InsertToDataGrid(mainDataSet.Tables[(string)rb.Tag]);
}
//-----------------------------------------------------------------------
private void miLargeIcons_Click(object sender, System.EventArgs e)
{
lvManager.View = View.LargeIcon;
miLargeIcons.Checked = true;
miDetails.Checked = false;
miSmallIcon.Checked = false;
miList.Checked = false;
}
//-----------------------------------------------------------------------
private void miDetails_Click(object sender, System.EventArgs e)
{
lvManager.View = View.Details;
miLargeIcons.Checked = false;
miDetails.Checked = true;
miSmallIcon.Checked = false;
miList.Checked = false;
}
//-----------------------------------------------------------------------
private void miSmallIcon_Click(object sender, System.EventArgs e)
{
lvManager.View = View.SmallIcon;
miLargeIcons.Checked = false;
miDetails.Checked = false;
miSmallIcon.Checked = true;
miList.Checked = false;
}
//-----------------------------------------------------------------------
private void miList_Click(object sender, System.EventArgs e)
{
lvManager.View = View.List;
miLargeIcons.Checked = false;
miDetails.Checked = false;
miSmallIcon.Checked = false;
miList.Checked = true;
}
// Добавляем нового клиента
private void miNewClient_Click(object sender, System.EventArgs e)
{
this.AddNewClient();
tvManager_AfterSelect(tvManager, new TreeViewEventArgs(selectedNode));
}
// Добавляем новую группу
private void miNewGroup_Click(object sender, System.EventArgs e)
{
this.AddNewGroup();
tvManager_AfterSelect(tvManager, new TreeViewEventArgs(selectedNode));
}
//-----------------------------------------------------------------------
private void cmiHide_Click(object sender, System.EventArgs e)
{
this.Hide();
}
//-----------------------------------------------------------------------
private void cmiShow_Click(object sender, System.EventArgs e)
{
this.Show();
}
//-----------------------------------------------------------------------
private void cmiExit_Click(object sender, System.EventArgs e)
{
this.Close();
}
//-----------------------------------------------------------------------
private void lvManager_Click(object sender, System.EventArgs e)
{
if (lvManager.SelectedItems.Count != 0)
{
selectedItem = (CustomListItem)lvManager.SelectedItems[0];
lvManager.ForeColor = selectedItem.ForeColor;
miCopy.Enabled = true;
}
}
// Главная панель кнопок
private void tbMain_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if (e.Button.Equals(tbnFind))
{
this.SearchClient();
}
if (e.Button.Equals(tbnEmployees))
{
this.OpenEmployees();
}
if (e.Button.Equals(tbnRefreshMainDB))
{
this.UpdateMainData();
}
}
//-----------------------------------------------------------------------
private void miExit_Click(object sender, System.EventArgs e)
{
this.Close();
}
//-----------------------------------------------------------------------
private void cmiFilling_Click(object sender, System.EventArgs e)
{
cmiFilling.Checked = true;
cmiStuding.Checked = false;
cmiFinished.Checked = false;
ChangeStatus(lvManager.SelectedItems, StatusType.Filling);
}
//-----------------------------------------------------------------------
private void cmiStuding_Click(object sender, System.EventArgs e)
{
cmiFilling.Checked = false;
cmiStuding.Checked = true;
cmiFinished.Checked = false;
ChangeStatus(lvManager.SelectedItems, StatusType.Learning);
}
//-----------------------------------------------------------------------
private void cmiFinished_Click(object sender, System.EventArgs e)
{
cmiFilling.Checked = false;
cmiStuding.Checked = false;
cmiFinished.Checked = true;
ChangeStatus(lvManager.SelectedItems, StatusType.Finished);
}
//-----------------------------------------------------------------------
private void btnCalculate_Click(object sender, System.EventArgs e)
{
DataRowView drvData = (DataRowView)currManagerTotal.Current;
CalculateTotalPage(drvData.Row);
}
//-----------------------------------------------------------------------
private void lvManager_DoubleClick(object sender, System.EventArgs e)
{
OpenItemInForm(treeNodeType);
}
//-----------------------------------------------------------------------
private void frmManager_Resize(object sender, System.EventArgs e)
{
Form f = (Form)sender;
double x = (double)f.Width / 2;
dgOut.Width = (int)x;
panel3.AutoScroll = true;
int step = panel10.Width / 3;
Point pt1 = new Point(step, splitter3.Location.Y);
splitter3.Location = pt1;
Point pt2 = new Point(2 * step, splitter3.Location.Y);
splitter3.Location = pt2;
this.SetWitdhForDataGrids();
}
//-----------------------------------------------------------------------
private void miNewCourse_Click(object sender, System.EventArgs e)
{
this.AddNewCourse();
tvManager_AfterSelect(tvManager, new TreeViewEventArgs(selectedNode));
}
//-----------------------------------------------------------------------
private void miNewDirection_Click(object sender, System.EventArgs e)
{
this.AddNewDirection();
tvManager_AfterSelect(tvManager, new TreeViewEventArgs(selectedNode));
}
//-----------------------------------------------------------------------
private void dgIncome_DoubleClick(object sender, System.EventArgs e)
{
MessageBox.Show("OK");
}
private void miCopy_Click(object sender, System.EventArgs e)
{
try
{
if (SelectingClient)
{
oldGroupNode = selectedNode;
miPaste.Enabled = true;
miCopy.Enabled = false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void miPaste_Click(object sender, System.EventArgs e)
{
try
{
if(SelectingClient)
{
TransferClients(oldGroupNode, selectedNode);
miPaste.Enabled = false;
miCopy.Enabled = false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Удаление записей
private void miDelete_Click(object sender, System.EventArgs e)
{
try
{
DialogResult dr = MessageBox.Show("Вы действительно желаете удалить запись?",
"Удаление записи", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (dr == DialogResult.OK)
{
foreach (ListViewItem lvi in lvManager.SelectedItems)
{
if (!(selectedNode is GroupTreeNode))
{
CustomListItem item = (CustomListItem)lvi;
selectedNode.Nodes.Remove(selectedNode.Nodes[item.Index]);
item.BindedRow.Delete();
lvManager.Items.Remove(item);
}
else
{
CustomListItem item = (CustomListItem)lvi;
item.BindedRow.Delete();
lvManager.Items.Remove(item);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void btnUpdateMain_Click(object sender, System.EventArgs e)
{
this.UpdateMainData();
}
//-----------------------------------------------------------------------
private void miContents_Click(object sender, System.EventArgs e)
{
Help.ShowHelp(this, hpManager.HelpNamespace);
}
//-----------------------------------------------------------------------
private void directions_RowDeleted(object sender, DataRowChangeEventArgs e)
{
MessageBox.Show(e.Row[1].ToString() + " is deleted");
}
//-----------------------------------------------------------------------
private void lnkToday_Click(object sender, System.EventArgs e)
{
if (currManagerTotal.Position == mainDataSet.data.Rows.Count - 2)
currManagerTotal.Position += 1;
}
//-----------------------------------------------------------------------
private void btnCreateGroup_Click(object sender, System.EventArgs e)
{
this.AddNewGroupWaitingRoom();
}
//-----------------------------------------------------------------------
private void btnCreateClient_Click(object sender, System.EventArgs e)
{
this.AddNewClientWaitingRoom();
}
//-----------------------------------------------------------------------
private void btnShowGroups_Click(object sender, System.EventArgs e)
{
dgGroups.DataSource = null;
dgClients.DataSource = null;
if (cmbDirections.SelectedIndex >= 0)
{
this.LoadCoursesDataGrid(cmbDirections.SelectedIndex + 1);
}
btnCreateGroup.Enabled = false;
btnCreateClient.Enabled = false;
btnShowGroups.Enabled = false;
btnDeleteClient.Enabled = false;
btnDeleteGroup.Enabled = false;
}
// Показать клиентов
//-----------------------------------------------------------------------
internal void dgGroups_Click(object sender, System.EventArgs e)
{
try
{
if (dgGroups.DataSource != null)
{
DataGrid dg = (DataGrid)sender;
int rowID = dg.CurrentRowIndex;
if (rowID >= 0)
{
DataView dvGroups = (DataView)dg.DataSource;
DataRow group = dvGroups[rowID].Row;
int groupID = (int)group["groupID"];
btnDeleteGroup.Enabled = true;
btnDeleteGroup.Tag = groupID;
DataView dvGroupClients = new DataView(mainDataSet.group_clients);
dvGroupClients.RowFilter = "groupID = " + groupID.ToString();
DataRow[] clients = new DataRow[dvGroupClients.Count];
// Получаем записи клиентов
int i = 0;
foreach (DataRowView drv in dvGroupClients)
clients[i++] = drv.Row.GetParentRow("clientsgroup_clients");
// Помещаем полученные записи в таблицу dtClients
if (clients.Length > 0)
{
DataTable dtClients = clients[0].Table.Clone();
foreach (DataRow client in clients)
dtClients.Rows.Add(client.ItemArray);
dgClients.DataSource = dtClients;
dtClients.RowChanged+=new DataRowChangeEventHandler(dtClients_RowChanged);
cmClientsTable = (CurrencyManager)this.BindingContext[dtClients, null];
}
else
dgClients.DataSource = null;
btnCreateClient.Enabled = true;
btnFindPasteClient.Enabled = true;
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Показать группы
private void dgCourses_Click(object sender, System.EventArgs e)
{
DataGrid dg = (DataGrid)sender;
int rowID = dg.CurrentRowIndex;
if (rowID >= 0)
{
DataView dvCourses = (DataView)dg.DataSource;
DataRow course = dvCourses[rowID].Row;
int courseID = (int)course["courseID"];
int statusID = cmbGroupStatus.SelectedIndex + 1;
DataView dvGroups = new DataView(mainDataSet.groups);
dvGroups.RowFilter = "courseID = " + courseID.ToString() + " AND StatusID = " + statusID.ToString();
cmGroupsTable = (CurrencyManager)this.BindingContext[dvGroups, null];
dgGroups.DataSource = dvGroups;
btnCreateGroup.Enabled = true;
btnCreateClient.Enabled = false;
btnFindPasteClient.Enabled = false;
btnDeleteClient.Enabled = false;
btnDeleteGroup.Enabled = false;
dgClients.DataSource = null;
}
}
//-----------------------------------------------------------------------
private void cmiClientPersonData_Click(object sender, System.EventArgs e)
{
try
{
int rowID = dgClients.CurrentRowIndex;
if (rowID >= 0)
{
DataView dvGroups = (DataView)dgGroups.DataSource;
int selectedGroupRowID = (int)dvGroups[dgGroups.CurrentRowIndex].Row["groupID"];
DataRow selectedGroupRow = dvGroups[dgGroups.CurrentRowIndex].Row;
DataTable dtClients = (DataTable)dgClients.DataSource;
DataRow clientRow = dtClients.Rows[rowID];
frmClient client = new frmClient(clientRow, this.mainDataSet);
// Определяем данные по умолчанию на форме клиента
int clientID = (int)clientRow["clientID"];
client.ClientID = clientID;
client.txtFirstName.Text = clientRow["fname"].ToString();
client.txtLastName.Text = clientRow["lname"].ToString();
client.txtFatherName.Text = clientRow["fathName"].ToString();
DataView dvIncome = new DataView(mainDataSet.income);
dvIncome.RowFilter = "clientID = " + clientID.ToString();
client.Text += selectedGroupRowID.ToString();
client.dgPayments.DataSource = dvIncome;
DataView dvRealizedTable = new DataView(mainDataSet.RealizedTable);
dvRealizedTable.RowFilter = "clientID = " + clientID.ToString();
client.dgClientsRealization.DataSource = dvRealizedTable;
client.GroupID = selectedGroupRowID;
client.MainForm = this;
if (client.ShowDialog() == DialogResult.OK)
{
// Обновление оригинальной записи клиента,
// т.к. источником у таблицы клиентов является копия таблицы
MainDataSet.clientsRow originalClientRow = mainDataSet.clients.FindByclientID(clientID);
originalClientRow["fname"] = client.txtFirstName.Text;
originalClientRow["lname"] = client.txtLastName.Text;
originalClientRow["fathName"] = client.txtFatherName.Text;
originalClientRow["linkData"] = client.txtPhones.Text;
originalClientRow["recorddate"] = client.dtpRecordDate.Value;
originalClientRow["note"] = client.txtNotes.Text;
// Обновление копии записи клиента
clientRow["fname"] = client.txtFirstName.Text;
clientRow["lname"] = client.txtLastName.Text;
clientRow["fathName"] = client.txtFatherName.Text;
clientRow["linkData"] = client.txtPhones.Text;
clientRow["recorddate"] = client.dtpRecordDate.Value;
clientRow["note"] = client.txtNotes.Text;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void dgGroups_DoubleClick(object sender, System.EventArgs e)
{
try
{
int selectedGroupRowID = dgGroups.CurrentRowIndex;
if (selectedGroupRowID >= 0)
{
int selectedCourseID = dgCourses.CurrentRowIndex;
DataView dvCourses = (DataView)dgCourses.DataSource;
DataRow selectedCourseRow = dvCourses[selectedCourseID].Row;
DataView dvGroups = (DataView)dgGroups.DataSource;
DataRow selectedGroupRow = dvGroups[selectedGroupRowID].Row;
frmGroup group = new frmGroup(mainDataSet, selectedGroupRow);
group.Text += selectedCourseRow["courseName"].ToString();
if (group.ShowDialog() == DialogResult.OK)
{
dgCourses_Click(dgCourses, new EventArgs());
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void cmbDirections_Validated(object sender, System.EventArgs e)
{
if (cmbDirections.SelectedIndex >= 0 cmbGroupStatus.SelectedIndex >= 0)
btnShowGroups.Enabled = true;
else
btnShowGroups.Enabled = false;
}
//-----------------------------------------------------------------------
private void cmbGroupStatus_Validated(object sender, System.EventArgs e)
{
if (cmbDirections.SelectedIndex >= 0 cmbGroupStatus.SelectedIndex >= 0)
btnShowGroups.Enabled = true;
else
btnShowGroups.Enabled = false;
}
//-----------------------------------------------------------------------
private void frmManager_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
DataSet ds = mainDataSet.GetChanges();
if (ds != null)
if (MessageBox.Show("Были произведены изменения в таблицах.\nВы желаете обновить данные в базе данных ?", "Внимание", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
== DialogResult.Yes)
UpdateMainData();
if (MessageBox.Show("Вы действительно желаете выйти из программы ?", "Внимание", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
== DialogResult.No)
e.Cancel = true;
}
//-----------------------------------------------------------------------
private void btnPrevDate_Click(object sender, System.EventArgs e)
{
int dataID = 0;
if (currManagerTotal.Position > 0)
{
currManagerTotal.Position -= 1;
DataRowView drvDataRow = (DataRowView)currManagerTotal.Current;
dataID = (int)drvDataRow.Row["dataID"];
DateTime date = (DateTime)drvDataRow.Row["currentDate"];
lblDateTime.Text = date.ToString("dd MMMM yyyy");
}
DataRowView drvData = (DataRowView)currManagerTotal.Current;
CalculateTotalPage(drvData.Row);
currentDataID = dataID;
switch (userGroup)
{
case frmAuthorization.UserGroup.PManagers:
if (dataID == DataID)
dgIncome.ReadOnly = false;
else
dgIncome.ReadOnly = true;
break;
}
}
//-----------------------------------------------------------------------
private void btnNextDate_Click(object sender, System.EventArgs e)
{
int dataID = 0;
if (currManagerTotal.Position < mainDataSet.data.Rows.Count)
{
currManagerTotal.Position += 1;
DataRowView drvDataRow = (DataRowView)currManagerTotal.Current;
dataID = (int)drvDataRow.Row["dataID"];
DateTime date = (DateTime)drvDataRow.Row["currentDate"];
lblDateTime.Text = date.ToString("dd MMMM yyyy");
}
DataRowView drvData = (DataRowView)currManagerTotal.Current;
CalculateTotalPage(drvData.Row);
currentDataID = dataID;
switch (userGroup)
{
case frmAuthorization.UserGroup.PManagers:
if (dataID == DataID)
dgIncome.ReadOnly = false;
else
dgIncome.ReadOnly = true;
break;
}
}
//-----------------------------------------------------------------------
private void cmbFilteringDirection_SelectionChangeCommitted(object sender, EventArgs e)
{
btnCalculateOwe.Enabled = true;
}
//-----------------------------------------------------------------------
private void btnCalculateOwe_Click(object sender, EventArgs e)
{
this.GetOweStatistic();
}
//-----------------------------------------------------------------------
private void cmiFindIncomeOutClient_Click(object sender, EventArgs e)
{
try
{
frmSearchClient f = new frmSearchClient(this.mainDataSet);
if ((f.ShowDialog() == DialogResult.OK)
(f.SelectedRow != null)
(dgIncome.CurrentCell.ColumnNumber == 0))
{
MainDataSet.dataRow totalRow = mainDataSet.data.FindBydataID(currentDataID);
DataView dvIncome = new DataView(mainDataSet.income);
dvIncome.RowFilter = "dataID = " + currentDataID.ToString();
DataRow incomeRow = dvIncome[dgIncome.CurrentRowIndex].Row;
incomeRow["clientID"] = (int)f.SelectedRow["clientID"];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void income_RowChanging(object sender, DataRowChangeEventArgs e)
{
MessageBox.Show("OK");
}
//-----------------------------------------------------------------------
private void dgClients_MouseUp(object sender, MouseEventArgs e)
{
try
{
Point point = new Point(e.X, e.Y);
System.Windows.Forms.DataGrid.HitTestInfo hti = dgClients.HitTest(point);
dgClients.ContextMenu = null;
if (hti.Row >= 0)
{
if (e.Button == MouseButtons.Right)
{
cmiFindClientsClientID.Visible = false;
if (hti.Column == 0)
cmiFindClientsClientID.Visible = true;
dgClients.CurrentRowIndex = hti.Row;
cmClients.Show(dgClients, point);
}
btnDeleteClient.Enabled = true;
DataTable table = (DataTable)dgClients.DataSource;
if (hti.Row <= table.Rows.Count - 1)
btnDeleteClient.Tag = table.Rows[hti.Row]["clientID"];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void cmiFindClientsClientID_Click(object sender, EventArgs e)
{
try
{
frmSearchClient f = new frmSearchClient(this.mainDataSet);
if ((f.ShowDialog() == DialogResult.OK)
(f.SelectedRow != null)
(dgClients.CurrentCell.ColumnNumber == 0))
{
DataTable dtClients = (DataTable)dgClients.DataSource;
DataRow clientRow = dtClients.Rows[dgClients.CurrentRowIndex];
DataGridColumnStyle column = dgClients.TableStyles["clients"].GridColumnStyles[0];
column.ReadOnly = false;
clientRow["clientID"] = (int)f.SelectedRow["clientID"];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void btnFindPasteClient_Click(object sender, EventArgs e)
{
frmSearchClient f = new frmSearchClient(this.mainDataSet);
if (f.ShowDialog() == DialogResult.OK)
{
DataRow newClient = mainDataSet.clients.NewRow();
int intClientIDToTableClientGroups;
intClientIDToTableClientGroups = (int)f.SelectedRow["clientID"];
// Добавляем данные в таблицу Group_Clients
DataRow newGroupClientRow = mainDataSet.group_clients.NewRow();
newGroupClientRow["clientID"] = intClientIDToTableClientGroups;
DataView dvGroups = (DataView)dgGroups.DataSource;
DataRow group = dvGroups[dgGroups.CurrentRowIndex].Row;
int groupID = (int)group["groupID"];
newGroupClientRow["groupID"] = groupID;
mainDataSet.group_clients.Rows.Add(newGroupClientRow);
dgGroups_Click(dgGroups, new EventArgs());
}
}
//-----------------------------------------------------------------------
private void menuItem8_Click(object sender, System.EventArgs e)
{
this.LoadPaymentDataBase();
}
//-----------------------------------------------------------------------
private void frmManager_Closed(object sender, EventArgs e)
{
System.Environment.Exit(1);
}
//-----------------------------------------------------------------------
private void miChangePassword_Click(object sender, EventArgs e)
{
frmPassword pass = new frmPassword();
if (pass.ShowDialog() == DialogResult.OK)
{
}
}
//-----------------------------------------------------------------------
private void dgIncome_MouseUp(object sender, MouseEventArgs e)
{
try
{
this.RemoveTempFindControl();
if (e.Button == MouseButtons.Right)
{
int delta = 0;
DataGrid dg = (DataGrid)sender;
DataGrid.HitTestInfo hti = dg.HitTest(e.X, e.Y);
DataView dv = (DataView)currManagerIncome.List;
FindControl.FindControl fc = null;
int columnIndex = hti.Column;
int rowIndex = hti.Row;
if ((columnIndex == -1) || (rowIndex == -1))
return;
else
{
fc = new FindControl.FindControl();
fc.Visible = true;
fc.Tag = "Temp";
string tableName = dg.Tag.ToString();
delta = (tableName == "income") ? 0 : 60 ;
fc.Table = mainDataSet.Tables[tableName];
fc.TargetRow = (tableName == "income") ? this.GetTablesRow(fc.Table, rowIndex, currManagerIncome):
this.GetTablesRow(fc.Table, rowIndex, currManagerOut);
if (fc.TargetRow == null)
{
Exception ex = new Exception("Ошибка получения записи.");
throw ex;
}
// Выбрано поле ClientID в таблице expenses или income
if (((tableName == "income") || (tableName == "expenses")) (columnIndex == 3))
{
fc.SelectingForm = new frmSearchClient(this.mainDataSet);
int objectID = (int)fc.TargetRow["ClientID"];
DataRow personRow = (DataRow)mainDataSet.clients.FindByclientID(objectID);
//fc.PersonForm = new frmClient(personRow, this.mainDataSet);
fc.PersonForm = new frmClient(this.mainDataSet);
fc.ColumnName = "clientID";
fc.Text = "Client";
}
// Выбрано поле PaymentTypeID в таблице expenses или income
else if (((tableName == "income") || (tableName == "expenses")) (columnIndex == 1))
{
fc.SelectingForm = new frmPaymentType(this.mainDataSet);
fc.PersonForm = new frmPaymentType(this.mainDataSet);
fc.ColumnName = "payment_typeID";
fc.Text = "Payment";
}
// Выбрано поле EmployeeID в таблице expenses
else if ((tableName == "expenses") (columnIndex == 4))
{
fc.SelectingForm = new frmEmployee(this.mainDataSet);
fc.PersonForm = new frmEmployee(this.mainDataSet);
fc.ColumnName = "employeeID";
fc.Text = "Employee";
}
else
return;
// Добавляем пользовательский элемент управления поиска
this.tcManager.TabPages[2].Controls.Add(fc);
Point worldPoint = dg.PointToScreen(new Point(e.X - delta, e.Y));
Point controlPoint = tcManager.PointToClient(worldPoint);
fc.Location = controlPoint;
fc.BringToFront();
fc.RowSelected += new FindControl.RowSelectedDelegate(fc_RowSelected);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void fc_RowSelected(FindControl.FindControl findControl, DataTable table)
{
try
{
SelectingFormInterface.ISelectingForm selectingForm = findControl.SelectingForm;
if (selectingForm.SelectedRow == null)
{
MessageBox.Show("Не выбрана запись", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
findControl.TargetRow[findControl.ColumnName] = selectingForm.SelectedRow[findControl.ColumnName];
if (findControl.TargetRow.RowState == DataRowState.Detached)
table.Rows.Add(findControl.TargetRow);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void btnShowPaymentTypeForm_Click(object sender, EventArgs e)
{
frmPaymentType fpt = new frmPaymentType(this.mainDataSet);
fpt.ShowDialog();
}
//-----------------------------------------------------------------------
private void frmManager_Load(object sender, EventArgs e)
{
this.SetWitdhForDataGrids();
}
//-----------------------------------------------------------------------
private void dtClients_RowChanged(object sender, DataRowChangeEventArgs e)
{
DataRow clientRow = mainDataSet.clients.FindByclientID((int)e.Row["clientID"]);
clientRow["fname"] = e.Row["fname"];
clientRow["lname"] = e.Row["lname"];
clientRow["fathName"] = e.Row["fathName"];
clientRow["linkData"] = e.Row["linkData"];
clientRow["recorddate"] = e.Row["recorddate"];
clientRow["note"] = e.Row["note"];
clientRow["paymentType"] = e.Row["paymentType"];
clientRow["isRinged"] = e.Row["isRinged"];
}
private void menuItem12_Click(object sender, System.EventArgs e)
{
this.UpdateMainData();
}
private void mnuUpdateMainDataBase_Click(object sender, System.EventArgs e)
{
this.UpdateMainData();
}
// Удаление клиента со страницы 'Приемная'
private void btnDeleteClient_Click(object sender, EventArgs e)
{
try
{
if (btnDeleteClient.Tag == null)
{
MessageBox.Show("Нельзя удалить клиента!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
int clientID = (int)btnDeleteClient.Tag;
MainDataSet.clientsRow clientRow = mainDataSet.clients.FindByclientID(clientID);
btnDeleteClient.Enabled = false;
clientRow.Delete();
dgGroups_Click(dgGroups, new EventArgs());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
#endregion
#region Переопределяемые методы
protected override void Dispose( bool disposing )
{
// Описание метода
}
//-----------------------------------------------------------------------
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);
}
#endregion
}
}
При запуске программы пользователь вводит свой логин в домене и пароль (см. рис. 11.1). К примеру, мы рассматриваем домен SomeDomain. Пользователь вводит свою учетную запись в домене, например SomeDomain\someUser, и пароль. Далее проверяется принадлежность пользователя группам Administrators, Managers, Recipients. Эти группы пользователей должны быть предварительно созданы администратором, в противном случае пользователь будет иметь группу FailGroup и не сможет запустить программу. Если пользователь авторизован, то, в зависимости от принадлежности к группе, интерфейс программы будет выглядеть по-разному, т.е. какие-то функции доступны, а какие-то — нет.
Приступим к созданию этой формы. Помещаем на форму из панели ToolBox следующие элементы управления:
TextBox: txtUserName и txtPassword и две надписи Label со свойствами Text "User name:" и "Password:" соответственно. Для элементов TextBox создаем обработчики события TextChanged (см. код программы).btnOK и btnCancel со свойствами Text "OK" и "Cancel" соответственно. Для них создаем обработчиков события Click (см. код программы). Также устанавливаем свойства DialogResult для этих кнопок "OK" и "Cancel" соответственно.Устанавливаем следующие свойства формы:
frmAuthorization, Свойство | Значение |
|---|---|
Text |
Authorization |
AcceptButton |
btnOK |
CancelButton |
btnCancel |
Добавляем в класс формы frmAuthorization следующие методы:
| Сигнатура методов | Описание методов |
|---|---|
private void OpenMainForm(UserGroup userGroup, Label label) |
Открытие главной формы для пользователя с данной группой прав |
private void CheckLogin() |
Авторизация пользователя |
private void InitialDefaultSettings() |
Настройки по умолчанию |
private void CheckTextBoxes() |
Проверка полей ввода |
Создаем обработчик события Activate для формы (см. код программы).
Также в класс формы добавим перечисление с константами групп пользователей:
internal enum UserGroup
{
Administrators,
Managers,
Recipients,
FailGroup
}
Листинг формы frmAuthorization:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Security.Principal;
using System.Windows.Forms;
using System.DirectoryServices;
using System.Management;
using Manager.Schemas;
using Manager.Forms;
using System.Globalization;
using System.Security.Permissions;
using System.Threading;
namespace Manager
{
public class frmAuthorization : System.Windows.Forms.Form
{
// Объявление элементов управления.
internal enum UserGroup
{
Administrators,
Managers,
Recipients,
FailGroup
}
public frmAuthorization()
{
InitializeComponent();
this.InitialDefaultSettings();
}
// Открытие главной формы для пользователя с определенной группой доступа.
private void OpenMainForm(UserGroup userGroup, Label label)
{
frmManager mainForm = new frmManager();
mainForm.userGroup = userGroup;
switch (userGroup)
{
case UserGroup.Administrators:
mainForm.panel12.Visible = true;
mainForm.gbPaymentDB.Visible = true;
mainForm.tbMain.Buttons[3].Visible = true;
mainForm.rbDataMain.Visible = true;
mainForm.rbIncomeMain.Visible = true;
mainForm.rbOutMain.Visible = true;
mainForm.dgWorkTable.ReadOnly = false;
mainForm.tcManager.SelectedTab = mainForm.tcManager.TabPages[1];
mainForm.mnuSecurity.Visible = false;
mainForm.btnShowPaymentTypeForm.Visible = true;
break;
case UserGroup.Managers:
mainForm.panel12.Visible = false;
mainForm.panel16.Dock = DockStyle.Fill;
mainForm.panel18.Visible = false;
mainForm.gbPaymentDB.Visible = false;
mainForm.tbMain.Buttons[3].Visible = false;
mainForm.rbDataMain.Visible = false;
mainForm.dgOut.Visible = false;
mainForm.splitter2.Visible = false;
mainForm.rbIncomeMain.Visible = true;
mainForm.rbOutMain.Visible = false;
mainForm.dgWorkTable.ReadOnly = false;
mainForm.tcManager.SelectedTab = mainForm.tcManager.TabPages[0];
mainForm.mnuSecurity.Visible = false;
mainForm.btnShowPaymentTypeForm.Visible = false;
break;
case UserGroup.Recipients:
mainForm.panel12.Visible = false;
mainForm.panel16.Dock = DockStyle.Fill;
mainForm.panel18.Visible = false;
mainForm.gbPaymentDB.Visible = false;
mainForm.tbMain.Buttons[3].Visible = false;
mainForm.rbDataMain.Visible = false;
mainForm.dgOut.Visible = false;
mainForm.splitter2.Visible = false;
mainForm.rbIncomeMain.Visible = false;
mainForm.rbOutMain.Visible = false;
mainForm.dgWorkTable.ReadOnly = false;
mainForm.tcManager.SelectedTab = mainForm.tcManager.TabPages[0];
mainForm.gbBaseTables.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
mainForm.mnuSecurity.Visible = false;
mainForm.btnShowPaymentTypeForm.Visible = false;
break;
case UserGroup.FailGroup:
MessageBox.Show("Вы не имеете полномочий запускать данное приложение.\n\n" +
"Чтобы запустить, приложение вам необходимо принадлежать группам:\n" +
"Administrators, Managers или Recipients.\n\n" +
"Проверьте учетную запись или обратитесь к администратору.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
System.Environment.Exit(1);
break;
}
label.Text = "Loading database ...";
mainForm.LoadMainDataBase();
label.Text = "Checking data ...";
mainForm.PasteDateRow();
label.Text = "Loading ...";
mainForm.FillPaymentsPage();
mainForm.Explorer();
mainForm.Show();
mainForm.CheckEmployeesBirthDays();
label.Text = "Ready";
}
// Проверка имени и пароля
private void CheckLogin()
{
try
{
frmHeadBand headBand = new frmHeadBand();
headBand.Show();
headBand.Cursor = Cursors.WaitCursor;
headBand.label1.Text = "Checking...";
this.Visible = false;
UserGroup userGroup = UserGroup.FailGroup;
DirectoryEntry de=new DirectoryEntry();
try
{
de.Path = "LDAP:// ";
de.Username = txtUserName.Text;
de.Password = txtPassword.Text;
// Если была неверно введена учетная запись,
//тогда инструкция if сгенерирует исключение
//System.Runtime.InteropServices.COMException
if(de.NativeObject == null)
MessageBox.Show("Failed");
}
catch(System.Runtime.InteropServices.COMException)
{
headBand.Dispose();
MessageBox.Show("Неверное имя пользователя или пароль",
"Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
System.Environment.Exit(1);
}
WindowsIdentity wi = WindowsIdentity.GetCurrent();
WindowsPrincipal wp = new WindowsPrincipal(wi);
if (wi.Name.ToLower() != de.Username.ToLower())
{
headBand.Dispose();
MessageBox.Show("Вы не имеете полномочий запускать данное приложение.\n\n" +
"Проверьте, что ваша учетная запись совпадает с текущей учетной записью.",
"Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
System.Environment.Exit(1);
}
// Авторизация пользователя
if (wp.IsInRole(@"SomeDomain\Administrators")) // Administrators
userGroup = UserGroup.Administrators;
else if (wp.IsInRole(@"SomeDomain \Managers")) // Managers
userGroup = UserGroup.Managers;
else if (wp.IsInRole(@"SomeDomain \Recipients")) // Recipients
userGroup = UserGroup.Recipients;
this.OpenMainForm(userGroup, headBand.label1);
headBand.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
System.Environment.Exit(1);
}
}
// Настройки по умолчанию
private void InitialDefaultSettings()
{
this.MinimumSize = this.Size;
this.MaximumSize = this.Size;
this.StartPosition = FormStartPosition.CenterScreen;
this.txtUserName.TextChanged += new EventHandler(txtUserName_TextChanged);
this.txtPassword.TextChanged += new EventHandler(txtPassword_TextChanged);
this.btnOK.Click += new EventHandler(btnOK_Click);
this.btnCancel.Click += new EventHandler(btnCancel_Click);
this.Activated += new EventHandler(frmAuthorization_Activated);
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private static void Main()
{
Application.Run(new frmAuthorization());
}
private void InitializeComponent()
{
// Описание метода
}
#endregion
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void CheckTextBoxes()
{
if ((txtPassword.Text != "") (txtUserName.Text != ""))
btnOK.Enabled = true;
else
btnOK.Enabled = false;
}
private void txtUserName_TextChanged(object sender, EventArgs e)
{
this.CheckTextBoxes();
}
private void txtPassword_TextChanged(object sender, EventArgs e)
{
this.CheckTextBoxes();
}
private void btnOK_Click(object sender, EventArgs e)
{
this.CheckLogin();
}
private void frmAuthorization_Activated(object sender, EventArgs e)
{
WindowsIdentity t = WindowsIdentity.GetCurrent();
this.txtUserName.Text=t.Name.ToString();
this.txtPassword.Focus();
}
}
}
Эта форма используется для создания новых учебных направлений в окне проводника главной формы. Для добавления направления щелкаем в проводнике правой кнопкой и в появившемся контекстном меню выбираем New-Direction (рис. 11.31).
(рис 11.31) Создание нового направленияВ результате появляется окно, в которое вводим название направления и его описание (рис. 11.32).
(рис 11.32) Форма frmDirectionПриступим к созданию этой формы. Помещаем на нее из окна ToolBox следующие элементы управления:
TextBox txtDirectionName, две надписи Label lblDirectionName и lblDirectionNote со свойствами Text "Направление:" и "Описание:" соответственно. Элемент TextBox txtDirectionNote (устанавливаем свойству MultiLine значение true ). Для элементов TextBox создаем обработчики событий Validated (см. код программы).btnOK и btnCancel со свойствами Text "OK" и "Cancel" соответственно. Для них создаем обработчиков события Click (см. код программы). Также устанавливаем свойства DialogResult для этих кнопок "OK" и "Cancel" соответственно.Устанавливаем свойства формы frmDirection:
| Свойство | Значение |
|---|---|
Text |
Учебный центр |
AcceptButton |
BtnOK |
CancelButton |
BtnCancel |
Для формы создаем обработчик события Load (см. код программы).
В классе формы добавляем поле и свойство для него:
private DataRow bindingRow;
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
Помимо конструктора по умолчанию, будем использовать следующий конструктор:
public frmDirection(DataRow bindingRow)
{
InitializeComponent();
this.bindingRow = bindingRow;
this.txtDirectionName.Text = bindingRow["directName"].ToString();
this.txtDirectionNote.Text = bindingRow["note"].ToString();
}
Далее листинг формы:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace Manager
{
/// <summary>
/// Форма для направлений.
/// </summary>
public class frmDirection : System.Windows.Forms.Form
{
// Описание элементов управления
public frmDirection()
{
InitializeComponent();
}
private DataRow bindingRow;
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
public frmDirection(DataRow bindingRow)
{
InitializeComponent();
this.bindingRow = bindingRow;
this.txtDirectionName.Text = bindingRow["directName"].ToString();
this.txtDirectionNote.Text = bindingRow["note"].ToString();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
#endregion
private void txtDirectionName_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (txtDirectionName.Text != this.bindingRow["directName"].ToString())
{
this.bindingRow["directName"] = txtDirectionName.Text;
}
}
private void txtDirectionNote_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (txtDirectionNote.Text != this.bindingRow["note"].ToString())
{
this.bindingRow["note"] = txtDirectionNote.Text;
}
}
private void frmDirection_Load(object sender, System.EventArgs e)
{
txtDirectionName.Focus();
}
}
}
При копировании клиента из группы и последующей его вставки в другую группу появляется промежуточная форма перевода. Для ее создания помещаем на форму из окна ToolBox следующие элементы управления (рис. 11.33):
(рис 11.33) Форма frmClientTransferЛистинг этой формы:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace Manager
{
/// <summary>
/// Промежуточная форма управления клиентом.
/// </summary>
public class frmClientTransfer : System.Windows.Forms.Form
{
// Описание элементов управлений
public frmClientTransfer()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void frmClientTransfer_Load(object sender, System.EventArgs e)
{
txtClientName.Focus();
}
}
}
В программе реализована возможность поиска клиентов по фамилии, имени или дате записи. Располагаем на форме элементы управления, изображенные на рис. 11.34.
(рис 11.34) Форма frmSearchClientДля кнопок создаем обработчиков события Click. (см. код программы). Обратите внимание, что в коде вместо конструктора по умолчанию используется другой конструктор с параметром. Класс формы также был наследован от интерфейса ISelectingForm, и были переопределены его члены.
Листинг формы frmSearchClient:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using SelectingFormInterface;
using Manager.Forms;
namespace Manager
{
/// <summary>
/// Форма для поиска клиентов
/// </summary>
public class frmSearchClient : System.Windows.Forms.Form, ISelectingForm
{
private DataTable dtClients; // Таблица клиентов
public DataView dvSearchRez;
private CurrencyManager currManagerClients;
public CurrencyManager CurrencyManagerClients
{
get { return currManagerClients; }
set { currManagerClients = value; }
}
// Объявление элементов управления
public frmSearchClient(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
this.MakeStyleForDataGrid();
dtClients = mainDataSet.clients;
dtClients.RowChanged += new DataRowChangeEventHandler(dtSearchRez_RowChanged);
dgSearchRez.MouseUp += new MouseEventHandler(dgSearchRez_MouseUp);
dgSearchRez.Click += new EventHandler(dgSearchRez_Click);
currManagerClients = (CurrencyManager)this.BindingContext[mainDataSet, "income"];
}
private void MakeStyleForDataGrid()
{
DataGridTableStyle clientsTableStyle = new DataGridTableStyle();
clientsTableStyle.MappingName = "clients";
DataGridTextBoxColumn clientIDStyle = new DataGridTextBoxColumn();
clientIDStyle.MappingName = "clientID";
clientIDStyle.Width = 50;
clientIDStyle.HeaderText = "ID";
DataGridTextBoxColumn clientFirstNameStyle = new DataGridTextBoxColumn();
clientFirstNameStyle.MappingName = "fname";
clientFirstNameStyle.Width = 150;
clientFirstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn clientLastNameStyle = new DataGridTextBoxColumn();
clientLastNameStyle.MappingName = "lname";
clientLastNameStyle.Width = 150;
clientLastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn clientFatherNameStyle = new DataGridTextBoxColumn();
clientFatherNameStyle.MappingName = "fathName";
clientFatherNameStyle.Width = 150;
clientFatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn clientLinkDataStyle = new DataGridTextBoxColumn();
clientLinkDataStyle.MappingName = "linkData";
clientLinkDataStyle.Width = 150;
clientLinkDataStyle.HeaderText = "Контакты";
DataGridTextBoxColumn clientRecordDateStyle = new DataGridTextBoxColumn();
clientRecordDateStyle.MappingName = "recorddate";
clientRecordDateStyle.Width = 150;
clientRecordDateStyle.HeaderText = "Дата записи";
DataGridTextBoxColumn clientNotesStyle = new DataGridTextBoxColumn();
clientNotesStyle.MappingName = "note";
clientNotesStyle.Width = 150;
clientNotesStyle.HeaderText = "Заметки";
DataGridTextBoxColumn clientPaymentTypeStyle = new DataGridTextBoxColumn();
clientPaymentTypeStyle.MappingName = "paymentType";
clientPaymentTypeStyle.Width = 150;
clientPaymentTypeStyle.HeaderText = "Вид оплаты";
clientsTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
clientIDStyle,
clientFirstNameStyle,
clientLastNameStyle,
clientFatherNameStyle,
clientLinkDataStyle,
clientRecordDateStyle,
clientNotesStyle,
clientPaymentTypeStyle});
dgSearchRez.TableStyles.Add(clientsTableStyle);
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
// Начать поиск
private void btnFind_Click(object sender, System.EventArgs e)
{
try
{
dvSearchRez = new DataView(dtClients);
string str = @"fname LIKE '" + txtFname.Text + @"' OR lname LIKE '" + txtLname.Text + @"'" + @" OR recorddate = '" + dtpRecDate.Value.Date.ToString() + @"'";
dvSearchRez.RowFilter = str;
dgSearchRez.DataSource = dvSearchRez;
currManagerClients = (CurrencyManager)this.BindingContext[dvSearchRez, null];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Обновление данных
private void btnGetChanges_Click(object sender, System.EventArgs e) // внести изменения
{
try
{
daSearch.Update(dtClients.GetChanges());
btnGetChanges.Enabled = false;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Доступ к кнопке изменений
private void dtSearchRez_RowChanged(object sender, DataRowChangeEventArgs e)
{
btnGetChanges.Enabled = true;
}
private void btnExit_Click(object sender, System.EventArgs e)
{
this.Close();
}
private void dgSearchRez_ShowParentDetailsButtonClick(object sender, EventArgs e)
{
MessageBox.Show("OK");
}
private void dgSearchRez_MouseUp(object sender, MouseEventArgs e)
{
Point point = new Point(e.X, e.Y);
int rowIndex = dgSearchRez.CurrentRowIndex;
if (rowIndex >= 0)
{
System.Windows.Forms.DataGrid.HitTestInfo hti = dgSearchRez.HitTest(point);
this.SelectedRow = dvSearchRez[hti.Row].Row;
}
}
#region IFindingForm Members
private DataRow selectedRow;
public DataRow SelectedRow
{
get
{
return selectedRow;
}
set
{
selectedRow = value;
}
}
#endregion
}
}
Форма frmClient, используемая для добавления новых клиентов, содержит ряд вкладок. Располагаем элементы управления и называем их в соответствии с рис. 11.35–11.38.

(рис 11.36) Вкладка "Данные клиента"(рис 11.35) Вкладка "Оплата и реализация"
(рис 11.38) Вкладка "Архив"(рис 11.37) Вкладка "Группы клиента"Листинг frmClient:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Manager.Forms;
namespace Manager
{
public class frmClient : System.Windows.Forms.Form
{
// Объявление элементов управления
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
private int groupID = 0;
internal int GroupID
{
get { return groupID; }
set { groupID = value; }
}
private int clientID = 0;
internal int ClientID
{
get { return clientID; }
set { clientID = value; }
}
private frmManager mainForm = null;
private Manager.Forms.MainDataSet mainDataSet1;
internal frmManager MainForm
{
get { return mainForm; }
set { mainForm = value; }
}
internal CurrencyManager cmPaymentType;
private MainDataSet mainDataSet = null;
public frmClient(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
dgPayments.Tag = "Payments";
dgClientsRealization.Tag = "Realization";
Size labelSize = new Size(this.Width, lblClientID.Size.Height);
this.lblClientID.Size = labelSize;
mainDataSet.income.Columns["clientID"].DefaultValue = this.ClientID;
mainDataSet.RealizedTable.Columns["clientID"].DefaultValue = this.ClientID;
DesigneDataGrids();
btnCreateClientPayment.Click += new EventHandler(btnCreateClientPayment_Click);
btnRealizeClient.Click += new EventHandler(btnRealizeClient_Click);
cmbPaymentType.DataSource = mainDataSet.payment_type;
cmbPaymentType.DisplayMember = "payment_typeName";
cmPaymentType = (CurrencyManager)this.BindingContext[mainDataSet, "payment_type"];
cmPaymentType.Position = 0;
//*****************************
btnFindClient.Click += new EventHandler(btnFindClient_Click);
btnSelectClient.Click += new EventHandler(btnSelectClient_Click);
dgFindedClients.MouseUp += new MouseEventHandler(dgFindedClients_MouseUp);
dgPayments.MouseUp += new MouseEventHandler(dgPayments_MouseUp);
dgClientsRealization.MouseUp += new MouseEventHandler(dgPayments_MouseUp);
//*****************************
}
public frmClient(DataRow bindingRow, MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
dgPayments.Tag = "Payments";
dgClientsRealization.Tag = "Realization";
IsCreating = true;
Size labelSize = new Size(this.Width, lblClientID.Size.Height);
this.lblClientID.Size = labelSize;
this.bindingRow = bindingRow;
this.ClientID = (int)bindingRow["clientID"];
this.lblClientID.Text += this.ClientID.ToString();
this.txtFirstName.Text = bindingRow["fname"].ToString();
this.txtLastName.Text = bindingRow["lname"].ToString();
this.txtFatherName.Text = bindingRow["fathName"].ToString();
this.txtPhones.Text = bindingRow["linkData"].ToString();
this.dtpRecordDate.Value = (DateTime)bindingRow["recordDate"];
this.txtNotes.Text = bindingRow["note"].ToString();
mainDataSet.income.Columns["clientID"].DefaultValue = this.ClientID;
mainDataSet.RealizedTable.Columns["clientID"].DefaultValue = this.ClientID;
btnCreateClientPayment.Click += new EventHandler(btnCreateClientPayment_Click);
btnRealizeClient.Click += new EventHandler(btnRealizeClient_Click);
DesigneDataGrids();
cmbPaymentType.DataSource = mainDataSet.payment_type;
cmbPaymentType.DisplayMember = "payment_typeName";
cmPaymentType = (CurrencyManager)this.BindingContext[mainDataSet, "payment_type"];
cmPaymentType.Position = 0;
//**********************
btnFindClient.Click += new EventHandler(btnFindClient_Click);
btnSelectClient.Click += new EventHandler(btnSelectClient_Click);
dgFindedClients.MouseUp += new MouseEventHandler(dgFindedClients_MouseUp);
dgPayments.MouseUp += new MouseEventHandler(dgPayments_MouseUp);
dgClientsRealization.MouseUp += new MouseEventHandler(dgPayments_MouseUp);
//**********************
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void txtLastName_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtLastName.Text != this.bindingRow["lname"].ToString())
{
this.bindingRow["lname"] = txtLastName.Text;
}
}
private void txtFirstName_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtFirstName.Text != this.bindingRow["fname"].ToString())
{
this.bindingRow["fname"] = txtFirstName.Text;
}
}
private void txtFartherName_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtFatherName.Text != this.bindingRow["fathName"].ToString())
{
this.bindingRow["fathName"] = txtFatherName.Text;
}
}
private void txtPhones_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtPhones.Text != this.bindingRow["linkData"].ToString())
{
this.bindingRow["linkData"] = txtPhones.Text;
}
}
private void dtpRecordDate_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (dtpRecordDate.Value != (DateTime)this.bindingRow["recorddate"])
{
this.bindingRow["recorddate"] = dtpRecordDate.Value;
}
}
private void txtNotes_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtNotes.Text != this.bindingRow["note"].ToString())
{
this.bindingRow["note"] = txtNotes.Text;
}
}
// Реализация клиента
private void btnRealizeClient_Click(object sender, System.EventArgs e)
{
try
{
DataRow realizedRow = mainDataSet.RealizedTable.NewRow();
realizedRow["realizedSumm"] = double.Parse(txtRealizedSumm.Text);
realizedRow["realizingDate"] = dtpRealizedDate.Value;
realizedRow["note"] = txtRealizingNotes.Text;
realizedRow["clientID"] = clientID;
mainDataSet.RealizedTable.Rows.Add(realizedRow);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void frmClient_Activated(object sender, System.EventArgs e)
{
txtLastName.Focus();
}
private void btnCalculate_Click(object sender, System.EventArgs e)
{
try
{
DataView dvIncome = (DataView)dgPayments.DataSource;
double incomeSumm = 0;
foreach (DataRowView drvIncome in dvIncome)
{
incomeSumm += (double)drvIncome.Row["summa"];
}
txtIncomeSumm.Text = incomeSumm.ToString("C");
DataView dvRealized = (DataView)dgClientsRealization.DataSource;
double realizedSumm = 0;
foreach (DataRowView drvRealized in dvRealized)
{
realizedSumm += (double)drvRealized.Row["realizedSumm"];
}
txtRealizationSumm.Text = realizedSumm.ToString("C");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void DesigneDataGrids()
{
// Стиль таблицы оплат клиента
DataGridTableStyle incomeTableStyle = new DataGridTableStyle();
incomeTableStyle.MappingName = "income";
DataGridTextBoxColumn summaStyle = new DataGridTextBoxColumn();
summaStyle.MappingName = "summa";
summaStyle.Width = 100;
summaStyle.Format = "#.0";
summaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn payment_typeIDStyle = new DataGridTextBoxColumn();
payment_typeIDStyle.MappingName = "payment_typeID";
payment_typeIDStyle.Width = 100;
payment_typeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn noteStyle = new DataGridTextBoxColumn();
noteStyle.MappingName = "note";
noteStyle.Width = 100;
noteStyle.HeaderText = "Заметки";
DataGridBoolColumn realizedStyle = new DataGridBoolColumn();
realizedStyle.MappingName = "IsRealized";
realizedStyle.Width = 100;
realizedStyle.HeaderText = "Реализовано";
incomeTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
summaStyle,
payment_typeIDStyle,
noteStyle});
dgPayments.TableStyles.Add(incomeTableStyle);
// Стиль таблицы реализации оплат клиента
DataGridTableStyle PlanRealizationTableStyle = new DataGridTableStyle();
PlanRealizationTableStyle.MappingName = "PlanRealization";
DataGridTextBoxColumn SummaRealizationStyle = new DataGridTextBoxColumn();
SummaRealizationStyle.MappingName = "SummaRealization";
SummaRealizationStyle.Width = 150;
SummaRealizationStyle.Format = "#.0";
SummaRealizationStyle.HeaderText = "Сумма реализации";
DataGridTextBoxColumn DateRealizationStyle = new DataGridTextBoxColumn();
DateRealizationStyle.MappingName = "DateRealization";
DateRealizationStyle.Width = 100;
DateRealizationStyle.HeaderText = "Дата реализации";
DataGridTextBoxColumn noteRealizationStyle = new DataGridTextBoxColumn();
noteRealizationStyle.MappingName = "Cause";
noteRealizationStyle.Width = 100;
noteRealizationStyle.HeaderText = "Заметки";
PlanRealizationTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
SummaRealizationStyle,
DateRealizationStyle,
noteRealizationStyle});
dgPayments.TableStyles.Add(PlanRealizationTableStyle);
// Стиль таблицы фактической реализации оплат клиента
DataGridTableStyle RealizedTableStyle = new DataGridTableStyle();
RealizedTableStyle.MappingName = "RealizedTable";
DataGridTextBoxColumn RealizationSummStyle = new DataGridTextBoxColumn();
RealizationSummStyle.MappingName = "realizedSumm";
RealizationSummStyle.Width = 150;
RealizationSummStyle.HeaderText = "Сумма";
DataGridTextBoxColumn RealizingDateStyle = new DataGridTextBoxColumn();
RealizingDateStyle.MappingName = "realizingDate";
RealizingDateStyle.Width = 150;
RealizingDateStyle.Format = "dd-MMMM-yyyy";
RealizingDateStyle.HeaderText = "Дата реализации";
DataGridTextBoxColumn NoteRealizationStyle = new DataGridTextBoxColumn();
NoteRealizationStyle.MappingName = "note";
NoteRealizationStyle.Width = 100;
NoteRealizationStyle.HeaderText = "Заметки";
RealizedTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
RealizationSummStyle,
RealizingDateStyle,
NoteRealizationStyle});
dgClientsRealization.TableStyles.Add(RealizedTableStyle);
}
private void btnCreateClientPayment_Click(object sender, System.EventArgs e)
{
try
{
DataRow incomeRow = mainDataSet.income.NewRow();
incomeRow["dataID"] = frmManager.DataID;
incomeRow["clientID"] = this.clientID;
incomeRow["summa"] = double.Parse(txtIncomeClientSumm.Text);
incomeRow["note"] = txtIncomeNote.Text;
incomeRow["IsRealized"] = 0;
DataRowView payment_typeRowView = (DataRowView)cmPaymentType.Current;
incomeRow["payment_typeID"] = payment_typeRowView.Row["payment_typeID"];
///
///Добавление столбца с датой ввода суммы (по умолчанию равной текущей дате)
///
mainDataSet.income.Rows.Add(incomeRow);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//**************************
private void FilterClients()
{
string clientLastName = txtLastName.Text;
string clientFirstName = txtFirstName.Text;
string clientFatherName = txtFatherName.Text;
DataView dataView = new DataView(mainDataSet.clients);
string filter = "fname = \'" + clientFirstName + "\' OR lname = \'" + clientLastName + "\' OR fathName = \'" + clientFatherName + "\'";
dataView.RowFilter = filter;
dgFindedClients.DataSource = dataView;
}
private int GetClientIDInSearchDataGrid(DataGrid.HitTestInfo hti)
{
if (hti.Row == -1)
return -1;
DataView searchDataView = (DataView)dgFindedClients.DataSource;
return (int)searchDataView[hti.Row].Row["clientID"];
}
private void PasteSelectedClient()
{
try
{
if (selectedClientIDInDataGrid == -1)
{
MessageBox.Show("Не выбран клиент!");
return;
}
DataRow groupClientsRow = mainDataSet.group_clients.NewRow();
groupClientsRow["groupID"] = this.GroupID;
groupClientsRow["clientID"] = selectedClientIDInDataGrid;
groupClientsRow["IsPaid"] = false;
mainDataSet.group_clients.Rows.Add(groupClientsRow);
if (this.MainForm != null)
MainForm.dgGroups_Click(MainForm.dgGroups, new EventArgs());
this.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void btnFindClient_Click(object sender, EventArgs e)
{
this.FilterClients();
}
private void btnSelectClient_Click(object sender, EventArgs e)
{
this.PasteSelectedClient();
}
int selectedClientIDInDataGrid = -1;
//**************************
private void dgFindedClients_MouseUp(object sender, MouseEventArgs e)
{
selectedClientIDInDataGrid = this.GetClientIDInSearchDataGrid(dgFindedClients.HitTest(e.X, e.Y));
}
private void dgPayments_MouseUp(object sender, MouseEventArgs e)
{
DataGrid dataGrid = (DataGrid)sender;
DataGrid.HitTestInfo hti = dataGrid.HitTest(new Point(e.X, e.Y));
if ((hti.Row < 0) || (hti.Column < 0))
return;
this.ShowDate(dataGrid, hti);
}
private void ShowDate(DataGrid dataGrid, DataGrid.HitTestInfo hti)
{
string caption = dataGrid.Tag.ToString();
dataGrid.CaptionText = "";
DataView dataView = (DataView)dataGrid.DataSource;
DataRow row = null;
row = (DataRow)dataView[hti.Row].Row;
DateTime date;
DataRow mainRow = null;
if (dataGrid.Tag.ToString() == "Payments")
{
mainRow = row.GetParentRow("dataincome");
if (mainRow == null)
return;
date = (DateTime)mainRow["currentDate"];
}
else if (dataGrid.Tag.ToString() == "Realization")
{
mainRow = row;
if (mainRow == null)
return;
date = (DateTime)mainRow["DateRealization"];
}
else
return;
string textFormat = String.Format(" - Date: {0}", date.ToString("dd MMMM yyyy"));
caption += textFormat;
dataGrid.CaptionText = caption;
}
}
}
При выборе одного из направлений в проводнике можно добавлять новые курсы, щелкнув правой кнопкой и выбрав в контекстном меню пункт New/Сourse (рис. 11.39):
(рис 11.39) Добавление нового курсаРасполагаем элементы управления и называем их в соответствии с рис. 11.40.
(рис 11.40) Форма frmCourseЛистинг формы frmCourse:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace Manager
{
/// <summary>
/// Форма курса
/// </summary>
public class frmCourse : System.Windows.Forms.Form
{
// Объявление элементов управления
public frmCourse()
{
InitializeComponent();
}
private DataRow bindingRow;
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
public frmCourse(DataRow bindingRow)
{
InitializeComponent();
this.bindingRow = bindingRow;
this.lblCourseNumber.Text += bindingRow.ItemArray[0].ToString();
this.txtCourseName.Text = bindingRow.ItemArray[1].ToString();
this.txtCoursePrice.Text = bindingRow.ItemArray[4].ToString();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void txtCourseName_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (txtCourseName.Text != this.bindingRow["courseName"].ToString())
{
this.bindingRow["courseName"] = txtCourseName.Text;
}
}
private void txtCoursePrice_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (double.Parse(txtCourseName.Text) != (double)this.bindingRow["priceNumber"])
{
this.bindingRow["priceNumber"] = double.Parse(txtCourseName.Text);
}
}
private void frmCourse_Load(object sender, System.EventArgs e)
{
txtCourseName.Focus();
}
}
}
В программе предусмотрена возможность извлечения, добавления и изменения информации о сотрудниках центра. Для этого используется форма frmEmployee, добавляем элементы управления в соответствии с рис. 11.41.
(рис 11.41) Форма frmEmployeeКласс формы frmEmployee наследуем от интерфейса ISelectingForm.
Листинг формы frmEmployee:
using System;
using System.Data;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using SelectingFormInterface;
using Manager.Forms;
namespace Manager
{
public class frmEmployee : System.Windows.Forms.Form, ISelectingForm
{
// Объявление элементов управления
#region IFindingForm Members
private DataRow selectedRow = null;
public DataRow SelectedRow
{
get { return selectedRow; }
set { selectedRow = value; }
}
#endregion
public frmEmployee(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
this.InitDefaultSettings();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void InitDefaultSettings()
{
try
{
cmEmployees = (CurrencyManager)this.BindingContext[mainDataSet, "employees"];
txtEmployeeFirstName.DataBindings.Add("Text", mainDataSet, "employees.FirstName");
txtEmployeeLastName.DataBindings.Add("Text", mainDataSet, "employees.LastName");
txtEmployeeFatherName.DataBindings.Add("Text", mainDataSet, "employees.FatherName");
dtpBirthday.DataBindings.Add("Value", mainDataSet, "employees.birthDay");
txtEmployeeNotes.DataBindings.Add("Text", mainDataSet, "employees.linkData");
cmbDirections.DataBindings.Add("Text", mainDataSet, "employees.directionID");
dgEmployees.DataSource = mainDataSet.employees;
dgEmployees.MouseUp += new MouseEventHandler(dgEmployees_MouseUp);
btnNext.Click += new EventHandler(btnNext_Click);
btnPrev.Click += new EventHandler(btnPrev_Click);
this.DesignDatagrid();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void miExit_Click(object sender, System.EventArgs e)
{
this.Close();
}
private void btnNext_Click(object sender, EventArgs e)
{
if (cmEmployees.Position < mainDataSet.employees.Rows.Count)
cmEmployees.Position++;
}
private void btnPrev_Click(object sender, EventArgs e)
{
if (cmEmployees.Position > 0)
cmEmployees.Position--;
}
private void SetSelectedRow(DataGrid dataGrid, DataGrid.HitTestInfo hti)
{
try
{
int rowIndex = hti.Row;
DataTable table = (DataTable)dataGrid.DataSource;
if (rowIndex == table.Rows.Count)
return;
DataRow selectedRow = table.Rows[rowIndex];
this.SelectedRow = selectedRow;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void dgEmployees_MouseUp(object sender, MouseEventArgs e)
{
DataGrid.HitTestInfo hti = dgEmployees.HitTest(e.X, e.Y);
if ((hti.Row != -1) (hti.Column != -1))
SetSelectedRow(dgEmployees, hti);
}
private void DesignDatagrid()
{
DataGridTableStyle employeesTableStyle = new DataGridTableStyle();
employeesTableStyle.MappingName = "employees";
DataGridTextBoxColumn employeeIDStyle = new DataGridTextBoxColumn();
employeeIDStyle.MappingName = "employeeID";
employeeIDStyle.Width = 50;
employeeIDStyle.HeaderText = "ID";
DataGridTextBoxColumn lastNameStyle = new DataGridTextBoxColumn();
lastNameStyle.MappingName = "LastName";
lastNameStyle.Width = 120;
lastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn firstNameStyle = new DataGridTextBoxColumn();
firstNameStyle.MappingName = "FirstName";
firstNameStyle.Width = 150;
firstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn fatherNameStyle = new DataGridTextBoxColumn();
fatherNameStyle.MappingName = "amountToday";
fatherNameStyle.Width = 150;
fatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn linkDataStyle = new DataGridTextBoxColumn();
linkDataStyle.MappingName = "linkData";
linkDataStyle.Width = 150;
linkDataStyle.HeaderText = "Контакты";
DataGridTextBoxColumn birthDayStyle = new DataGridTextBoxColumn();
birthDayStyle.MappingName = "birthDay";
birthDayStyle.Width = 100;
birthDayStyle.HeaderText = "День рождения";
DataGridTextBoxColumn directionIDStyle = new DataGridTextBoxColumn();
directionIDStyle.MappingName = "directionID";
directionIDStyle.Width = 60;
directionIDStyle.HeaderText = "directionID";
DataGridTextBoxColumn addressStyle = new DataGridTextBoxColumn();
addressStyle.MappingName = "Address";
addressStyle.Width = 300;
addressStyle.HeaderText = "Адрес";
DataGridTextBoxColumn notesStyle = new DataGridTextBoxColumn();
notesStyle.MappingName = "Notes";
notesStyle.Width = 100;
notesStyle.HeaderText = "Notes";
DataGridTextBoxColumn passportSerialNumberStyle = new DataGridTextBoxColumn();
passportSerialNumberStyle.MappingName = "PassportSerialNumber";
passportSerialNumberStyle.Width = 100;
passportSerialNumberStyle.HeaderText = "Серия паспорта";
DataGridTextBoxColumn dataPrinyatiyaStyle = new DataGridTextBoxColumn();
dataPrinyatiyaStyle.MappingName = "DataP";
dataPrinyatiyaStyle.Width = 100;
dataPrinyatiyaStyle.HeaderText = "DataP";
DataGridTextBoxColumn kStyle = new DataGridTextBoxColumn();
kStyle.MappingName = "K";
kStyle.Width = 100;
kStyle.HeaderText = "K";
DataGridTextBoxColumn postStyle = new DataGridTextBoxColumn();
postStyle.MappingName = "Post";
postStyle.Width = 100;
postStyle.HeaderText = "Post";
employeesTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
employeeIDStyle,
lastNameStyle,
firstNameStyle,
fatherNameStyle,
linkDataStyle,
birthDayStyle,
directionIDStyle,
addressStyle,
notesStyle,
passportSerialNumberStyle,
dataPrinyatiyaStyle,
kStyle,
postStyle});
dgEmployees.TableStyles.Add(employeesTableStyle);
}
}
}
Для добавления группы по выбранному курсу используется форма frmGroup. Добавляем элементы управления в соответствии с рис. 11.42.
(рис 11.42) Форма frmGroupЛистинг формы frmGroup:
using System;
using System.Drawing;
using System.Data;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Manager.Forms;
namespace Manager
{
/// <summary>
/// Форма группы
/// </summary>
public class frmGroup : System.Windows.Forms.Form
{
// Объявление элементов управления
internal CurrencyManager cmEmployees;
internal CurrencyManager cmGroupStatus;
private Manager.Forms.MainDataSet mainDataSet;
private DataRow bindingRow;
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
public frmGroup(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
cmbStatus.DataSource = mainDataSet.GroupStatus;
cmbStatus.DisplayMember = "StatusName";
cmGroupStatus = (CurrencyManager)this.BindingContext[mainDataSet, "GroupStatus"];
cmGroupStatus.Position = 0;
cmbEmployee.DataSource = mainDataSet.employees;
cmbEmployee.DisplayMember = "EmployeeName";
cmEmployees = (CurrencyManager)this.BindingContext[mainDataSet, "employees"];
cmEmployees.Position = 0;
Size labelSize = new Size(this.Width, lblGroupID.Size.Height);
this.lblGroupID.Size = labelSize;
}
public frmGroup(MainDataSet ds, DataRow bindingRow)
{
InitializeComponent();
mainDataSet = ds;
cmbStatus.DataSource = mainDataSet.GroupStatus;
cmbStatus.DisplayMember = "StatusName";
cmGroupStatus = (CurrencyManager)this.BindingContext[mainDataSet, "GroupStatus"];
DataView dvStatus = (DataView)cmGroupStatus.List;
dvStatus.Sort = "StatusID";
int statusPos = dvStatus.Find(bindingRow["StatusID"]);
cmbStatus.SelectedIndex = statusPos;
cmbEmployee.DataSource = mainDataSet.employees;
cmbEmployee.DisplayMember = "EmployeeName";
cmEmployees = (CurrencyManager)this.BindingContext[mainDataSet, "employees"];
DataView dvEmployee = (DataView)cmEmployees.List;
dvEmployee.Sort = "employeeID";
int employeePos = dvEmployee.Find(bindingRow["employeeID"]);
cmbEmployee.SelectedIndex = employeePos;
Size labelSize = new Size(this.Width, lblGroupID.Size.Height);
this.lblGroupID.Size = labelSize;
this.bindingRow = bindingRow;
int groupID = (int)bindingRow[0];
this.lblGroupID.Text += groupID.ToString();
DateTime beginDate = (DateTime)bindingRow[1];
this.dtpBeginDate.Value = beginDate;
DateTime endDate = (DateTime)bindingRow[2];
this.dtpEndDate.Value = endDate;
if (bindingRow.ItemArray[3] == null)
{
this.dtpBeginTime.Text = "";
}
else
{
DateTime beginTime = (DateTime)bindingRow[3];
this.dtpBeginTime.Text = beginTime.ToString("HH:mm");
}
if (bindingRow.ItemArray[4] == null)
{
this.dtpEndTime.Text = "";
}
else
{
DateTime endTime = (DateTime)bindingRow[4];
this.dtpEndTime.Text = endTime.ToString("HH:mm");
}
this.txtNotes.Text = bindingRow[9].ToString();
this.cmbClassNumber.Text = bindingRow[6].ToString();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void frmGroup_Load(object sender, System.EventArgs e)
{
txtNotes.Focus();
}
// Проверка обновлений в элементах управлений
private void dtpBeginDate_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (dtpBeginDate.Value != (DateTime)this.bindingRow["beginDate"])
{
this.bindingRow["beginDate"] = DateTime.Parse(dtpBeginDate.Value.ToString("dd MMMM yyyy"));
}
}
private void dtpEndDate_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (dtpEndDate.Value != (DateTime)this.bindingRow["endDate"])
{
this.bindingRow["endDate"] = DateTime.Parse(dtpEndDate.Value.ToString("dd MMMM yyyy"));
}
}
private void dtpBeginTime_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (dtpBeginTime.Value != (DateTime)this.bindingRow["beginTime"])
{
this.bindingRow["beginTime"] = DateTime.Parse(dtpBeginTime.Value.ToString("HH:mm"));
}
}
private void dtpEndTime_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (dtpEndTime.Value != (DateTime)this.bindingRow["endTime"])
{
this.bindingRow["endTime"] = DateTime.Parse(dtpEndTime.Value.ToString("HH:mm"));
}
}
private void txtNotes_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (txtNotes.Text != this.bindingRow["note"].ToString())
{
this.bindingRow["note"] = txtNotes.Text;
}
}
private void cmbClassNumber_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (cmbClassNumber.Text != this.bindingRow["classNumber"].ToString())
{
this.bindingRow["classNumber"] = cmbClassNumber.Text;
}
}
private void cmbStatus_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
{
DataRow statusRow = this.bindingRow.GetParentRow("GroupStatusgroups");
if (cmbStatus.Text != statusRow["StatusName"].ToString())
{
this.bindingRow["StatusID"] = cmbStatus.SelectedIndex + 1;
}
}
}
}
}
На вкладке "Оплаты" при нажатии на одноименную кнопку появляется окно, в котором можно указывать
(рис 11.43) Форма frmPaymentTypeКласс формы должен наследовать от интерфейса ISelectingForm.
Листинг формы frmPaymentType:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using SelectingFormInterface;
using System.Data;
using Manager.Forms;
namespace Manager
{
public class frmPaymentType : System.Windows.Forms.Form, ISelectingForm
{
private MainDataSet mainDataSet = null;
public frmPaymentType(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
this.InitialDefaultSettings();
}
protected override void Dispose( bool disposing )
{
//Описание метода
}
private void InitializeComponent()
{
//Описание метода
}
private System.Windows.Forms.DataGrid dgPaymentType;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button bntCancel;
private DataRow selectedRow = null;
public DataRow SelectedRow
{
get { return selectedRow; }
set { selectedRow = value; }
}
private void InitialDefaultSettings()
{
dgPaymentType.DataSource = mainDataSet;
dgPaymentType.DataMember = "payment_type";
dgPaymentType.Click += new EventHandler(dgPaymentType_Click);
dgPaymentType.CurrentCellChanged += new EventHandler(dgPaymentType_CurrentCellChanged);
this.DesignDataGrid();
}
private void DesignDataGrid()
{
// Дизайн таблицы payment_type
DataGridTableStyle paymentTypeStyle = new DataGridTableStyle();
paymentTypeStyle.MappingName = "payment_type";
DataGridTextBoxColumn paymentTypeIDStyle = new DataGridTextBoxColumn();
paymentTypeIDStyle.MappingName = "payment_typeID";
paymentTypeIDStyle.Width = 50;
paymentTypeIDStyle.HeaderText = "ID";
DataGridTextBoxColumn paymentTypeNameStyle = new DataGridTextBoxColumn();
paymentTypeNameStyle.MappingName = "payment_typeName";
paymentTypeNameStyle.Width = 100;
paymentTypeNameStyle.HeaderText = "Name";
DataGridTextBoxColumn paymentTypeNoteStyle = new DataGridTextBoxColumn();
paymentTypeNoteStyle.MappingName = "note";
paymentTypeNoteStyle.Width = 200;
paymentTypeNoteStyle.HeaderText = "Notes";
paymentTypeStyle.GridColumnStyles.AddRange( new DataGridTextBoxColumn[] {
paymentTypeIDStyle,
paymentTypeNameStyle,
paymentTypeNoteStyle});
dgPaymentType.TableStyles.Add(paymentTypeStyle);
}
private void dgPaymentType_Click(object sender, EventArgs e)
{
if ((dgPaymentType.CurrentCell.RowNumber != -1) (dgPaymentType.CurrentCell.ColumnNumber != -1))
dgPaymentType_CurrentCellChanged(dgPaymentType, new EventArgs());
}
private void dgPaymentType_CurrentCellChanged(object sender, EventArgs e)
{
try
{
this.SelectedRow = mainDataSet.payment_type.Rows[dgPaymentType.CurrentRowIndex];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
}
В проекте были использованы дополнительные классы, листинг которых приводится далее.
using System;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
namespace Manager
{
internal abstract class ManagerTreeNode : TreeNode
{
internal abstract void GetChilds();
}
}
using System;
using System.Windows.Forms;
namespace Manager
{
internal class ClientTreeNode : ManagerTreeNode
{
internal ClientTreeNode()
{
}
private int clientID;
internal int ClientID
{
get { return clientID; }
set { clientID = value; }
}
private int groupID;
internal int GroupID
{
get { return groupID; }
set { groupID = value; }
}
private int courseID;
internal int CourseID
{
get { return courseID; }
set { courseID = value; }
}
private string firstName;
internal string FirstName
{
get { return firstName; }
set { firstName = value; }
}
private string lastName;
internal string LastName
{
get { return lastName; }
set { lastName = value; }
}
private string fatherName;
internal string FatherName
{
get { return fatherName; }
set { fatherName = value; }
}
private string linkData;
internal string LinkData
{
get { return linkData; }
set { linkData = value; }
}
private DateTime recorddate;
internal DateTime RecordDate
{
get { return recorddate; }
set { recorddate = value; }
}
private string note;
internal string Note
{
get { return note; }
set { note = value; }
}
private string paymentType;
internal string PaymentType
{
get { return paymentType; }
set { paymentType = value; }
}
private double clientSumm;
internal double ClientSumm
{
get { return clientSumm; }
set { clientSumm = value; }
}
internal override void GetChilds()
{
}
public override string ToString()
{
return lastName + " " + firstName + " " + fatherName;
}
}
}
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using Manager.Forms;
namespace Manager
{
internal class GroupTreeNode : ManagerTreeNode
{
private MainDataSet mainDataSet = null;
internal MainDataSet NDDataSet
{
get { return mainDataSet; }
set { mainDataSet = value; }
}
private int courseID;
internal int CourseID
{
get { return courseID; }
set { courseID = value; }
}
private int groupID;
internal int GroupID
{
get { return groupID; }
set { groupID = value; }
}
private DateTime beginDate;
internal DateTime BeginDate
{
get { return beginDate; }
set { beginDate = value; }
}
private DateTime endDate;
internal DateTime EndDate
{
get { return endDate; }
set { endDate = value; }
}
private DateTime beginTime;
internal DateTime BeginTime
{
get { return beginTime; }
set { beginTime = value; }
}
private DateTime endTime;
internal DateTime EndTime
{
get { return endTime; }
set { endTime = value; }
}
private int clientsCount;
internal int ClientsCount
{
get { return clientsCount; }
set { clientsCount = value; }
}
private int classNumber;
internal int ClassNumber
{
get { return classNumber; }
set { classNumber = value; }
}
private int directionID;
internal int DirectionID
{
get { return directionID; }
set { directionID = value; }
}
private int employeeID;
internal int EmployeeID
{
get { return employeeID; }
set { employeeID = value; }
}
private string groupNote;
internal string GroupNote
{
get { return groupNote; }
set { groupNote = value; }
}
private int status;
internal int Status
{
get { return status; }
set { status = value; }
}
internal override void GetChilds()
{
DataView dvGroupClients = new DataView(this.NDDataSet.group_clients);
dvGroupClients.RowFilter = "groupID = " + this.GroupID.ToString();
ClientTreeNode[] ctns = new ClientTreeNode[dvGroupClients.Count];
ClientTreeNode ctn = null;
int i = 0;
foreach(DataRowView drv in dvGroupClients)
{
DataRow clientRow = drv.Row.GetParentRow("clientsgroup_clients");
ctn = new ClientTreeNode();
ctn.ClientID = (int)clientRow["clientID"];
ctn.FirstName = clientRow["fname"].ToString();
ctn.LastName = clientRow["lname"].ToString();
ctn.FatherName = clientRow["fathName"].ToString();
ctn.LinkData = clientRow["linkData"].ToString();
ctn.RecordDate = (DateTime)clientRow["recordDate"];
ctn.Note = clientRow["note"].ToString();
ctn.PaymentType = clientRow["paymentType"].ToString();
ctn.Text = ctn.LastName + " " + ctn.FirstName + " " + ctn.FatherName;
ctn.ImageIndex = 6;
ctn.ForeColor = Color.Teal;
ctn.Tag = clientRow;
ctns[i++] = ctn;
ctn = null;
}
this.ForeColor = Color.Crimson;
this.Nodes.AddRange(ctns);
}
}
}
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using Manager.Forms;
namespace Manager
{
internal class CourseTreeNode : ManagerTreeNode
{
private MainDataSet mainDataSet = null;
internal MainDataSet NDDataSet
{
get { return mainDataSet; }
set { mainDataSet = value; }
}
private int directionID;
internal int DirectionID
{
get { return directionID; }
set { directionID = value; }
}
private int courseID;
internal int CourseID
{
get { return courseID; }
set { courseID = value; }
}
private string courseName;
internal string CourseName
{
get {return courseName;}
set {courseName = value;}
}
private decimal coursePrice;
internal decimal CoursePrice
{
get { return coursePrice; }
set { coursePrice = value; }
}
public override string ToString()
{
return courseName;
}
internal override void GetChilds()
{
DataView dvGroups = new DataView(this.NDDataSet.groups);
dvGroups.RowFilter = "courseID = " + this.courseID.ToString();
GroupTreeNode[] gtns = new GroupTreeNode[dvGroups.Count];
GroupTreeNode gtn = null;
int i = 0;
foreach (DataRowView drv in dvGroups)
{
DataRow dr = drv.Row;
gtn = new GroupTreeNode();
gtn.NDDataSet = this.NDDataSet;
gtn.CourseID = this.courseID;
gtn.GroupID = (int)dr["groupID"];
gtn.BeginDate = (DateTime)dr["beginDate"];
gtn.EndDate = (DateTime)dr["endDate"];
gtn.BeginTime = (DateTime)dr["beginTime"];
gtn.EndTime = (DateTime)dr["endTime"];
gtn.ClientsCount = (int)dr["clientsCount"];
gtn.ClassNumber = (int)dr["classNumber"];
gtn.CourseID = (int)dr["courseID"];
gtn.EmployeeID = (int)dr["employeeID"];
gtn.GroupNote = dr["note"].ToString();
gtn.Status = (int)dr["statusID"];
gtn.Text = gtn.GroupID.ToString();
gtn.ImageIndex = 6;
if ((int)dr["StatusID"] == 1) // Группа набирается
{
gtn.ForeColor = Color.Red;
}
else if ((int)dr["StatusID"] == 2) // Группа обучается
{
gtn.ForeColor = Color.Green;
}
else if ((int)dr["StatusID"] == 3) // Группа закончила обучение
{
gtn.ForeColor = Color.Blue;
}
gtn.Tag = dr;
gtns[i++] = gtn;
gtn = null;
}
this.ForeColor = Color.Green;
this.Nodes.AddRange(gtns);
}
}
}
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using Manager.Forms;
namespace Manager
{
internal class DirectionTreeNode : ManagerTreeNode
{
private MainDataSet mainDataSet = null;
internal MainDataSet NDDataSet
{
get { return mainDataSet; }
set { mainDataSet = value; }
}
private string directionName;
internal string DirectionName
{
get { return directionName; }
set { directionName = value; }
}
private string managerFirstName;
internal string ManagerFirstName
{
get { return managerFirstName; }
set { managerFirstName = value; }
}
private string managerLastName;
internal string ManagerLastName
{
get { return managerLastName; }
set { managerLastName = value; }
}
private string managerFatherName;
internal string ManagerFatherName
{
get { return managerFatherName; }
set { managerFatherName = value; }
}
private int directionID;
internal int DirectionID
{
get { return directionID; }
set { directionID = value; }
}
private string directionNote;
internal string DirectionNote
{
get { return directionNote; }
set { directionNote = value; }
}
private int managerID;
internal int ManagerID
{
get { return managerID;}
set { managerID = value;}
}
public override string ToString()
{
return directionName;
}
internal override void GetChilds()
{
DataView dvCourse = new DataView(this.NDDataSet.course);
dvCourse.RowFilter = "directionID = " + this.directionID.ToString();
CourseTreeNode[] ctns = new CourseTreeNode[dvCourse.Count];
CourseTreeNode ctn = null;
int i = 0;
foreach (DataRowView drv in dvCourse)
{
DataRow dr = drv.Row;
ctn = new CourseTreeNode();
ctn.NDDataSet = this.NDDataSet;
ctn.DirectionID = this.directionID;
ctn.CourseID = int.Parse(dr["courseID"].ToString());
ctn.CourseName = ctn.Text = dr["courseName"].ToString();
ctn.CoursePrice = (decimal)dr["priceNumber"];
ctn.ImageIndex = 10;
ctn.ForeColor = Color.Green;
ctn.GetChilds();
ctn.Tag = dr; // Теперь мы можем обращаться к элементам в ListView по свойству tag
ctns[i++] = ctn;
ctn = null;
}
this.ForeColor = Color.RoyalBlue;
this.Nodes.AddRange(ctns);
}
}
}
using System;
using System.Data;
namespace Manager
{
// Класс содержит строку для данного объекта из БД
public class CustomListItem : System.Windows.Forms.ListViewItem
{
public CustomListItem():base()
{
bindedRow = null;
}
public CustomListItem(string[] subItems, int imageIndex):base(subItems, imageIndex)
{
bindedRow = null;
}
private DataRow bindedRow;
internal DataRow BindedRow
{
get { return bindedRow; }
set { bindedRow = value; }
}
}
}
Этот интерфейс наследуют формы, в которых можно выбирать какие-нибудь записи:
using System;
using System.Data;
using System.Windows.Forms;
namespace SelectingFormInterface
{
public interface ISelectingForm
{
DataRow SelectedRow
{
get;
set;
}
}
}
Добавляем в окне Solution Explorer новый проект Windows Control Library и называем его FindControl.
Это пользовательский элемент управления, с которыми мы сталкивались в лекции 3.
Добавляем на форму три кнопки в соответствии с рис. 11.44.
(рис 11.44) Форма FindControlЛистинг формы FindControl:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Reflection;
using SelectingFormInterface;
namespace FindControl
{
public delegate void RowSelectedDelegate(FindControl findControl, DataTable table);
public class FindControl : System.Windows.Forms.UserControl
{
/// <summary>
/// Событие генерируется, когда выбрана запись из формы поиска в режиме диалога
/// </summary>
public event RowSelectedDelegate RowSelected;
private ISelectingForm selectingForm = null;
public ISelectingForm SelectingForm
{
get { return selectingForm; }
set { selectingForm = value; }
}
private Form personForm = null;
public Form PersonForm
{
get { return personForm; }
set { personForm = value; }
}
private string text = "";
public override string Text
{
get
{
return text;
}
set
{
text = value;
btnFind.Text = text;
}
}
private DataRow targetRow = null;
/// <summary>
/// Запись, в которую добавляется значение из формы поиска и выбора
/// </summary>
public DataRow TargetRow
{
get { return targetRow; }
set { targetRow = value; }
}
private string columnName = null;
private System.Windows.Forms.Button btnData;
/// <summary>
/// Название колонки, в которую можно добавить номер выбранной записи из формы поиска и выбора
/// </summary>
public string ColumnName
{
get { return columnName; }
set { columnName = value; }
}
private DataTable table = null;
/// <summary>
/// Таблица, в которую добавляется запись
/// </summary>
public DataTable Table
{
get { return table; }
set { table = value; }
}
public FindControl()
{
InitializeComponent();
this.btnCancel.Click += new EventHandler(btnCancel_Click);
this.btnFind.Click += new EventHandler(btnFind_Click);
this.btnData.Click += new EventHandler(btnData_Click);
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components.Dispose();
}
base.Dispose( disposing );
}
#region Component Designer generated code
private void InitializeComponent()
{
// Описание метода
}
#endregion
private void btnCancel_Click(object sender, EventArgs e)
{
this.Visible = true;
this.Dispose();
}
private void btnFind_Click(object sender, EventArgs e)
{
try
{
Form form = (Form)this.SelectingForm;
if (form.ShowDialog() == DialogResult.OK)
RowSelected(this, this.Table);
btnCancel_Click(btnCancel, new EventArgs());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
public override string ToString()
{
return "FindControl";
}
private void btnData_Click(object sender, EventArgs e)
{
if (personForm == null)
{
MessageBox.Show("Нет данных для отображения формы");
return;
}
personForm.ShowDialog();
this.Dispose();
}
}
}
На диске, прилагаемом к книге, вы найдете приложение EducationCenter (Code\Glava11\ Manager).
Когда вы заканчиваете изучать очередной учебник по программированию, даже как следует разобравшись со всеми его примерами, вы задаетесь вопросом — как же научиться собирать все эти детали мозаики в целое, из чего и состоят программы? Эта лекция целиком посвящена достаточно сложной программе , используемой на практике в крупном учебном центре для организации его деятельности. Почему же решено было написать свою программу, а не воспользоваться одним из существующих пакетов делопроизводства, например, мощным пакетом "1С Бухгалтерия"? Дело в том, что была необходимость в создании программы с предельно ясным и понятным интерфейсом, различным для трех групп пользователей — администраторов, менеджеров или операторов. В программе есть три группы пользователей:
Если пользователь не входит ни в одну группу, тогда он принадлежит группе FailGroup, и он не сможет запустить программу.
Открытый исходный код позволяет быстро модифицировать и изменять программу по мере необходимости. Итак, готовое решение перед вами, и если вы наберетесь терпения и до конца вникнете в его работу, а лучше — самостоятельно воспроизведете всю функциональность, то можно будет сказать, что вы отлично разобрались с теми объектами и классами, которые были приведены во всей этой книге.
Приложение в качестве базы данных использует MS SQL Server, здесь вся структура ее была сохранена, но преобразована в базу данных MS Access для облегчения локальной переносимости. Впрочем, вы без труда сможете преобразовать все подключения к базе данных в исходном виде.
Файл программы расположен в каталоге Code\Glava11\Educationcenter\Manager\bin\Debug\Manager.exe, приложение настроено на подключение к базе данных, расположенной в той же самой папке. Дополнительно, в каталоге Code\Glava11\Educationcenter\DataBase\ EducationCenter.mdb находится копия базы данных. При авторизации можно ввести любой пароль — соответствующие участки кода в форме Authorization.cs закомментированы.
При запуске программы пользователи вводят учетную запись домена и пароль. В данном случае администратор сети учебного центра создал эти группы в домене. После авторизации программа проверяет группу пользователя и определяет необходимый интерфейс (рис. 11.1).
(рис 11.1) Авторизация пользователяДалее загружаются данные из БД и появляется главная рабочая форма (рис. 11.2).
(рис 11.2) Главное окно программы. Вкладка "Приемная"На форме расположены следующие вкладки:

(рис 11.4) Вкладка "Основные таблицы"(рис 11.3) Вкладка "Оплаты"
(рис 11.6) "Проводник"(рис 11.5) "Статистика"На панели инструментов расположены следующие кнопки:
. При нажатии на эту кнопку все изменения в текущих таблицах будут внесены в базу данных.
. При нажатии на эту кнопку появляется форма сотрудников (рис. 11.7).
(рис 11.7) Поиск клиентов. При нажатии на эту кнопку открывается форма поиска клиентов (рис. 11.8.)
(рис 11.8) "Поиск клиентов"Выбрав произвольный курс на вкладке "Приемная", можно нажатием кнопки "Создать группу" открыть форму создания новой группы (рис. 11.9 и рис. 11.10).

(рис 11.10) Форма "Создание группы"(рис 11.9) Созданная группа добавляется в список группВ выбранную группу можно добавлять клиентов (рис. 11.10 и рис. 11.11).

(рис 11.11) Добавление клиента в группу(рис 11.10) Результат добавления нового клиентаДля повторного просмотра данных клиента можно, щелкнув правой кнопкой мыши на его записи, вызвать контекстное меню и выбрать пункт "Личные данные".
На форме клиента имеются дополнительные вкладки:

(рис 11.13) "Оплата и реализация"(рис 11.12) "Архив"
(рис 11.14) "Группы клиента"Проводник позволяет просматривать, а также быстро создавать необходимые нам объекты (направления, курсы, группы, клиентов) (рис. 11.15, 11.16, 11.17).

(рис 11.16) Контекстное меню "Проводника"(рис 11.15) Добавление нового клиента
(рис 11.17) Клиент, добавленный в окно "Проводника"В проводнике можно также скопировать клиента в группе для последующего добавления его в другую группу (рис. 11.18, 11.19).

(рис 11.19) Копирование клиента из группы(рис 11.18) Вставка клиента в другую группуПри вставке клиента в другую группу появляется промежуточная форма перевода клиента (рис. 11.20).
(рис 11.20) Промежуточная форма перевода клиента в другую группуВ результате клиент перемещается в другую группу (рис. 11.21).
(рис 11.21) Клиент переведен в другую группуПосле произведения оплаты клиентом курса, сумма помещается в окно прихода (рис. 11.22).
(рис 11.22) Вкладка "Оплаты"При завершении работы с программой появляется диалоговое окно, предлагающее обновить базу данных, если были произведены изменения (рис. 11.23). Также стандартное окно предупреждения выхода из программы не позволяет случайно закрыть ее (рис. 11.24).

(рис 11.24) При завершении работы с программой предлагается обновить базу данных(рис 11.23) Стандартное окно предупреждения препятствует потере данных при случайном выходе из программы
Прежде чем приступать к разработке программы, необходимо спроектировать базу данных, в которой будут находиться наши данные. БД, переведенная в формат MS Access, называется EducationCenter. В учебном центре обучаются клиенты (слушатели) на разных направлениях (администрирование, программирование, графика, офисные курсы и т. д.), и у каждого направления есть свои курсы. Офис-менеджер регистрирует клиентов в базе данных и добавляет их в группы. Группы могут иметь статус набираемых, обучаемых и закончивших обучение. Итоговые суммы доходов и расходов помещаются в отдельную таблицу. База данных также содержит информацию о сотрудниках.
База данных EducationCenter находится в каталоге (Code\Glava11\ EducationCenter).
В таблицах 11.1–11.14 приводится описание таблиц в БД и структура каждой таблицы.
| № | Таблица | Описание |
|---|---|---|
| 1 | Clients | Данные клиентов |
| 2 | Course | Описание курсов в учебном центре |
| 3 | Data | Таблица итоговых сумм (прихода и расхода) за день |
| 4 | Directions | Описание направлений курсов |
| 5 | Employees | Данные о сотрудниках учебного центра |
| 6 | Expenses | Денежные расходы |
| 7 | Group_clients | Промежуточная таблица для групп и клиентов |
| 8 | Groups | Данные о группах |
| 9 | GroupStatus | Состояния групп |
| 10 | Денежные приходы | |
| 11 | Payment_type | Виды оплат |
| 12 | PlanRealization | Разницы между суммой прихода и реализованной суммой |
| 13 | RealizedTable | Реализованные деньги клиентов |
| Поле | Тип данных | Описание |
|---|---|---|
| ClientID | Счетчик | Номер клиента |
| Fname | Текстовый | Имя |
| Lname | Текстовый | Фамилия |
| FathName | Текстовый | Отчество |
| LinkData | Текстовый | Контактные данные |
| Recorddate | Дата/Время | Дата записи |
| Note | Текстовый | Заметки |
| PaymentType | Текстовый | Вид оплаты |
| IsRinged | Логический | Был ли оповещен клиент по телефону |
| Поле | Тип данных | Описание |
|---|---|---|
| CourseID | Счетчик | Номер курса |
| CourseName | Текстовый | Название курса |
| PriceText | Текстовый | Цена в виде текста |
| DirectionID | Числовой | Номер направления |
| PriceNumber | Числовой | Цена курса |
| Note | Текстовый | Заметки по курсу |
| Поле | Тип данных | Описание |
|---|---|---|
| DataID | Счетчик | Номер |
| CurrentDate | Дата/Время | Текущая дата |
| amountYesterday | Денежный | Всего вчера |
| AmountToday | Денежный | Всего сегодня |
| IncomeToday | Денежный | Приход на сегодня |
| expanseToday | Денежный | Расход на сегодня |
| Note | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| DirectionID | Счетчик | Номер направления |
| DirectName | Текстовый | Наименование направления |
| Note | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| EmployeeID | Счетчик | Номер сотрудника |
| LastName | Текстовый | Фамилия |
| FirstName | Текстовый | Имя |
| FatherName | Текстовый | Отчество |
| LinkData | Текстовый | Контактные данные |
| BirthDay | Дата/Время | Дата рождения |
| DirectionID | Числовой | Номер направления |
| Address | Текстовый | Адрес |
| Notes | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| ExpenseID | Счетчик | Номер расхода |
| DataID | Числовой | Номер даты |
| Note | Текстовый | Заметки |
| Summa | Денежный | Сумма прихода |
| ClientID | Числовой | Номер клиента |
| EmployeeID | Числовой | Номер сотрудника |
| payment_typeID | Числовой | Номер вида оплаты |
| Поле | Тип данных | Описание |
|---|---|---|
| GroupClientID | Счетчик | Номер |
| Числовой | Номер группы | |
| ClientID | Числовой | Номер клиента |
| IsPaid | Логический | Оплатил |
| Notes | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| Счетчик | Номер группы | |
| BeginDate | Дата/время | Дата начала обучения |
| EndDate | Дата/время | Дата конца обучения |
| BeginTime | Дата/время | Время начала обучения |
| EndTime | Дата/время | Время конца обучения |
| ClientsCount | Числовой | Кол-во клиентов в группе |
| ClassNumber | Числовой | Номер класса |
| CourseID | Числовой | Номер курса |
| EmployeeID | Числовой | Номер преподователя в группе |
| Note | Текстовый | Заметки |
| StatusID | Числовой | Номер статуса группы |
| Поле | Тип данных | Описание |
|---|---|---|
| StatusID | Счетчик | Номер статуса |
| StatusName | Текстовый | Наименование |
| Поле | Тип данных | Описание |
|---|---|---|
| IncomeID | Счетчик | Номер прихода |
| IsRealized | Логический | Сумма реализована |
| DataID | Числовой | Номер даты |
| Summa | Денежный | Сумма прихода |
| payment_typeID | Числовой | Номер вида оплаты |
| Note | Текстовый | Заметки |
| ClientID | Числовой | Номер клиента |
| Поле | Тип данных | Описание |
|---|---|---|
| payment_typeID | Счетчик | Номер вида оплаты |
| payment_typeName | Текстовый | Вид оплаты |
| Note | Текстовый | Заметки |
| Поле | Тип данных | Описание |
|---|---|---|
| ID | Счетчик | Номер записи |
| IncomeID | Числовой | Номер прихода |
| SummaPlan | Денежный | Запланнированная сумма |
| Денежный | Реализованная сумма | |
| IsRealized | Логический | Реализовано |
| DateRealization | Дата/время | Дата реализации |
| Cause | Текстовый | Причина реализации |
| Поле | Тип данных | Описание |
|---|---|---|
| ID | Счетчик | Номер записи |
| RealizedSumm | Денежный | Сумма реализации |
| RealizingDate | Дата/время | Дата реализации |
| Note | Текстовый | Заметки |
| ClientID | Числовой | Номер клиента |
Схема связей таблиц приводится на рис. 11.25. Лучше всего открыть файл базы данных и изучить связи в окне схемы баз данных MS Access.
(рис 11.25) Схема базы данных EducationCenter
Перейдем теперь непосредственно к приложению. В таблицах 11.15 и 11.16 приводится описание классов, используемых во всем приложении.
| Имя класса | Описание класса |
|---|---|
| frmManager | Управляет главной формой |
| frmAuthorization | Форма авторизации |
| frmDirection | Форма направления |
| frmCourse | Форма курса |
| frmGroup | Форма группы |
| frmClient | Форма клиента |
| frmSearchClient | Форма поиска клиента |
| frmEmployee | Форма сотрудников |
| frmPaymentType | Форма оплат |
| Имя класса | Описание класса |
|---|---|
| ManagerTreeNode | Абстрактный класс узла дерева в проводнике |
| ClientTreeNode | Класс клиента в проводнике |
| GroupTreeNode | Класс группы в проводнике |
| CourseTreeNode | Класс курса в проводнике |
| DirectionTreeNode | Класс направления в проводнике |
| CustomListItem | Класс, представляющий item в ListView проводника |
Далее мы последовательно будет создавать приложение
Для каждой формы я привожу рисунок, на котором имеются надписи свойства Name элементов. Для большинства элементов в тексте я также привожу значения свойств, определяемых в режиме дизайна. Впрочем, большинство незначительных свойств лучше попытаться восстановить по внешнему виду, приводимому на соответствующих рисунках. Возможно, вам даже удастся найти более оптимальные значения. Если же вы будете затрудняться в настройке этих элементов — смотрите исходные проекты. (Напомню, что свойства элементов, значения которых были изменены, выделяются жирным шрифтом)
Методы InitializeComponent, Dispose, а также объявление элементов управлений во всех классах были убраны. Эти места выделены жирным шрифтом. Все комментарии, а также документирование XML-тегами в кодах также выделены жирным шрифтом.
Свойству Text формы устанавливаем значение .
Помещаем на форму из окна 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 ). На панель добавляем 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, страница "Основные таблицы"TextBox txtResultIncome, txtResultOut, txtBalance, txtYesterdaySumm, txtResultCount со свойствами Text "Итого приход", "Итого расход", "Баланс", "Вчера" и "Всего" соответственно. Добавляем Button btnCalculate и создаем для него обработчик события Click (см. код программы). Также на эту панель помещаем 2 кнопки навигации по записям btnNextDate и btnPrevDate. Для каждой из кнопок создаем обработчиков события Click. Помещаем кнопку btnShowPaymentTypeForm, которая будет открывать форму frmPaymentType, и создаем для этой кнопки обработчик события Click. Помещаем на эту же страницу еще одну панель (свойству Dock устанавливаем значение Fill ), на эту панель помещаем DataGrid dgIncome (свойству Dock устанавливаем значение Left, свойству CaptionText устанавливаем значение "Приход"), 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;
private TreeNode selectedNode;
private string selectedNodeName = "";
private TreeNodeType treeNodeType;
private TreeNode MainTreeNode = null;
private DirectionTreeNode[] dtns = null;
private Color itemColor;
private bool ItemCanMove = false;
private CustomListItem selectedItem; // Выбранный заголовок item на элементе ListView проводника
private CurrencyManager currManagerIncome;
private CurrencyManager currManagerOut;
private CurrencyManager currManagerPaymentType;
private CurrencyManager currManagerTotal;
internal frmAuthorization.UserGroup userGroup;
private bool SelectingClient = false; // Переменная, отвечающая за возможность выбора клиента
CurrencyManager cmClientsTable;
CurrencyManager cmGroupsTable;
TreeNode oldGroupNode;
static private int dataID = 0;
static internal int DataID
{
get { return dataID; }
}
Добавим в класс формы frmManager методы, указываемые в таблице 11.17.
| Сигнатура методов | Описание методов |
|---|---|
private void LoadCoursesDataGrid(int directionID) |
Загрузка объекта DataGrid списком курсов |
private void InitDefaultSettings() |
Восстановление настроек по умолчанию |
internal void CheckEmployeesBirthDays() |
Проверка наличия дней рождения |
internal void PasteDateRow() |
Вставка новой записи текущей даты в таблицу. data, если таковой не существует |
private void SetAllowDBNullForMainDataSet() |
Разрешение null-значений для таблиц |
internal void FillPaymentsPage() |
Загрузка страницы оплат |
private void AddNewClient() |
Добавление нового клиента |
private void AddNewGroup() |
Добавление новой группы из проводника |
private void AddNewGroupWaitingRoom() |
Добавление новой группы со страницы "Приемная" |
private void AddNewCourse() |
Добавление нового курса |
private void AddNewDirection() |
Добавление нового направления |
internal void Explorer() |
Заполнение метода данными из главной БД |
private void FillListView(TreeNodeType treeNodeType, TreeNode treeNode) |
Заполнение элемента ListView данными узла дерева |
private void TransferClients(TreeNode oldGroup, TreeNode newGroup) |
Перевод выбранных клиентов из одной группы в другую |
private void SearchClient() |
Поиск клиентов |
private void OpenEmployees() |
Форма сотрудников |
private void InsertToDataGrid(DataTable table) |
Заполнение элемента DataGrid на странице "Основные таблицы" |
internal void LoadMainDataBase() |
Загрузка главной БД |
private void UpdateMainData() |
Обновление главной БД |
private void ChangeStatus(ListView.SelectedListViewItemCollection items, StatusType status) |
Изменение статуса группы из проводника |
private void CalculateTotalPage(DataRow currentTotalRow) |
Итоговые расчеты на текущую запись в таблице data |
private void OpenItemInForm(TreeNodeType treeNodeType) |
Открывание заголовка item в элементе ListView |
private void AddNewClientWaitingRoom() |
Добавление нового клиента со страницы "Приемная" |
private void SetWitdhForDataGrids() |
Установка размера окон — используется при изменении размера окон |
private void DesigneDataGrids() |
Установка дизайна элементов DataGrid |
private double ClientIncomeSumm(int clientID) |
Сумма прихода клиента |
private double ClientRealizedSumm(int clientID) |
Реализованная сумма клиента |
private void GetOweStatistic() |
Вычисление должников — метод требуется для страницы "Статистика" |
private void RemoveTempFindControl() |
Удаление временных контролов поиска со страницы "Приемная" |
private DataRow GetTablesRow(DataTable table, int rowIndex, CurrencyManager currManager) |
Создание новой или отображение существующей записи таблицы на вкладке "Приемная" |
Листинг формы frmManager:
using System;
using System.Drawing;
using System.Data;
using System.Data.SqlTypes;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Windows.Forms.Design;
using System.Globalization;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.InteropServices;
using System.Reflection;
using Manager.Forms;
using System.Threading;
namespace Manager
{
internal class frmManager : System.Windows.Forms.Form
{
//Элементы управления
#region Константы
const int Delta = 10; // Смещение заголовка item по оси Х вправо относительно курсора
#endregion
#region Глобальные переменные
#region Путь к БД
private string MainConnectionString = "Data Source=EducationCenter.mdb;Provider=Microsoft.Jet.OLEDB.4.0;persist security info=False;User ID=admin";
#endregion
#region Глобальные поля
private int currentDataID;
private TreeNode selectedNode;
private string selectedNodeName = "";
private TreeNodeType treeNodeType;
private TreeNode MainTreeNode = null;
private DirectionTreeNode[] dtns = null;
private Color itemColor;
private CustomListItem selectedItem; // Выбранный заголовок item на элементе ListView в проводнике.
private CurrencyManager currManagerIncome;
private CurrencyManager currManagerOut;
private CurrencyManager currManagerPaymentType;
private CurrencyManager currManagerTotal;
internal frmAuthorization.UserGroup userGroup;
private bool SelectingClient = false; // Переменная, определяющая возможность выбора клиента
CurrencyManager cmClientsTable;
CurrencyManager cmGroupsTable;
TreeNode oldGroupNode;
#endregion
#region Глобальные свойства
static private int dataID = 0;
static internal int DataID
{
get { return dataID; }
}
#endregion
#endregion
#region Конструкторы
// Главный конструктор
internal frmManager()
{
try
{
InitializeComponent();
this.DesigneDataGrids(); // Дизайн таблиц в элементах datagrid.
this.InitDefaultSettings(); // Установка значений по умолчанию.
this.SetAllowDBNullForMainDataSet(); // Дополнительный метод для mainDataSet-a
this.CheckEmployeesBirthDays();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
#endregion
#region Перечисления
/// <summary>
/// Это перечисление содержит константы типов узлов в главном дереве
/// </summary>
internal enum TreeNodeType
{
Top,
Direction,
Course,
Group
}
/// <summary>
/// Это перечисление содержит константы статусов группы
/// </summary>
internal enum StatusType
{
Filling = 1,
Learning = 2,
Finished = 3
}
#endregion
#region Структуры
/// <summary>
/// Item в DataGrid
/// </summary>
public struct DataGridItem
{
private string text;
public string Text
{
get { return text; }
set { text = value; }
}
internal DataGridItem(string text)
{
this.text = text;
}
}
#endregion
#region Мои методы
#region Windows Form Designer generated code
private void InitializeComponent()
{
// Описание метода
}
#endregion
// Загружаем список курсов в объект DataGrid
private void LoadCoursesDataGrid(int directionID)
{
try
{
DataView dvCourses = new DataView(mainDataSet.course);
dvCourses.RowFilter = "directionID = " + directionID.ToString();
dgCourses.DataSource = dvCourses;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Устанавливаем настройки по умолчанию
private void InitDefaultSettings()
{
// Значения по умолчанию в главных таблицах
mainDataSet.PlanRealization.Columns["IsRealized"].DefaultValue = false;
mainDataSet.PlanRealization.Columns["SummaPlan"].DefaultValue = 0;
mainDataSet.PlanRealization.Columns["SummaRealization"].DefaultValue = 0;
mainDataSet.PlanRealization.Columns["Cause"].DefaultValue = "";
mainDataSet.income.Columns["IsRealized"].DefaultValue = false;
mainDataSet.income.Columns["payment_typeID"].DefaultValue = 1;
mainDataSet.income.Columns["clientID"].DefaultValue = 1;
mainDataSet.income.Columns["summa"].DefaultValue = 0;
mainDataSet.expenses.Columns["payment_typeID"].DefaultValue = 1;
mainDataSet.expenses.Columns["clientID"].DefaultValue = 1;
mainDataSet.expenses.Columns["employeeID"].DefaultValue = 1;
mainDataSet.data.Columns["amountYesterday"].DefaultValue = 0;
mainDataSet.data.Columns["amountToday"].DefaultValue = 0;
mainDataSet.data.Columns["incomeToday"].DefaultValue = 0;
mainDataSet.data.Columns["expanseToday"].DefaultValue = 0;
// Добавляем временную колонку EmployeeName в таблицу Employees для отображения
// на форме группы
DataColumn employeeName = new DataColumn("EmployeeName");
employeeName.Expression = "LastName + \' \' + FirstName";
employeeName.DataType = typeof(string);
mainDataSet.employees.Columns.Add(employeeName);
mainDataSet.groups.Columns["beginDate"].DefaultValue = DateTime.Now.Date;
mainDataSet.groups.Columns["endDate"].DefaultValue = DateTime.Now.Date;
mainDataSet.groups.Columns["beginTime"].DefaultValue = DateTime.Now.Date;
mainDataSet.groups.Columns["endTime"].DefaultValue = DateTime.Now.Date;
mainDataSet.clients.Columns["isRinged"].DefaultValue = false;
// Обработчики для главной формы
this.WindowState = FormWindowState.Maximized;
this.Resize += new EventHandler(frmManager_Resize);
this.Closed += new EventHandler(frmManager_Closed);
this.Load += new EventHandler(frmManager_Load);
this.Resize += new EventHandler(frmManager_Resize);
// Устанавливаем размеры окон — метод используется,
// когда изменяются размеры окон
this.SetWitdhForDataGrids();
// Другие настройки *************************
miList.Checked = true;
lvManager.Activation = ItemActivation.OneClick;
string date = "dd MMMM yyyy, dddd";
lblDateTime.Text = DateTime.Now.Date.ToString(date);
hpManager.SetShowHelp(this, true);
// ******************************************
// Связываем объекты CurrencyManager c таблицами
currManagerIncome = (CurrencyManager)this.BindingContext[mainDataSet, "data.dataincome"];
currManagerOut = (CurrencyManager)this.BindingContext[mainDataSet, "data.dataexpenses"];
currManagerPaymentType = (CurrencyManager)this.BindingContext[mainDataSet, "payment_type"];
// Обработчики событий CheckedChanged для RadioButton-ов,
// отображающих таблицы главной БД
rbClients.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbCourses.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbDataMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbDirections.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbEmployees.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbGroupClientsMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbGroups.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbIncomeMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbOutMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbPaymentTypeMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbRealizedTableMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
rbStatusMain.CheckedChanged += new EventHandler(rbClients_CheckedChanged);
// Обработчики событий элементов управления.
dgCourses.Click += new EventHandler(dgCourses_Click);
dgGroups.Click += new EventHandler(dgGroups_Click);
dgClients.MouseUp += new MouseEventHandler(dgClients_MouseUp);
dgIncome.MouseUp += new MouseEventHandler(dgIncome_MouseUp);
dgOut.MouseUp += new MouseEventHandler(dgIncome_MouseUp);
btnCreateClient.Click += new EventHandler(btnCreateClient_Click);
btnCalculateOwe.Click += new EventHandler(btnCalculateOwe_Click);
btnFindPasteClient.Click += new EventHandler(btnFindPasteClient_Click);
btnShowGroups.Click += new EventHandler(btnShowGroups_Click);
btnShowPaymentTypeForm.Click += new EventHandler(btnShowPaymentTypeForm_Click);
btnNextDate.Click += new EventHandler(btnNextDate_Click);
btnPrevDate.Click += new EventHandler(btnPrevDate_Click);
btnDeleteClient.Click += new EventHandler(btnDeleteClient_Click);
btnDeleteGroup.Click += new EventHandler(btnDeleteGroup_Click);
cmbFilteringDirection.SelectionChangeCommitted+=new
EventHandler(cmbFilteringDirection_SelectionChangeCommitted);
cmiFindIncomeOutClient.Click+= new EventHandler(cmiFindIncomeOutClient_Click);
tbMain.ButtonClick += new ToolBarButtonClickEventHandler(tbMain_ButtonClick);
miChangePassword.Click += new EventHandler(miChangePassword_Click);
// Настройки и инициализация главной БД
mainDataSet.PlanRealization.RowChanged += new DataRowChangeEventHandler(PlanRealization_RowChanged);
mainDataSet.income.RowChanged += new DataRowChangeEventHandler(income_RowChanged);
dgGroups.DataSource = null;
}
// Проверка дней рождения
internal void CheckEmployeesBirthDays()
{
try
{
DateTime nowDate = DateTime.Now.Date;
ArrayList employees = new ArrayList();
bool flag = false;
foreach (DataRow employeeRow in mainDataSet.employees.Rows)
{
if (employeeRow.IsNull("birthDay"))
continue;
DateTime emplBirthDay = (DateTime)employeeRow["birthDay"];
bool isBirthDay = ((emplBirthDay.Month == nowDate.Month) (emplBirthDay.Day == nowDate.Day));
if (isBirthDay)
{
string emplName = String.Format("{0} {1}.",
employeeRow["LastName"].ToString(),
employeeRow["FirstName"].ToString());
employees.Add(emplName);
flag = true;
}
}
if (flag)
{
BirthDayControl.BirthDay birth = new BirthDayControl.BirthDay(employees);
this.Controls.Add(birth);
birth.Location = new Point(this.Width / 2, this.Height / 2);
birth.BringToFront();
birth.Show();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Вставка новой записи текущей даты в таблицу data, если таковой не существует
internal void PasteDateRow()
{
try
{
string nowDate = DateTime.Now.Date.ToString("dd MMMM yyyy");
foreach (DataRow totalRow in mainDataSet.data.Rows)
{
DateTime dt = (DateTime)totalRow["currentDate"];
if (dt.Date.ToString("dd MMMM yyyy") == nowDate)
{
dataID = (int)totalRow["dataID"];
currentDataID = dataID;
return;
}
}
// Добавляем запись текущего времени в главную таблицу data, с учетом,
// что в data может не быть записи
DataRow newDataRow = mainDataSet.data.NewRow();
newDataRow["currentDate"] = nowDate;
newDataRow["incomeToday"] = 0;
newDataRow["expanseToday"] = 0;
newDataRow["note"] = "";
mainDataSet.data.Rows.Add(newDataRow);
DataRow lastRow = null;
if (mainDataSet.data.Rows.Count != 0)
{
lastRow = mainDataSet.data.Rows[mainDataSet.data.Rows.Count - 1];
newDataRow["amountYesterday"] = (decimal)lastRow["amountToday"];
DataRow lastDataRow = mainDataSet.data.Rows[mainDataSet.data.Rows.Count - 1];
int lastDataID = (int)lastDataRow["dataID"];
dataID = lastDataID;
mainDataSet.income.Columns["dataID"].DefaultValue = lastDataID;
mainDataSet.expenses.Columns["dataID"].DefaultValue = lastDataID;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Разрешение null-значений для таблиц
private void SetAllowDBNullForMainDataSet()
{
try
{
// Разрешение null-значений для таблицы group
mainDataSet.groups.Columns["beginDate"].AllowDBNull = true;
mainDataSet.groups.Columns["endDate"].AllowDBNull = true;
mainDataSet.groups.Columns["beginTime"].AllowDBNull = true;
mainDataSet.groups.Columns["endTime"].AllowDBNull = true;
mainDataSet.groups.Columns["clientsCount"].AllowDBNull = true;
mainDataSet.groups.Columns["classNumber"].AllowDBNull = true;
mainDataSet.groups.Columns["courseID"].AllowDBNull = true;
mainDataSet.groups.Columns["employeeID"].AllowDBNull = true;
mainDataSet.groups.Columns["StatusID"].AllowDBNull = true;
mainDataSet.groups.Columns["note"].AllowDBNull = true;
// Разрешение null-значений для таблицы group
mainDataSet.clients.Columns["recorddate"].AllowDBNull = true;
// Разрешение null-значений для таблицы course
mainDataSet.course.Columns["priceNumber"].AllowDBNull = true;
// Разрешение null-значений для таблицы employees
mainDataSet.employees.Columns["birthDay"].AllowDBNull = true;
// Разрешение null-значений для таблицы GroupClients
mainDataSet.group_clients.Columns["IsPaid"].AllowDBNull = true;
// Разрешение null-значений для таблицы income
mainDataSet.income.Columns["IsRealized"].AllowDBNull = true;
mainDataSet.income.Columns["Payment_TypeID"].AllowDBNull = true;
// Разрешение null-значений для таблицы PlanRealization
mainDataSet.PlanRealization.Columns["IsRealized"].AllowDBNull = true;
mainDataSet.PlanRealization.Columns["DateRealization"].AllowDBNull = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Загружаем страницу оплат
internal void FillPaymentsPage()
{
try
{
dgIncome.DataSource = mainDataSet;
dgIncome.DataMember = "data.dataincome";
dgOut.DataSource = mainDataSet;
dgOut.DataMember = "data.dataexpenses";
currManagerTotal = (CurrencyManager)this.BindingContext[mainDataSet, "data"];
txtYesterdaySumm.DataBindings.Add("Text", mainDataSet, "data.amountYesterday");
txtResultCount.DataBindings.Add("Text", mainDataSet, "data.amountToday");
currManagerTotal.Position = mainDataSet.data.Rows.Count - 1;
DataView dvTotal = new DataView(mainDataSet.data);
int prevDataID = 0;
int lastDataID = 0;
lastDataID = (int)mainDataSet.data.Rows[mainDataSet.data.Rows.Count - 1]["dataID"];
if (mainDataSet.data.Rows.Count - 2 != -1)
prevDataID = (int)mainDataSet.data.Rows[mainDataSet.data.Rows.Count - 2]["dataID"];
else
prevDataID = lastDataID;
dvTotal.RowFilter = "dataID >= " + prevDataID.ToString() + " AND dataID <= " + lastDataID.ToString();
dgMainTable.DataSource = dvTotal;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Добавляем нового клиента
private void AddNewClient()
{
frmClient f = new frmClient(this.mainDataSet);
f.lblClientID.Text = "Новый клиент";
f.Text += selectedNodeName;
MainDataSet.groupsRow group = (MainDataSet.groupsRow)selectedNode.Tag;
f.GroupID = (int)group["groupID"];
f.tpClientGroups.Hide();
if (f.ShowDialog() == DialogResult.OK)
{
try
{
// Добавляем данные в табл. clients
DataRow newClientRow = mainDataSet.clients.NewRow();
newClientRow["fname"] = f.txtFirstName.Text;
newClientRow["lname"] = f.txtLastName.Text;
newClientRow["fathName"] = f.txtFatherName.Text;
newClientRow["linkData"] = f.txtPhones.Text;
newClientRow["recorddate"] = f.dtpRecordDate.Value;
newClientRow["note"] = f.txtNotes.Text;
mainDataSet.clients.Rows.Add(newClientRow);
// Добавляем данные в табл. Group_Clients
DataRow newGroupClientRow = mainDataSet.group_clients.NewRow();
DataRow selectedGroup = (DataRow)selectedNode.Tag;
int clientID = (int)newClientRow[0];
newGroupClientRow["clientID"] = clientID;
newGroupClientRow["groupID"] = (int)selectedGroup[0];
mainDataSet.group_clients.Rows.Add(newGroupClientRow);
selectedGroup["clientsCount"] = lvManager.Items.Count + 1;
// Добавляем данные в табл. income
DataView dvIncome = new DataView(mainDataSet.income);
dvIncome.RowFilter = "clientID = " + clientID.ToString();
if (dvIncome == null)
{
DataRow newIncomeRow = mainDataSet.income.NewRow();
newIncomeRow["ClientID"] = clientID;
newIncomeRow["dataID"] = DataID;
newIncomeRow["IsRealized"] = 0;
mainDataSet.income.Rows.Add(newIncomeRow);
}
// Refresh ListView
this.FillListView(treeNodeType, selectedNode);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
// Добавляем новую группу из проводника
private void AddNewGroup()
{
MainDataSet.groupsRow newGroup = (MainDataSet.groupsRow)mainDataSet.groups.NewRow();
frmGroup f = new frmGroup(mainDataSet);
f.Text += selectedNodeName;
f.lblGroupID.Text = "Новая группа";
if (f.ShowDialog() == DialogResult.OK)
{
try
{
DataRow courseRow = (DataRow)selectedNode.Tag;
int courseID = (int)courseRow["courseID"];
string stringBeginDate = f.dtpBeginDate.Value.ToString("dd MMMM yyyy");
newGroup["beginDate"] = DateTime.Parse(stringBeginDate);
string stringEndDate = f.dtpEndDate.Value.ToString("dd MMMM yyyy");
newGroup["endDate"] = DateTime.Parse(stringEndDate);
string stringBeginTime = f.dtpBeginTime.Value.ToString("HH:mm");
newGroup["beginTime"] = DateTime.Parse(stringBeginTime);
string stringEndTime = f.dtpEndTime.Value.ToString("HH:mm");
newGroup["endTime"] = DateTime.Parse(stringEndTime);
newGroup["classNumber"] = int.Parse(f.cmbClassNumber.Text);
newGroup["clientsCount"] = 0;
newGroup["courseID"] = courseID;
DataRowView employeeRowView = (DataRowView)f.cmEmployees.Current;
newGroup["employeeID"] = (int)employeeRowView.Row["employeeID"];
newGroup["note"] = f.txtNotes.Text;
int statusID = (int)mainDataSet.GroupStatus.Rows[f.cmbEmployee.SelectedIndex]["StatusID"];
newGroup["StatusID"] = statusID;
mainDataSet.groups.AddgroupsRow(newGroup);
GroupTreeNode gtn = new GroupTreeNode();
gtn.Tag = newGroup;
gtn.Text = newGroup["groupID"].ToString();
gtn.ImageIndex = 6;
if (statusID == 1) // Группа набирается
{
gtn.ForeColor = Color.Red;
}
else if (statusID == 2) // Группа обучается
{
gtn.ForeColor = Color.Green;
}
else if (statusID == 3) // Группа закончила обучение
{
gtn.ForeColor = Color.Blue;
}
selectedNode.Nodes.Add(gtn);
this.FillListView(treeNodeType, selectedNode);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
// Добавляем новую группу со страницы 'Приемная'
private void AddNewGroupWaitingRoom()
{
try
{
MainDataSet.groupsRow newGroup = (MainDataSet.groupsRow)mainDataSet.groups.NewRow();
frmGroup f = new frmGroup(mainDataSet);
int courseRowID = dgCourses.CurrentRowIndex;
DataView dvCourses = (DataView)dgCourses.DataSource;
DataRow course = dvCourses[courseRowID].Row;
f.cmbEmployee.DataSource = mainDataSet.employees;
f.cmbEmployee.DisplayMember = mainDataSet.employees.LastNameColumn.ToString();
f.Text += course["courseName"].ToString();
f.lblGroupID.Text = "Новая группа";
if (f.ShowDialog() == DialogResult.OK)
{
try
{
int courseID = (int)course[0];
newGroup["beginDate"] = f.dtpBeginDate.Value;
newGroup["endDate"] = f.dtpEndDate.Value;
newGroup["beginTime"] = f.dtpBeginTime.Value;
newGroup["endTime"] = f.dtpEndTime.Value;
newGroup["classNumber"] = int.Parse(f.cmbClassNumber.Text);
newGroup["clientsCount"] = 0;
newGroup["courseID"] = courseID;
DataRowView employeeRowView = (DataRowView)f.cmEmployees.Current;
newGroup["employeeID"] = (int)employeeRowView.Row["employeeID"];
newGroup["note"] = f.txtNotes.Text;
int statusID = (int)mainDataSet.GroupStatus.Rows[f.cmbStatus.SelectedIndex][0];
newGroup["StatusID"] = statusID;
mainDataSet.groups.AddgroupsRow(newGroup);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Добавляем новый курс
private void AddNewCourse()
{
frmCourse f = new frmCourse();
DataRow newCourse = mainDataSet.course.NewRow();
int newCourseID = (int)newCourse["courseID"];
f.Text += selectedNodeName;
f.lblCourseNumber.Text += newCourseID.ToString();
if (f.ShowDialog() == DialogResult.OK)
{
try
{
DataRow directionRow = (DataRow)selectedNode.Tag;
int directionID = (int)directionRow[0];
newCourse["courseName"] = f.txtCourseName.Text;
newCourse["priceNumber"] = decimal.Parse(f.txtCoursePrice.Text);
newCourse["directionID"] = directionID;
mainDataSet.course.Rows.Add(newCourse);
CourseTreeNode ctn = new CourseTreeNode();
ctn.Tag = newCourse;
ctn.Text = newCourse[1].ToString();
ctn.ImageIndex = 10;
ctn.ForeColor = Color.Green;
selectedNode.Nodes.Add(ctn);
this.FillListView(treeNodeType, selectedNode);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
// Добавляем новое направление
private void AddNewDirection()
{
frmDirection f = new frmDirection();
if (f.ShowDialog() == DialogResult.OK)
{
try
{
DataRow newDirection = mainDataSet.directions.NewRow();
newDirection["directName"] = f.txtDirectionName.Text;
newDirection["note"] = f.txtDirectionNote.Text;
mainDataSet.directions.Rows.Add(newDirection);
DirectionTreeNode dtn = new DirectionTreeNode();
dtn.Tag = newDirection;
dtn.Text = newDirection["directName"].ToString();
dtn.ImageIndex = 11;
dtn.ForeColor = Color.RoyalBlue;
selectedNode.Nodes.Add(dtn);
this.FillListView(treeNodeType, selectedNode);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
/// <summary>
/// Этот метод заполняет дерево данными из главной БД
/// </summary>
internal void Explorer()
{
try
{
tvManager.Sorted = true;
tvManager.Nodes.Clear();
lvManager.Items.Clear();
// Вершина TreeView
MainTreeNode = new TreeNode("Учебный центр");
tvManager.Nodes.Add(MainTreeNode);
tvManager.Nodes[0].ImageIndex = 0;
tvManager.Nodes[0].ForeColor = Color.Blue;
dtns = new DirectionTreeNode[mainDataSet.directions.Rows.Count];
DirectionTreeNode dtn = null;
for (int k = 0; k < mainDataSet.directions.Rows.Count; k++)
{
//Добавляем направление с дочерними узлами
dtn = new DirectionTreeNode();
dtn.NDDataSet = this.mainDataSet;
dtn.DirectionID = (int)mainDataSet.directions.Rows[k]["directionID"];
dtn.DirectionName = dtn.Text = mainDataSet.directions.Rows[k]["directName"].ToString();
dtn.DirectionNote = mainDataSet.directions.Rows[k]["note"].ToString();
dtn.ImageIndex = 11;
dtn.ForeColor = Color.RoyalBlue;
dtn.GetChilds();
dtn.Tag = mainDataSet.directions.Rows[k];
dtns[k] = dtn;
dtn = null;
}
MainTreeNode.Nodes.AddRange(dtns);
MainTreeNode.Expand();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Заполняем ListView данными узла дерева
private void FillListView(TreeNodeType treeNodeType, TreeNode treeNode)
{
try
{
int imageIndexListView = 11;
TreeNode tempTreeNode = null;
lvManager.Columns.Clear();
DataRow selectedDirection = null;
DataRow selectedCourse = null;
DataRow selectedGroup = null;
switch (treeNodeType)
{
case TreeNodeType.Top:
// В ListView находятся направления
tempTreeNode = treeNode;
imageIndexListView = 11;
break;
case TreeNodeType.Direction:
// В ListView находятся курсы
DirectionTreeNode dtn = new DirectionTreeNode();
dtn.NDDataSet = this.mainDataSet;
selectedDirection = (DataRow)selectedNode.Tag;
dtn.DirectionID = (int)selectedDirection["directionID"];
dtn.GetChilds();
tempTreeNode = treeNode;
imageIndexListView = 10;
break;
case TreeNodeType.Course:
// В ListView находятся группы
CourseTreeNode ctn = new CourseTreeNode();
ctn.NDDataSet = this.mainDataSet;
selectedCourse = (DataRow)selectedNode.Tag;
ctn.CourseID = (int)selectedCourse["courseID"];
ctn.GetChilds();
tempTreeNode = treeNode;
imageIndexListView = 6;
break;
case TreeNodeType.Group:
// В ListView находятся клиенты
GroupTreeNode gtn= new GroupTreeNode();
gtn.NDDataSet = this.mainDataSet;
selectedGroup = (DataRow)selectedNode.Tag;
gtn.GroupID = (int)selectedGroup["groupID"];
gtn.GetChilds();
tempTreeNode = gtn;
imageIndexListView = 7;
break;
}
lvManager.Items.Clear();
string str = "";
// В ListView добавляем группы
if (tempTreeNode is CourseTreeNode)
{
// Добавляем в ListView колонки из таблицы groups
for (int i = 0; i < mainDataSet.groups.Columns.Count; i++)
{
ColumnHeader ch = new ColumnHeader();
ch.Text = mainDataSet.groups.Columns[i].Caption;
ch.Width = 100;
lvManager.Columns.Add(ch);
}
MainDataSet.courseRow course = (MainDataSet.courseRow)tempTreeNode.Tag;
DataRow[] groups = course.GetChildRows("coursegroups");
for(int i = 0; i < groups.Length; i++)
{
// В ListViewItem добавляем массив строк данной записи из табл. groups
string[] subitems = new string[groups[i].ItemArray.Length];
for (int j = 0; j < subitems.Length; j++)
{
subitems[j] = groups[i][j].ToString();
}
if ( groups[i]["beginDate"] != null)
{
DateTime beginDate = (DateTime)groups[i]["beginDate"];
subitems[1] = beginDate.Date.ToString("dd MMMM yyyy");
}
if ( groups[i]["endDate"] != null)
{
DateTime endDate = (DateTime)groups[i]["endDate"];
subitems[2] = endDate.Date.ToString("dd MMMM yyyy");
}
if (groups[i]["beginTime"] != null)
{
DateTime beginTime = (DateTime)groups[i]["beginTime"];
subitems[3] = beginTime.ToString("HH:mm");
}
if (groups[i]["endTime"] != null)
{
DateTime endTime = (DateTime)groups[i]["endTime"];
subitems[4] = endTime.ToString("HH:mm");
}
CustomListItem cli = new CustomListItem(subitems, imageIndexListView);
int statusID = (int)groups[i][10];
if (statusID == 1) // Группа набирается
{
cli.ForeColor = Color.Red;
}
else if (statusID == 2) // Группа обучается
{
cli.ForeColor = Color.Green;
}
else if (statusID == 3) // Группа закончила обучение
{
cli.ForeColor = Color.Blue;
}
cli.BindedRow = groups[i];
lvManager.Items.Add(cli);
str = "";
}
}
// В ListView добавляем курсы
else if (tempTreeNode is DirectionTreeNode)
{
DataRow[] courses = selectedDirection.GetChildRows("directionscourse");
foreach(DataRow course in courses)
{
CustomListItem cli = new CustomListItem();
str = course.ItemArray[1].ToString();
cli.Text = str;
cli.BindedRow = course;
cli.ImageIndex = imageIndexListView;
lvManager.Items.Add(cli);
str = "";
}
}
// В ListView добавляем клиентов
else if (tempTreeNode is GroupTreeNode)
{
for(int i = 0; i < tempTreeNode.Nodes.Count; i++)
{
DataRow client = (DataRow)tempTreeNode.Nodes[i].Tag;
CustomListItem cli = new CustomListItem();
str = client["lname"].ToString() + " " + client["fname"].ToString() + " " + client["fathName"].ToString();
cli.Text = str;
cli.BindedRow = (DataRow)tempTreeNode.Nodes[i].Tag;
cli.ImageIndex = imageIndexListView;
lvManager.Items.Add(cli);
str = "";
}
}
else // Добавляем направления в ListView
{
for(int i = 0; i < mainDataSet.directions.Rows.Count; i++)
{
CustomListItem cli = new CustomListItem();
if(mainDataSet.directions.Rows[i].RowState != DataRowState.Deleted)
{
str = mainDataSet.directions.Rows[i][1].ToString();
cli.Text = str;
cli.BindedRow = mainDataSet.directions.Rows[i];
cli.ImageIndex = imageIndexListView;
lvManager.Items.Add(cli);
}
str = "";
}
}
spCount.Text = "Количество записей: " + lvManager.Items.Count.ToString();
for (int i = 0; i < lvManager.Items.Count; i++)
{
lvManager.Items[i].ForeColor = tempTreeNode.Nodes[i].ForeColor;
lvManager.Items[i].ImageIndex = imageIndexListView;
itemColor = lvManager.Items[i].ForeColor; // Цвет текста передвигаемой item
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Перевод выбранных клиентов из одной группы в другую
private void TransferClients(TreeNode oldGroup, TreeNode newGroup)
{
CourseTreeNode newCourse = (CourseTreeNode)newGroup.Parent; // Определяем курс для новой группы
CourseTreeNode oldCourse = (CourseTreeNode)oldGroup.Parent; // Определяем курс старой группы
double CoursePrice = (double)newCourse.CoursePrice; // Стоимость нового курса
// Определяем все оплаты клиента
DataRow oldGroupRow = (DataRow)oldGroup.Tag;
DataRow newGroupRow = (DataRow)newGroup.Tag;
DataRow[] groupClientsRows = oldGroupRow.GetChildRows("groupsgroup_clients");
DataView dvIncome = new DataView(mainDataSet.income);
int clientID = (int)selectedItem.BindedRow["clientID"]; // ID клиента
dvIncome.RowFilter = "(ClientID = " + clientID.ToString() + ") AND (IsRealized <> 1)";
// Определяем сумму клиента на счету
double incomeSumm = 0;
double clientSumm = 0;
double realizedSumm = 0;
foreach (DataRowView drv in dvIncome)
{
DataRow[] planRows = drv.Row.GetChildRows("incomePlanRealization");
foreach(DataRow planRow in planRows)
if ((bool)planRow["IsRealized"]) // Проверка реализации суммы в PlanRealization
{
realizedSumm += (double)planRow["SummaRealization"];
}
incomeSumm += (double)drv.Row["Summa"];
}
clientSumm = incomeSumm - realizedSumm;
frmClientTransfer fct = new frmClientTransfer();
fct.dgClientPayments.DataSource = dvIncome;
fct.txtClientName.Text = selectedItem.BindedRow["lname"].ToString() + " " + selectedItem.BindedRow["fname"].ToString() + " " + selectedItem.BindedRow["fathName"].ToString();
fct.txtAccountSumm.Text = clientSumm.ToString();
fct.lblOldGroupNumber.Text = oldGroupRow["groupID"].ToString();
fct.lblNewGroupNumber.Text = newGroupRow["groupID"].ToString();
fct.lblOldCourseName.Text = oldCourse.Text;
DataRow courseRow = (DataRow)newCourse.Tag;
double newCoursePrice = Convert.ToDouble(courseRow["priceNumber"]);
fct.lblNewCourseName.Text = newCourse.CourseName.ToString();
fct.txtNewCoursePrice.Text = newCoursePrice.ToString();
// Расчет разницы
fct.txtDefferenceCount.Text = Convert.ToString(clientSumm - newCoursePrice);
if (fct.ShowDialog() == DialogResult.OK)
{
lvManager.Items.Add(selectedItem);
DataRow row = mainDataSet.group_clients.NewRow();
row["clientID"] = (int)selectedItem.BindedRow["clientID"];
row["groupID"] = int.Parse(selectedNode.Text);
row["IsPaid"] = true;
mainDataSet.group_clients.Rows.Add(row);
this.FillListView(treeNodeType, selectedNode);
}
}
// Поиск клиентов
private void SearchClient()
{
frmSearchClient f = new frmSearchClient(this.mainDataSet);
f.ShowDialog();
}
// Форма сотрудников
private void OpenEmployees()
{
frmEmployee f = new frmEmployee(this.mainDataSet);
f.ShowDialog();
}
// Загрузка главной БД
internal void LoadMainDataBase()
{
mainOleDbConnection.ConnectionString = MainConnectionString;
try
{
mainDataSet.EnforceConstraints = false;
directionsOleDbDataAdapter.Fill(mainDataSet.directions);
coursesOleDbDataAdapter.Fill(mainDataSet.course);
employeesOleDbDataAdapter.Fill(mainDataSet.employees);
groupStatusOleDbDataAdapter.Fill(mainDataSet.GroupStatus);
groupsOleDbDataAdapter.Fill(mainDataSet.groups);
clientsOleDbDataAdapter.Fill(mainDataSet.clients);
groupClientsOleDbDataAdapter.Fill(mainDataSet.group_clients);
realizedTableOleDbDataAdapter.Fill(mainDataSet.RealizedTable);
dataOleDbDataAdapter.Fill(mainDataSet.data);
paymentTypeOleDbDataAdapter.Fill(mainDataSet.payment_type);
incomeOleDbDataAdapter.Fill(mainDataSet.income);
planRealizationOleDbDataAdapter.Fill(mainDataSet.PlanRealization);
outOleDbDataAdapter.Fill(mainDataSet.expenses);
mainDataSet.EnforceConstraints = true;
foreach (DataRow dr in mainDataSet.directions.Rows)
{
ListItem directionItem = new ListItem(dr);
directionItem.Text = dr[1].ToString();
cmbDirections.Items.Add(directionItem.Text);
cmbFilteringDirection.Items.Add(directionItem.Text);
}
foreach (DataRow dr in mainDataSet.GroupStatus.Rows)
{
ListItem groupStatusItem = new ListItem(dr);
groupStatusItem.Text = dr[1].ToString();
cmbGroupStatus.Items.Add(groupStatusItem.Text);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
System.Environment.Exit(1);
}
}
// Обновление главной БД
private void UpdateMainData()
{
mainOleDbConnection.ConnectionString = MainConnectionString;
try
{
MainDataSet ds = (MainDataSet)mainDataSet.GetChanges();
if (ds != null)
{
ds.EnforceConstraints = false;
dataOleDbDataAdapter.Update(ds);
paymentTypeOleDbDataAdapter.Update(ds);
directionsOleDbDataAdapter.Update(ds);
coursesOleDbDataAdapter.Update(ds);
employeesOleDbDataAdapter.Update(ds.employees);
clientsOleDbDataAdapter.Update(ds);
groupStatusOleDbDataAdapter.Update(ds);
groupsOleDbDataAdapter.Update(ds);
groupClientsOleDbDataAdapter.Update(ds);
realizedTableOleDbDataAdapter.Update(ds);
incomeOleDbDataAdapter.Update(ds);
planRealizationOleDbDataAdapter.Update(ds);
outOleDbDataAdapter.Update(ds);
ds.EnforceConstraints = true;
mainDataSet.AcceptChanges();
}
}
catch(SqlException ex)
{
StringBuilder msg = new StringBuilder();
foreach(SqlError err in ex.Errors)
{
msg.AppendFormat("{0}\n",err.Message);
}
MessageBox.Show(msg.ToString(), ex.Source);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Изменение статуса группы из проводника
private void ChangeStatus(ListView.SelectedListViewItemCollection items, StatusType status)
{
int statusID = 0;
Color color = Color.Black;
switch (status)
{
// Группа набирается
case StatusType.Filling:
statusID = 1;
color = Color.Red;
break;
// Группа обучается
case StatusType.Learning:
statusID = 2;
color = Color.Green;
break;
// Группа закончила обучение
case StatusType.Finished:
statusID = 3;
color = Color.Blue;
break;
}
foreach(ListViewItem lvi in items)
{
CustomListItem item = (CustomListItem)lvi;
item.BindedRow["StatusID"] = statusID;
item.ForeColor = color;
selectedNode.Nodes[item.Index].ForeColor = color;
}
}
// Итоговые расчеты на текущую запись в таблице data
private void CalculateTotalPage(DataRow currentTotalRow)
{
double resultIncome = 0;
double resultOut = 0;
double balance = 0;
int dataID = (int)currentTotalRow[0];
DataRow[] incomeRows = currentTotalRow.GetChildRows("dataincome");
DataRow[] outRows = currentTotalRow.GetChildRows("dataexpenses");
// Определение прихода
foreach (DataRow dr in incomeRows)
{
if (dr[3] == null)
continue;
resultIncome += (double)dr[3];
}
txtResultIncome.Text = resultIncome.ToString("c");
// Определение расхода
foreach (DataRow dr in outRows)
{
if (dr[3] == null)
continue;
resultOut += (double)dr[3];
}
txtResultOut.Text = resultOut.ToString("c");
// Баланс
balance = resultIncome - resultOut;
txtBalance.Text = balance.ToString("c");
// Итоговые расчеты
double yesterdaySumm = Convert.ToDouble(currentTotalRow[2]);
txtYesterdaySumm.Text = yesterdaySumm.ToString("c");
double total = yesterdaySumm + balance;
txtResultCount.Text = total.ToString("c");
currentTotalRow["incomeToday"] = (double)resultIncome; // Приход на сегодня
currentTotalRow["expanseToday"] = (double)resultOut; // Расход на сегодня
currentTotalRow["amountToday"] = yesterdaySumm + balance; // Итог на сегодня. К сумме, полученной вчера, прибавляем баланс на сегодня
}
// Открываем заголовок item в ListView
private void OpenItemInForm(TreeNodeType treeNodeType)
{
// Выбранный элемент в ListView
CustomListItem cli = (CustomListItem)lvManager.SelectedItems[0];
try
{
switch (treeNodeType)
{
case TreeNodeType.Group:
frmClient client = new frmClient(cli.BindedRow, this.mainDataSet);
int clientID = (int)cli.BindedRow[0];
DataView dvClientGroups = new DataView(mainDataSet.group_clients);
dvClientGroups.RowFilter = "clientID = " + clientID.ToString();
DataGridItem[] items = new DataGridItem[dvClientGroups.Count];
int i = 0;
foreach(DataRowView drv in dvClientGroups)
{
DataGridItem dgi = new DataGridItem(drv.Row[1].ToString());
items[i++]= dgi;
}
client.dgClientGroups.SetDataBinding(items, null);
client.Text += selectedNode.Text;
client.ShowDialog();
break;
case TreeNodeType.Course:
frmGroup group = new frmGroup(mainDataSet, cli.BindedRow);
group.Text += selectedNodeName;
group.ShowDialog();
break;
case TreeNodeType.Direction:
frmCourse course = new frmCourse(cli.BindedRow);
course.Text += selectedNodeName;
course.ShowDialog() ;
break;
case TreeNodeType.Top:
frmDirection direction = new frmDirection(cli.BindedRow);
direction.ShowDialog() ;
break;
default: return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Добавляем нового клиента со страницы 'Приемная'
private void AddNewClientWaitingRoom()
{
frmClient f = new frmClient(this.mainDataSet);
DataRow newClientRow = mainDataSet.clients.NewRow();
mainDataSet.clients.Rows.Add(newClientRow);
f.ClientID = (int)newClientRow["clientID"];
f.lblClientID.Text = "Новый клиент";
int groupRowID = dgGroups.CurrentRowIndex;
DataView dvGroups = (DataView)dgGroups.DataSource;
DataRow group = dvGroups[groupRowID].Row;
f.Text += group["groupID"].ToString();
f.GroupID = (int)group["groupID"];
f.MainForm = this;
if (f.ShowDialog() == DialogResult.OK)
{
try
{
// Добавляем данные в табл. clients
newClientRow["fname"] = f.txtFirstName.Text;
newClientRow["lname"] = f.txtLastName.Text;
newClientRow["fathName"] = f.txtFatherName.Text;
newClientRow["linkData"] = f.txtPhones.Text;
newClientRow["recorddate"] = f.dtpRecordDate.Value;
newClientRow["note"] = f.txtNotes.Text;
newClientRow["isRinged"] = false;
// Добавляем данные в табл. Group_Clients
DataRow newGroupClientRow = mainDataSet.group_clients.NewRow();
int clientID = (int)newClientRow["clientID"];
newGroupClientRow["clientID"] = clientID;
newGroupClientRow["groupID"] = (int)group["groupID"];
mainDataSet.group_clients.Rows.Add(newGroupClientRow);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
dgGroups_Click(this.dgGroups, new EventArgs());
}
}
// Устанавливаем размеры окон — используется при изменении размера окон
private void SetWitdhForDataGrids()
{
dgCourses.Size = new Size(this.Width / 4, dgCourses.Size.Height);
panel17.Size = new Size(dgGroups.Width, dgCourses.Height / 2);
panel16.Size = new Size(this.Width / 2, panel16.Height);
}
// Устанавливаем дизайн элементов DataGrid.
private void DesigneDataGrids()
{
try
{
// Дизайн таблицы data
DataGridTableStyle totalTableStyle1 = new DataGridTableStyle();
totalTableStyle1.MappingName = "data";
DataGridTextBoxColumn dataIDStyle1 = new DataGridTextBoxColumn();
dataIDStyle1.MappingName = "dataID";
dataIDStyle1.Width = 50;
dataIDStyle1.HeaderText = "ID";
DataGridTextBoxColumn currentDateStyle1 = new DataGridTextBoxColumn();
currentDateStyle1.MappingName = "currentDate";
currentDateStyle1.Width = 120;
currentDateStyle1.HeaderText = "Текущая дата";
DataGridTextBoxColumn amountYesterdayStyle1 = new DataGridTextBoxColumn();
amountYesterdayStyle1.MappingName = "amountYesterday";
amountYesterdayStyle1.Width = 150;
amountYesterdayStyle1.HeaderText = "Всего вчера";
DataGridTextBoxColumn amountTodayStyle1 = new DataGridTextBoxColumn();
amountTodayStyle1.MappingName = "amountToday";
amountTodayStyle1.Width = 150;
amountTodayStyle1.HeaderText = "Всего Сегодня";
DataGridTextBoxColumn incomeTodayStyle1 = new DataGridTextBoxColumn();
incomeTodayStyle1.MappingName = "incomeToday";
incomeTodayStyle1.Width = 150;
incomeTodayStyle1.HeaderText = "Приход сегодня";
DataGridTextBoxColumn expanseTodayStyle1 = new DataGridTextBoxColumn();
expanseTodayStyle1.MappingName = "expanseToday";
expanseTodayStyle1.Width = 150;
expanseTodayStyle1.HeaderText = "Расход сегодня";
DataGridTextBoxColumn totalNotesStyle1 = new DataGridTextBoxColumn();
totalNotesStyle1.MappingName = "note";
totalNotesStyle1.Width = 300;
totalNotesStyle1.HeaderText = "Заметки";
totalTableStyle1.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dataIDStyle1,
currentDateStyle1,
amountYesterdayStyle1,
amountTodayStyle1,
incomeTodayStyle1,
expanseTodayStyle1,
totalNotesStyle1});
dgMainTable.TableStyles.Add(totalTableStyle1);
// Дизайн dgCourses
DataGridTableStyle coursesTableStyle = new DataGridTableStyle();
coursesTableStyle.MappingName = "course";
DataGridTextBoxColumn courseNameStyle = new DataGridTextBoxColumn();
courseNameStyle.MappingName = "courseName";
courseNameStyle.Width = 225;
courseNameStyle.HeaderText = "Название курса";
DataGridTextBoxColumn coursePriceStyle = new DataGridTextBoxColumn();
coursePriceStyle.MappingName = "priceNumber";
coursePriceStyle.Width = 100;
coursePriceStyle.Format = "#.0";
coursePriceStyle.HeaderText = "Цена курса";
coursesTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
courseNameStyle,
coursePriceStyle});
dgCourses.TableStyles.Add(coursesTableStyle);
// Дизайн dgGroups
DataGridTableStyle groupsTableStyle = new DataGridTableStyle();
groupsTableStyle.MappingName = "groups";
DataGridTextBoxColumn groupIDStyle = new DataGridTextBoxColumn();
groupIDStyle.MappingName = "groupID";
groupIDStyle.Width = 50;
groupIDStyle.HeaderText = "Номер";
DataGridTextBoxColumn beginDateStyle = new DataGridTextBoxColumn();
beginDateStyle.MappingName = "beginDate";
beginDateStyle.Width = 110;
beginDateStyle.Format = "dd MMMM yyyy";
beginDateStyle.HeaderText = "Дата начала";
DataGridTextBoxColumn endDateStyle = new DataGridTextBoxColumn();
endDateStyle.MappingName = "endDate";
endDateStyle.Width = 110;
endDateStyle.Format = "dd MMMM yyyy";
endDateStyle.HeaderText = "Дата окончания";
DataGridTextBoxColumn beginTimeStyle = new DataGridTextBoxColumn();
beginTimeStyle.MappingName = "beginTime";
beginTimeStyle.Width = 110;
beginTimeStyle.Format = "HH:mm";
beginTimeStyle.HeaderText = "Время начала";
DataGridTextBoxColumn endTimeStyle = new DataGridTextBoxColumn();
endTimeStyle.MappingName = "endTime";
endTimeStyle.Width = 110;
endTimeStyle.Format = "HH:mm";
endTimeStyle.HeaderText = "Время окончания";
DataGridTextBoxColumn classNumberStyle = new DataGridTextBoxColumn();
classNumberStyle.MappingName = "classNumber";
classNumberStyle.Width = 110;
classNumberStyle.HeaderText = "Номер класса";
groupsTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
beginTimeStyle,
endTimeStyle,
classNumberStyle,
beginDateStyle,
endDateStyle,
groupIDStyle});
dgGroups.TableStyles.Add(groupsTableStyle);
// Дизайн dgClients
DataGridTableStyle clientsTableStyle = new DataGridTableStyle();
clientsTableStyle.MappingName = "clients";
DataGridTextBoxColumn clientIDStyle = new DataGridTextBoxColumn();
clientIDStyle.MappingName = "clientID";
clientIDStyle.ReadOnly = true;
clientIDStyle.Width = 50;
clientIDStyle.HeaderText = "Номер";
DataGridTextBoxColumn firstNameStyle = new DataGridTextBoxColumn();
firstNameStyle.MappingName = "fname";
firstNameStyle.Width = 130;
firstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn lastNameStyle = new DataGridTextBoxColumn();
lastNameStyle.MappingName = "lname";
lastNameStyle.Width = 130;
lastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn fatherNameStyle = new DataGridTextBoxColumn();
fatherNameStyle.MappingName = "fathName";
fatherNameStyle.Width = 130;
fatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn clientPhoneStyle = new DataGridTextBoxColumn();
clientPhoneStyle.MappingName = "linkData";
clientPhoneStyle.Width = 200;
clientPhoneStyle.HeaderText = "Контакты";
DataGridBoolColumn clientIsRingedStyle = new DataGridBoolColumn();
clientIsRingedStyle.MappingName = "isRinged";
clientIsRingedStyle.Width = 100;
clientIsRingedStyle.AllowNull = false;
clientIsRingedStyle.HeaderText = "Дозвонились";
clientsTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
clientIDStyle,
lastNameStyle,
firstNameStyle,
fatherNameStyle,
clientPhoneStyle,
clientIsRingedStyle});
dgClients.TableStyles.Add(clientsTableStyle);
// Дизайн dgIncome
DataGridTableStyle incomeTableStyle = new DataGridTableStyle();
incomeTableStyle.MappingName = "income";
DataGridTextBoxColumn incomeClientIDStyle = new DataGridTextBoxColumn();
incomeClientIDStyle.MappingName = "clientID";
incomeClientIDStyle.Width = 45;
incomeClientIDStyle.HeaderText = "ID клиента";
incomeClientIDStyle.Alignment = HorizontalAlignment.Center;
DataGridTextBoxColumn incomeSummaStyle = new DataGridTextBoxColumn();
incomeSummaStyle.MappingName = "summa";
incomeSummaStyle.Width = 100;
incomeSummaStyle.Format = "#.0";
incomeSummaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn incomePaymentTypeIDStyle = new DataGridTextBoxColumn();
incomePaymentTypeIDStyle.MappingName = "payment_typeID";
incomePaymentTypeIDStyle.Width = 45;
incomePaymentTypeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn incomeNoteStyle = new DataGridTextBoxColumn();
incomeNoteStyle.MappingName = "note";
incomeNoteStyle.Width = 300;
incomeNoteStyle.HeaderText = "Заметки";
DataGridBoolColumn realizedStyle = new DataGridBoolColumn();
realizedStyle.MappingName = "IsRealized";
realizedStyle.Width = 100;
realizedStyle.HeaderText = "Реализовано";
DataGridTextBoxColumn incomeDataIDStyle = new DataGridTextBoxColumn();
incomeDataIDStyle.MappingName = "dataID";
incomeDataIDStyle.Width = 45;
incomeDataIDStyle.HeaderText = "ID data";
incomeDataIDStyle.Alignment = HorizontalAlignment.Center;
incomeTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
incomeSummaStyle,
incomePaymentTypeIDStyle,
incomeNoteStyle,
incomeClientIDStyle,
incomeDataIDStyle});
incomeTableStyle.HeaderBackColor = dgIncome.HeaderBackColor;
incomeTableStyle.BackColor = dgIncome.BackColor;
incomeTableStyle.ForeColor = dgIncome.ForeColor;
incomeTableStyle.GridLineColor = dgIncome.GridLineColor;
incomeTableStyle.HeaderForeColor = dgIncome.HeaderForeColor;
incomeTableStyle.SelectionBackColor = dgIncome.SelectionBackColor;
incomeTableStyle.SelectionForeColor = dgIncome.SelectionForeColor;
dgIncome.TableStyles.Add(incomeTableStyle);
// Дизайн dgOut
DataGridTableStyle expensesTableStyle = new DataGridTableStyle();
expensesTableStyle.MappingName = "expenses";
DataGridTextBoxColumn expensesClientIDStyle = new DataGridTextBoxColumn();
expensesClientIDStyle.MappingName = "clientID";
expensesClientIDStyle.Width = 45;
expensesClientIDStyle.HeaderText = "ID клиента";
DataGridTextBoxColumn expensesEmployeeIDStyle = new DataGridTextBoxColumn();
expensesEmployeeIDStyle.MappingName = "employeeID";
expensesEmployeeIDStyle.Width = 45;
expensesEmployeeIDStyle.HeaderText = "ID сотрудника";
DataGridTextBoxColumn expensesSummaStyle = new DataGridTextBoxColumn();
expensesSummaStyle.MappingName = "summa";
expensesSummaStyle.Width = 100;
expensesSummaStyle.Format = "#.0";
expensesSummaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn expensesPaymentTypeIDStyle = new DataGridTextBoxColumn();
expensesPaymentTypeIDStyle.MappingName = "payment_typeID";
expensesPaymentTypeIDStyle.Width = 45;
expensesPaymentTypeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn expensesNoteStyle = new DataGridTextBoxColumn();
expensesNoteStyle.MappingName = "note";
expensesNoteStyle.Width = 300;
expensesNoteStyle.HeaderText = "Заметки";
expensesTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
expensesSummaStyle,
expensesPaymentTypeIDStyle,
expensesNoteStyle,
expensesClientIDStyle,
expensesEmployeeIDStyle});
expensesTableStyle.HeaderBackColor = dgOut.HeaderBackColor;
expensesTableStyle.BackColor = dgOut.BackColor;
expensesTableStyle.ForeColor = dgOut.ForeColor;
expensesTableStyle.GridLineColor = dgOut.GridLineColor;
expensesTableStyle.HeaderForeColor = dgOut.HeaderForeColor;
expensesTableStyle.SelectionBackColor = dgOut.SelectionBackColor;
expensesTableStyle.SelectionForeColor = dgOut.SelectionForeColor;
dgOut.TableStyles.Add(expensesTableStyle);
// Дизайн dgWorkTable
// Стиль таблицы directions на странице "Основные таблицы"
DataGridTableStyle directionsTableStyle = new DataGridTableStyle();
directionsTableStyle.MappingName = "directions";
DataGridTextBoxColumn directionIDStyle = new DataGridTextBoxColumn();
directionIDStyle.MappingName = "directionID";
directionIDStyle.Width = 100;
directionIDStyle.HeaderText = "Номер направления";
DataGridTextBoxColumn directionNameStyle = new DataGridTextBoxColumn();
directionNameStyle.MappingName = "directName";
directionNameStyle.Width = 100;
directionNameStyle.HeaderText = "Наименование";
DataGridTextBoxColumn directionNotesStyle = new DataGridTextBoxColumn();
directionNotesStyle.MappingName = "note";
directionNotesStyle.Width = 100;
directionNotesStyle.HeaderText = "Заметки";
directionsTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
directionIDStyle,
directionNameStyle,
directionNotesStyle});
dgWorkTable.TableStyles.Add(directionsTableStyle);
// Стиль таблицы course на странице "Основные таблицы"
DataGridTableStyle dgWorkTableСoursesTableStyle = new DataGridTableStyle();
dgWorkTableСoursesTableStyle.MappingName = "course";
DataGridTextBoxColumn dgWorkTableСourseNameStyle = new DataGridTextBoxColumn();
dgWorkTableСourseNameStyle.MappingName = "courseName";
dgWorkTableСourseNameStyle.Width = 150;
dgWorkTableСourseNameStyle.HeaderText = "Название курса";
DataGridTextBoxColumn dgWorkTableСoursePriceStyle = new DataGridTextBoxColumn();
dgWorkTableСoursePriceStyle.MappingName = "priceNumber";
dgWorkTableСoursePriceStyle.Width = 100;
dgWorkTableСoursePriceStyle.Format = "#.0";
dgWorkTableСoursePriceStyle.HeaderText = "Цена курса";
DataGridTextBoxColumn dgWorkTableDirectionIDStyle = new DataGridTextBoxColumn();
dgWorkTableDirectionIDStyle.MappingName = "directionID";
dgWorkTableDirectionIDStyle.Width = 50;
dgWorkTableDirectionIDStyle.HeaderText = "Номер направления";
DataGridTextBoxColumn dgWorkTableNoteStyle = new DataGridTextBoxColumn();
dgWorkTableNoteStyle.MappingName = "note";
dgWorkTableNoteStyle.Width = 150;
dgWorkTableNoteStyle.HeaderText = "Заметки";
dgWorkTableСoursesTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableСourseNameStyle,
dgWorkTableСoursePriceStyle,
dgWorkTableDirectionIDStyle,
dgWorkTableNoteStyle});
dgWorkTable.TableStyles.Add(dgWorkTableСoursesTableStyle);
// Стиль таблицы data на странице "Основные таблицы"
DataGridTableStyle totalTableStyle = new DataGridTableStyle();
totalTableStyle.MappingName = "data";
DataGridTextBoxColumn totalIDStyle = new DataGridTextBoxColumn();
totalIDStyle.MappingName = "directionID";
totalIDStyle.Width = 100;
totalIDStyle.HeaderText = "Номер";
DataGridTextBoxColumn currentDateStyle = new DataGridTextBoxColumn();
currentDateStyle.MappingName = "currentDate";
currentDateStyle.Width = 100;
currentDateStyle.Format = "dd MMMM yyyy";
currentDateStyle.HeaderText = "Текущая дата";
DataGridTextBoxColumn amountYesterdayStyle = new DataGridTextBoxColumn();
amountYesterdayStyle.MappingName = "amountYesterday";
amountYesterdayStyle.Width = 100;
amountYesterdayStyle.HeaderText = "Всего вчера";
DataGridTextBoxColumn amountTodayStyle = new DataGridTextBoxColumn();
amountTodayStyle.MappingName = "amountToday";
amountTodayStyle.Width = 100;
amountTodayStyle.HeaderText = "Всего cегодня";
DataGridTextBoxColumn incomeTodayStyle = new DataGridTextBoxColumn();
incomeTodayStyle.MappingName = "incomeToday";
incomeTodayStyle.Width = 100;
incomeTodayStyle.HeaderText = "Приход сегодня";
DataGridTextBoxColumn expanseTodayStyle = new DataGridTextBoxColumn();
expanseTodayStyle.MappingName = "expanseToday";
expanseTodayStyle.Width = 100;
expanseTodayStyle.HeaderText = "Расход сегодня";
DataGridTextBoxColumn totalNoteStyle = new DataGridTextBoxColumn();
totalNoteStyle.MappingName = "note";
totalNoteStyle.Width = 100;
totalNoteStyle.HeaderText = "Заметки";
totalTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
totalIDStyle,
currentDateStyle,
amountYesterdayStyle,
amountTodayStyle,
incomeTodayStyle,
expanseTodayStyle,
totalNoteStyle});
dgWorkTable.TableStyles.Add(totalTableStyle);
// Стиль таблицы groups на странице "Основные таблицы"
DataGridTableStyle dgWorkTableGroupsTableStyle = new DataGridTableStyle();
dgWorkTableGroupsTableStyle.MappingName = "groups";
DataGridTextBoxColumn dgWorkTableGroupIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupIDStyle.MappingName = "groupID";
dgWorkTableGroupIDStyle.Width = 100;
dgWorkTableGroupIDStyle.HeaderText = "Номер группы";
DataGridTextBoxColumn dgWorkTableBeginDateStyle = new DataGridTextBoxColumn();
dgWorkTableBeginDateStyle.MappingName = "beginDate";
dgWorkTableBeginDateStyle.Width = 100;
dgWorkTableBeginDateStyle.Format = "dd MMMM yyyy";
dgWorkTableBeginDateStyle.HeaderText = "Дата начала";
DataGridTextBoxColumn dgWorkTableEndDateStyle = new DataGridTextBoxColumn();
dgWorkTableEndDateStyle.MappingName = "endDate";
dgWorkTableEndDateStyle.Width = 100;
dgWorkTableEndDateStyle.Format = "dd MMMM yyyy";
dgWorkTableEndDateStyle.HeaderText = "Дата окончания";
DataGridTextBoxColumn dgWorkTableBeginTimeStyle = new DataGridTextBoxColumn();
dgWorkTableBeginTimeStyle.MappingName = "beginTime";
dgWorkTableBeginTimeStyle.Width = 100;
dgWorkTableBeginTimeStyle.Format = "HH:mm";
dgWorkTableBeginTimeStyle.HeaderText = "Время начала";
DataGridTextBoxColumn dgWorkTableEndTimeStyle = new DataGridTextBoxColumn();
dgWorkTableEndTimeStyle.MappingName = "endTime";
dgWorkTableEndTimeStyle.Width = 100;
dgWorkTableEndTimeStyle.Format = "HH:mm";
dgWorkTableEndTimeStyle.HeaderText = "Время окончания";
DataGridTextBoxColumn dgWorkTableClassNumberStyle = new DataGridTextBoxColumn();
dgWorkTableClassNumberStyle.MappingName = "classNumber";
dgWorkTableClassNumberStyle.Width = 100;
dgWorkTableClassNumberStyle.HeaderText = "Номер класса";
DataGridTextBoxColumn dgWorkTableCourseIDStyle = new DataGridTextBoxColumn();
dgWorkTableCourseIDStyle.MappingName = "courseID";
dgWorkTableCourseIDStyle.Width = 100;
dgWorkTableCourseIDStyle.HeaderText = "Номер курса";
DataGridTextBoxColumn dgWorkTableEmployeeIDStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeeIDStyle.MappingName = "employeeID";
dgWorkTableEmployeeIDStyle.Width = 100;
dgWorkTableEmployeeIDStyle.HeaderText = "Номер сотрудника";
DataGridTextBoxColumn dgWorkTableGroupNoteStyle = new DataGridTextBoxColumn();
dgWorkTableGroupNoteStyle.MappingName = "note";
dgWorkTableGroupNoteStyle.Width = 100;
dgWorkTableGroupNoteStyle.HeaderText = "Заметки";
DataGridTextBoxColumn dgWorkTableStatusIDStyle = new DataGridTextBoxColumn();
dgWorkTableStatusIDStyle.MappingName = "StatusID";
dgWorkTableStatusIDStyle.Width = 100;
dgWorkTableStatusIDStyle.HeaderText = "Номер статуса группы";
dgWorkTableGroupsTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableGroupIDStyle,
dgWorkTableClassNumberStyle,
dgWorkTableBeginDateStyle,
dgWorkTableEndDateStyle,
dgWorkTableBeginTimeStyle,
dgWorkTableEndTimeStyle,
dgWorkTableCourseIDStyle,
dgWorkTableEmployeeIDStyle,
dgWorkTableGroupNoteStyle,
dgWorkTableStatusIDStyle
});
dgWorkTable.TableStyles.Add(dgWorkTableGroupsTableStyle);
// Стиль таблицы clients на странице "Основные таблицы"
DataGridTableStyle dgWorkTableСlientsTableStyle = new DataGridTableStyle();
dgWorkTableСlientsTableStyle.MappingName = "clients";
DataGridTextBoxColumn dgWorkTableClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableClientIDStyle.MappingName = "clientID";
dgWorkTableClientIDStyle.Width = 100;
dgWorkTableClientIDStyle.HeaderText = "Номер клиента";
DataGridTextBoxColumn dgWorkTableFirstNameStyle = new DataGridTextBoxColumn();
dgWorkTableFirstNameStyle.MappingName = "fname";
dgWorkTableFirstNameStyle.Width = 100;
dgWorkTableFirstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn dgWorkTableLastNameStyle = new DataGridTextBoxColumn();
dgWorkTableLastNameStyle.MappingName = "lname";
dgWorkTableLastNameStyle.Width = 100;
dgWorkTableLastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn dgWorkTableFatherNameStyle = new DataGridTextBoxColumn();
dgWorkTableFatherNameStyle.MappingName = "fathName";
dgWorkTableFatherNameStyle.Width = 100;
dgWorkTableFatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn dgWorkTableLinkDataStyle = new DataGridTextBoxColumn();
dgWorkTableLinkDataStyle.MappingName = "linkData";
dgWorkTableLinkDataStyle.Width = 100;
dgWorkTableLinkDataStyle.HeaderText = "Контакты";
DataGridTextBoxColumn dgWorkTableRecordDateStyle = new DataGridTextBoxColumn();
dgWorkTableRecordDateStyle.MappingName = "recorddate";
dgWorkTableRecordDateStyle.Width = 100;
dgWorkTableRecordDateStyle.Format = "dd-MMMM-yyyy";
dgWorkTableRecordDateStyle.HeaderText = "Дата записи";
DataGridTextBoxColumn dgWorkTableClientNoteStyle = new DataGridTextBoxColumn();
dgWorkTableClientNoteStyle.MappingName = "note";
dgWorkTableClientNoteStyle.Width = 100;
dgWorkTableClientNoteStyle.HeaderText = "Заметки";
DataGridTextBoxColumn dgWorkTablePaymentTypeStyle = new DataGridTextBoxColumn();
dgWorkTablePaymentTypeStyle.MappingName = "paymentType";
dgWorkTablePaymentTypeStyle.Width = 100;
dgWorkTablePaymentTypeStyle.HeaderText = "Тип оплаты";
dgWorkTableСlientsTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableClientIDStyle,
dgWorkTableLastNameStyle,
dgWorkTableFirstNameStyle,
dgWorkTableFatherNameStyle,
dgWorkTableLinkDataStyle,
dgWorkTableRecordDateStyle,
dgWorkTableClientNoteStyle,
dgWorkTablePaymentTypeStyle});
dgWorkTable.TableStyles.Add(dgWorkTableСlientsTableStyle);
// Стиль таблицы income на странице "Основные таблицы"
DataGridTableStyle dgWorkTableIncomeTableStyle = new DataGridTableStyle();
dgWorkTableIncomeTableStyle.MappingName = "income";
DataGridTextBoxColumn dgWorkTableIncomeIDStyle = new DataGridTextBoxColumn();
dgWorkTableIncomeIDStyle.MappingName = "incomeID";
dgWorkTableIncomeIDStyle.Width = 100;
dgWorkTableIncomeIDStyle.HeaderText = "ID прихода";
DataGridTextBoxColumn dgWorkTableIncomeClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableIncomeClientIDStyle.MappingName = "clientID";
dgWorkTableIncomeClientIDStyle.Width = 100;
dgWorkTableIncomeClientIDStyle.HeaderText = "ID клиента";
DataGridTextBoxColumn dgWorkTableIncomeSummaStyle = new DataGridTextBoxColumn();
dgWorkTableIncomeSummaStyle.MappingName = "summa";
dgWorkTableIncomeSummaStyle.Width = 100;
dgWorkTableIncomeSummaStyle.Format = "#.0";
dgWorkTableIncomeSummaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn dgWorkTableIncomePaymentTypeIDStyle = new DataGridTextBoxColumn();
dgWorkTableIncomePaymentTypeIDStyle.MappingName = "payment_typeID";
dgWorkTableIncomePaymentTypeIDStyle.Width = 100;
dgWorkTableIncomePaymentTypeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn dgWorkTableIncomeNoteStyle = new DataGridTextBoxColumn();
dgWorkTableIncomeNoteStyle.MappingName = "note";
dgWorkTableIncomeNoteStyle.Width = 100;
dgWorkTableIncomeNoteStyle.HeaderText = "Заметки";
DataGridBoolColumn dgWorkTableRealizedStyle = new DataGridBoolColumn();
dgWorkTableRealizedStyle.MappingName = "IsRealized";
dgWorkTableRealizedStyle.Width = 100;
dgWorkTableRealizedStyle.HeaderText = "Реализовано";
DataGridTextBoxColumn dgWorkTableDataIDStyle = new DataGridTextBoxColumn();
dgWorkTableDataIDStyle.MappingName = "dataID";
dgWorkTableDataIDStyle.Width = 100;
dgWorkTableDataIDStyle.HeaderText = "ID data";
dgWorkTableIncomeTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
dgWorkTableIncomeIDStyle,
dgWorkTableIncomeClientIDStyle,
dgWorkTableIncomeSummaStyle,
dgWorkTableIncomePaymentTypeIDStyle,
dgWorkTableIncomeNoteStyle,
dgWorkTableRealizedStyle,
dgWorkTableDataIDStyle});
dgWorkTableIncomeTableStyle.HeaderBackColor = dgWorkTable.HeaderBackColor;
dgWorkTableIncomeTableStyle.BackColor = dgWorkTable.BackColor;
dgWorkTableIncomeTableStyle.ForeColor = dgWorkTable.ForeColor;
dgWorkTableIncomeTableStyle.GridLineColor = dgWorkTable.GridLineColor;
dgWorkTableIncomeTableStyle.HeaderForeColor = dgWorkTable.HeaderForeColor;
dgWorkTableIncomeTableStyle.SelectionBackColor = dgWorkTable.SelectionBackColor;
dgWorkTableIncomeTableStyle.SelectionForeColor = dgWorkTable.SelectionForeColor;
dgWorkTable.TableStyles.Add(dgWorkTableIncomeTableStyle);
// Стиль таблицы expenses на странице "Основные таблицы"
DataGridTableStyle dgWorkTableExpensesTableStyle = new DataGridTableStyle();
dgWorkTableExpensesTableStyle.MappingName = "expenses";
DataGridTextBoxColumn dgWorkTableExpensesExpenseIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesExpenseIDStyle.MappingName = "expenseID";
dgWorkTableExpensesExpenseIDStyle.Width = 100;
dgWorkTableExpensesExpenseIDStyle.HeaderText = "ID расхода";
DataGridTextBoxColumn dgWorkTableExpensesDataIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesDataIDStyle.MappingName = "dataID";
dgWorkTableExpensesDataIDStyle.Width = 100;
dgWorkTableExpensesDataIDStyle.HeaderText = "ID data";
DataGridTextBoxColumn dgWorkTableExpensesClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesClientIDStyle.MappingName = "clientID";
dgWorkTableExpensesClientIDStyle.Width = 100;
dgWorkTableExpensesClientIDStyle.HeaderText = "ID клиента";
DataGridTextBoxColumn dgWorkTableExpensesEmployeeIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesEmployeeIDStyle.MappingName = "employeeID";
dgWorkTableExpensesEmployeeIDStyle.Width = 100;
dgWorkTableExpensesEmployeeIDStyle.HeaderText = "ID сотрудника";
DataGridTextBoxColumn dgWorkTableExpensesSummaStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesSummaStyle.MappingName = "summa";
dgWorkTableExpensesSummaStyle.Width = 100;
dgWorkTableExpensesSummaStyle.Format = "#.0";
dgWorkTableExpensesSummaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn dgWorkTableExpensesPaymentTypeIDStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesPaymentTypeIDStyle.MappingName = "payment_typeID";
dgWorkTableExpensesPaymentTypeIDStyle.Width = 100;
dgWorkTableExpensesPaymentTypeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn dgWorkTableExpensesNoteStyle = new DataGridTextBoxColumn();
dgWorkTableExpensesNoteStyle.MappingName = "note";
dgWorkTableExpensesNoteStyle.Width = 100;
dgWorkTableExpensesNoteStyle.HeaderText = "Заметки";
dgWorkTableExpensesTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
dgWorkTableExpensesExpenseIDStyle,
dgWorkTableExpensesDataIDStyle,
dgWorkTableExpensesClientIDStyle,
dgWorkTableExpensesEmployeeIDStyle,
dgWorkTableExpensesSummaStyle,
dgWorkTableExpensesPaymentTypeIDStyle,
dgWorkTableExpensesNoteStyle});
dgWorkTableExpensesTableStyle.HeaderBackColor = dgWorkTable.HeaderBackColor;
dgWorkTableExpensesTableStyle.BackColor = dgWorkTable.BackColor;
dgWorkTableExpensesTableStyle.ForeColor = dgWorkTable.ForeColor;
dgWorkTableExpensesTableStyle.GridLineColor = dgWorkTable.GridLineColor;
dgWorkTableExpensesTableStyle.HeaderForeColor = dgWorkTable.HeaderForeColor;
dgWorkTableExpensesTableStyle.SelectionBackColor = dgWorkTable.SelectionBackColor;
dgWorkTableExpensesTableStyle.SelectionForeColor = dgWorkTable.SelectionForeColor;
dgWorkTable.TableStyles.Add(dgWorkTableExpensesTableStyle);
// Стиль таблицы employees на странице "Основные таблицы"
DataGridTableStyle dgWorkTableEmployeesTableStyle = new DataGridTableStyle();
dgWorkTableEmployeesTableStyle.MappingName = "employees";
DataGridTextBoxColumn dgWorkTableEmployeesEmployeeIDStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesEmployeeIDStyle.MappingName = "employeeID";
dgWorkTableEmployeesEmployeeIDStyle.Width = 100;
dgWorkTableEmployeesEmployeeIDStyle.HeaderText = "Номер сотрудника";
DataGridTextBoxColumn dgWorkTableEmployeesFirstNameStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesFirstNameStyle.MappingName = "FirstName";
dgWorkTableEmployeesFirstNameStyle.Width = 100;
dgWorkTableEmployeesFirstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn dgWorkTableEmployeesLastNameStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesLastNameStyle.MappingName = "LastName";
dgWorkTableEmployeesLastNameStyle.Width = 100;
dgWorkTableEmployeesLastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn dgWorkTableEmployeesFatherNameStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesFatherNameStyle.MappingName = "FatherName";
dgWorkTableEmployeesFatherNameStyle.Width = 100;
dgWorkTableEmployeesFatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn dgWorkTableEmployeesLinkDataStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesLinkDataStyle.MappingName = "linkData";
dgWorkTableEmployeesLinkDataStyle.Width = 100;
dgWorkTableEmployeesLinkDataStyle.HeaderText = "Контакты";
DataGridTextBoxColumn dgWorkTableEmployeesBirthdayStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesBirthdayStyle.MappingName = "birthday";
dgWorkTableEmployeesBirthdayStyle.Width = 100;
dgWorkTableEmployeesBirthdayStyle.Format = "dd-MMMM-yyyy";
dgWorkTableEmployeesBirthdayStyle.HeaderText = "День рождения";
DataGridTextBoxColumn dgWorkTableEmployeesDirectionIDStyle = new DataGridTextBoxColumn();
dgWorkTableEmployeesDirectionIDStyle.MappingName = "directionID";
dgWorkTableEmployeesDirectionIDStyle.Width = 100;
dgWorkTableEmployeesDirectionIDStyle.HeaderText = "Номер направления";
dgWorkTableEmployeesTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableEmployeesEmployeeIDStyle,
dgWorkTableEmployeesLastNameStyle,
dgWorkTableEmployeesFirstNameStyle,
dgWorkTableEmployeesFatherNameStyle,
dgWorkTableEmployeesLinkDataStyle,
dgWorkTableEmployeesBirthdayStyle,
dgWorkTableEmployeesDirectionIDStyle});
dgWorkTable.TableStyles.Add(dgWorkTableEmployeesTableStyle);
// Стиль таблицы GroupStatus на странице "Основные таблицы"
DataGridTableStyle dgWorkTableGroupStatusTableStyle = new DataGridTableStyle();
dgWorkTableGroupStatusTableStyle.MappingName = "GroupStatus";
DataGridTextBoxColumn dgWorkTableGroupStatusStatusIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupStatusStatusIDStyle.MappingName = "StatusID";
dgWorkTableGroupStatusStatusIDStyle.Width = 100;
dgWorkTableGroupStatusStatusIDStyle.HeaderText = "Номер статуса";
DataGridTextBoxColumn dgWorkTableStatusNameStyle = new DataGridTextBoxColumn();
dgWorkTableStatusNameStyle.MappingName = "StatusName";
dgWorkTableStatusNameStyle.Width = 100;
dgWorkTableStatusNameStyle.HeaderText = "Имя";
dgWorkTableGroupStatusTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableGroupStatusStatusIDStyle,
dgWorkTableStatusNameStyle});
dgWorkTable.TableStyles.Add(dgWorkTableGroupStatusTableStyle);
// Стиль таблицы payment_type на странице "Основные таблицы"
DataGridTableStyle dgWorkTablePaymentTypeTableStyle = new DataGridTableStyle();
dgWorkTablePaymentTypeTableStyle.MappingName = "payment_type";
DataGridTextBoxColumn dgWorkTablePaymentTypeIDStyle = new DataGridTextBoxColumn();
dgWorkTablePaymentTypeIDStyle.MappingName = "payment_typeID";
dgWorkTablePaymentTypeIDStyle.Width = 100;
dgWorkTablePaymentTypeIDStyle.HeaderText = "Номер вида оплаты";
DataGridTextBoxColumn dgWorkTablePaymentTypeNameStyle = new DataGridTextBoxColumn();
dgWorkTablePaymentTypeNameStyle.MappingName = "payment_typeName";
dgWorkTablePaymentTypeNameStyle.Width = 100;
dgWorkTablePaymentTypeNameStyle.HeaderText = "Наименование оплаты";
DataGridTextBoxColumn dgWorkTablePaymentNotesStyle = new DataGridTextBoxColumn();
dgWorkTablePaymentNotesStyle.MappingName = "note";
dgWorkTablePaymentNotesStyle.Width = 100;
dgWorkTablePaymentNotesStyle.HeaderText = "Заметки";
dgWorkTablePaymentTypeTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTablePaymentTypeIDStyle,
dgWorkTablePaymentTypeNameStyle,
dgWorkTablePaymentNotesStyle});
dgWorkTable.TableStyles.Add(dgWorkTablePaymentTypeTableStyle);
// Стиль таблицы RealizedTable на странице "Основные таблицы"
DataGridTableStyle dgWorkTableRealizedTableStyle = new DataGridTableStyle();
dgWorkTableRealizedTableStyle.MappingName = "RealizedTable";
DataGridTextBoxColumn dgWorkTableRealizedTableIDStyle = new DataGridTextBoxColumn();
dgWorkTableRealizedTableIDStyle.MappingName = "ID";
dgWorkTableRealizedTableIDStyle.Width = 100;
dgWorkTableRealizedTableIDStyle.HeaderText = "Номер реализации";
DataGridTextBoxColumn dgWorkTableRealizedSummStyle = new DataGridTextBoxColumn();
dgWorkTableRealizedSummStyle.MappingName = "realizedSumm";
dgWorkTableRealizedSummStyle.Width = 100;
dgWorkTableRealizedSummStyle.HeaderText = "Реализованная сумма";
DataGridTextBoxColumn dgWorkTableRealizingDateStyle = new DataGridTextBoxColumn();
dgWorkTableRealizingDateStyle.MappingName = "realizingDate";
dgWorkTableRealizingDateStyle.Width = 100;
dgWorkTableRealizingDateStyle.Format = "dd-MMMM-yyyy";
dgWorkTableRealizingDateStyle.HeaderText = "Дата реализации";
DataGridTextBoxColumn dgWorkTableRealizedTableNotesStyle = new DataGridTextBoxColumn();
dgWorkTableRealizedTableNotesStyle.MappingName = "note";
dgWorkTableRealizedTableNotesStyle.Width = 100;
dgWorkTableRealizedTableNotesStyle.HeaderText = "Заметки";
DataGridTextBoxColumn dgWorkTableRealizedTableClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableRealizedTableClientIDStyle.MappingName = "clientID";
dgWorkTableRealizedTableClientIDStyle.Width = 100;
dgWorkTableRealizedTableClientIDStyle.HeaderText = "Номер клиента";
dgWorkTableRealizedTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
dgWorkTableRealizedTableIDStyle,
dgWorkTableRealizedSummStyle,
dgWorkTableRealizingDateStyle,
dgWorkTableRealizedTableNotesStyle,
dgWorkTableRealizedTableClientIDStyle});
dgWorkTable.TableStyles.Add(dgWorkTableRealizedTableStyle);
// Стиль таблицы group_clients на странице "Основные таблицы"
DataGridTableStyle dgWorkTableGroupClientsStyle = new DataGridTableStyle();
dgWorkTableGroupClientsStyle.MappingName = "group_clients";
DataGridTextBoxColumn dgWorkTableGroupClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupClientIDStyle.MappingName = "GroupClientID";
dgWorkTableGroupClientIDStyle.Width = 100;
dgWorkTableGroupClientIDStyle.HeaderText = "ID";
DataGridTextBoxColumn dgWorkTableGroupClientsGroupIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupClientsGroupIDStyle.MappingName = "groupID";
dgWorkTableGroupClientsGroupIDStyle.Width = 100;
dgWorkTableGroupClientsGroupIDStyle.HeaderText = "Номер группы";
DataGridTextBoxColumn dgWorkTableGroupClientsClientIDStyle = new DataGridTextBoxColumn();
dgWorkTableGroupClientsClientIDStyle.MappingName = "clientID";
dgWorkTableGroupClientsClientIDStyle.Width = 100;
dgWorkTableGroupClientsClientIDStyle.HeaderText = "Номер клиента";
DataGridBoolColumn dgWorkTableGroupClientsIsPaidStyle = new DataGridBoolColumn();
dgWorkTableGroupClientsIsPaidStyle.MappingName = "IsPaid";
dgWorkTableGroupClientsIsPaidStyle.Width = 50;
dgWorkTableGroupClientsIsPaidStyle.HeaderText = "Оплачено";
DataGridTextBoxColumn dgWorkTableGroupClientsNotesStyle = new DataGridTextBoxColumn();
dgWorkTableGroupClientsNotesStyle.MappingName = "Notes";
dgWorkTableGroupClientsNotesStyle.Width = 100;
dgWorkTableGroupClientsNotesStyle.HeaderText = "Заметки";
dgWorkTableGroupClientsStyle.GridColumnStyles.AddRange( new DataGridColumnStyle[] {
dgWorkTableGroupClientIDStyle,
dgWorkTableGroupClientsGroupIDStyle,
dgWorkTableGroupClientsClientIDStyle,
dgWorkTableGroupClientsIsPaidStyle,
dgWorkTableGroupClientsNotesStyle});
dgWorkTable.TableStyles.Add(dgWorkTableGroupClientsStyle);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Сумма прихода клиента
private double ClientIncomeSumm(int clientID)
{
DataView dvIncome = new DataView(mainDataSet.income);
dvIncome.RowFilter = "clientID = " + clientID.ToString();
double clientIncomeSumm = 0;
foreach (DataRowView drvIncomeClient in dvIncome)
{
if (drvIncomeClient.Row["summa"] != null)
clientIncomeSumm += (double)drvIncomeClient.Row["summa"];
}
return clientIncomeSumm;
}
// Реализованная сумма клиента
private double ClientRealizedSumm(int clientID)
{
DataView dvRealized = new DataView(mainDataSet.RealizedTable);
dvRealized.RowFilter = "clientID = " + clientID.ToString();
double clientRealizedSumm = 0;
foreach (DataRowView drvRealized in dvRealized)
{
clientRealizedSumm += (double)drvRealized.Row["realizedSumm"];
}
return clientRealizedSumm;
}
// Вычисление должников — метод нужен для страницы 'Статистика'
private void GetOweStatistic()
{
try
{
int directionID = cmbFilteringDirection.SelectedIndex + 1;
DataView dvCourses = new DataView(mainDataSet.course);
dvCourses.RowFilter = "directionID = " + directionID.ToString();
double summOweEdCenter = 0;
double summOweToEdCenter = 0;
foreach (DataRowView drvCourse in dvCourses)
{
DataRow course = drvCourse.Row;
DataRow[] groups = course.GetChildRows("coursegroups");
foreach (DataRow group in groups)
{
DataRow[] groupclients = group.GetChildRows("groupsgroup_clients");
foreach (DataRow groupclient in groupclients)
{
DataRow client = groupclient.GetParentRow("clientsgroup_clients");
int clientID = (int)client["clientID"];
double clientIncomeSumm = ClientIncomeSumm(clientID);
double clientRealizedSumm = ClientRealizedSumm(clientID);
// Ищем должников учебного центра
double balance = clientRealizedSumm - clientIncomeSumm;
if (balance > 0)
summOweToEdCenter += balance;
// Должен учебный центр
else if (balance < 0)
summOweEdCenter += balance;
}
}
}
txtEdCenterOwe.Text = summOweEdCenter.ToString("C");
txtOweToEdCenter.Text = summOweToEdCenter.ToString("C");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Удаление временных контролов поиска со страницы 'Приемная'
private void RemoveTempFindControl()
{
try
{
ArrayList tempControls = new ArrayList();
foreach (Control control in this.tcManager.TabPages[2].Controls)
if ((control.Tag != null) (control.Tag.ToString() == "Temp"))
tempControls.Add(control);
foreach (object ob in tempControls)
this.tcManager.TabPages[2].Controls.Remove((Control)ob);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Метод возвращает новую или существующую запись таблицы на вкладке 'Приемная'
private DataRow GetTablesRow(DataTable table, int rowIndex, CurrencyManager currManager)
{
try
{
DataRow row = null;
string tableName = table.TableName;
bool isNew = true;
isNew = (rowIndex != currManager.Position) ? true : false;
if (isNew)
{
row = table.NewRow();
row["dataID"] = DataID;
currManager.Position = rowIndex;
return row;
}
else
{
if (tableName == "income")
{
DataView dvIncome = (DataView)currManagerIncome.List;
row = dvIncome[rowIndex].Row;
}
else if (tableName == "expenses")
{
DataView dvOut = (DataView)currManagerOut.List;
row = dvOut[rowIndex].Row;
}
}
return row;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
return null;
}
}
#endregion
#region Обработчики событий
// Обновление ListView
private void miRefreshListView_Click(object sender, System.EventArgs e)
{
FillListView(treeNodeType, selectedNode);
}
// Отображаем в ListView данные для выделенного элемента в TreeView
private void tvManager_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
try
{
selectedNode = e.Node;
selectedNodeName = e.Node.Text; // Имя выбранного узла
// Заполняем ListView
if (e.Node == MainTreeNode) // Выбрана вершина TreeView
{
this.FillListView(TreeNodeType.Top, e.Node);
SelectingClient = false; // Нельзя выбирать клиентов
this.pnlGroups.Hide();
miNewClient.Enabled = false;
miNewGroup.Enabled = false;
miNewCourse.Enabled = false;
miNewDirection.Enabled = true;
cmiStatus.Enabled = false;
treeNodeType = TreeNodeType.Top;
lvManager.View = View.List;
}
else if (e.Node is DirectionTreeNode) // Выбрано направление
{
this.FillListView(TreeNodeType.Direction, e.Node);
SelectingClient = false; // Нельзя выбирать клиентов
pnlGroups.Hide();
miNewClient.Enabled = false;
miNewGroup.Enabled = false;
miNewCourse.Enabled = true;
miNewDirection.Enabled = false;
cmiStatus.Enabled = false;
treeNodeType = TreeNodeType.Direction;
lvManager.View = View.List;
}
else if (e.Node is CourseTreeNode) // Выбран курс
{
this.FillListView(TreeNodeType.Course, e.Node);
SelectingClient = false; // Нельзя выбирать клиентов
pnlGroups.Show();
miNewClient.Enabled = false;
miNewGroup.Enabled = true;
miNewCourse.Enabled = false;
miNewDirection.Enabled = false;
cmiStatus.Enabled = true;
treeNodeType = TreeNodeType.Course;
lvManager.View = View.Details;
}
else if (e.Node is GroupTreeNode) // Выбрана группа
{
this.FillListView(TreeNodeType.Group, e.Node);
SelectingClient = true; // Можно выбирать клиентов
pnlGroups.Hide();
miNewClient.Enabled = true;
miNewGroup.Enabled = false;
miNewCourse.Enabled = false;
miNewDirection.Enabled = false;
cmiStatus.Enabled = false;
treeNodeType = TreeNodeType.Group;
lvManager.View = View.List;
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void rbClients_CheckedChanged(object sender, System.EventArgs e)
{
RadioButton rb = (RadioButton)sender;
this.InsertToDataGrid(mainDataSet.Tables[(string)rb.Tag]);
}
//-----------------------------------------------------------------------
private void miLargeIcons_Click(object sender, System.EventArgs e)
{
lvManager.View = View.LargeIcon;
miLargeIcons.Checked = true;
miDetails.Checked = false;
miSmallIcon.Checked = false;
miList.Checked = false;
}
//-----------------------------------------------------------------------
private void miDetails_Click(object sender, System.EventArgs e)
{
lvManager.View = View.Details;
miLargeIcons.Checked = false;
miDetails.Checked = true;
miSmallIcon.Checked = false;
miList.Checked = false;
}
//-----------------------------------------------------------------------
private void miSmallIcon_Click(object sender, System.EventArgs e)
{
lvManager.View = View.SmallIcon;
miLargeIcons.Checked = false;
miDetails.Checked = false;
miSmallIcon.Checked = true;
miList.Checked = false;
}
//-----------------------------------------------------------------------
private void miList_Click(object sender, System.EventArgs e)
{
lvManager.View = View.List;
miLargeIcons.Checked = false;
miDetails.Checked = false;
miSmallIcon.Checked = false;
miList.Checked = true;
}
// Добавляем нового клиента
private void miNewClient_Click(object sender, System.EventArgs e)
{
this.AddNewClient();
tvManager_AfterSelect(tvManager, new TreeViewEventArgs(selectedNode));
}
// Добавляем новую группу
private void miNewGroup_Click(object sender, System.EventArgs e)
{
this.AddNewGroup();
tvManager_AfterSelect(tvManager, new TreeViewEventArgs(selectedNode));
}
//-----------------------------------------------------------------------
private void cmiHide_Click(object sender, System.EventArgs e)
{
this.Hide();
}
//-----------------------------------------------------------------------
private void cmiShow_Click(object sender, System.EventArgs e)
{
this.Show();
}
//-----------------------------------------------------------------------
private void cmiExit_Click(object sender, System.EventArgs e)
{
this.Close();
}
//-----------------------------------------------------------------------
private void lvManager_Click(object sender, System.EventArgs e)
{
if (lvManager.SelectedItems.Count != 0)
{
selectedItem = (CustomListItem)lvManager.SelectedItems[0];
lvManager.ForeColor = selectedItem.ForeColor;
miCopy.Enabled = true;
}
}
// Главная панель кнопок
private void tbMain_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)
{
if (e.Button.Equals(tbnFind))
{
this.SearchClient();
}
if (e.Button.Equals(tbnEmployees))
{
this.OpenEmployees();
}
if (e.Button.Equals(tbnRefreshMainDB))
{
this.UpdateMainData();
}
}
//-----------------------------------------------------------------------
private void miExit_Click(object sender, System.EventArgs e)
{
this.Close();
}
//-----------------------------------------------------------------------
private void cmiFilling_Click(object sender, System.EventArgs e)
{
cmiFilling.Checked = true;
cmiStuding.Checked = false;
cmiFinished.Checked = false;
ChangeStatus(lvManager.SelectedItems, StatusType.Filling);
}
//-----------------------------------------------------------------------
private void cmiStuding_Click(object sender, System.EventArgs e)
{
cmiFilling.Checked = false;
cmiStuding.Checked = true;
cmiFinished.Checked = false;
ChangeStatus(lvManager.SelectedItems, StatusType.Learning);
}
//-----------------------------------------------------------------------
private void cmiFinished_Click(object sender, System.EventArgs e)
{
cmiFilling.Checked = false;
cmiStuding.Checked = false;
cmiFinished.Checked = true;
ChangeStatus(lvManager.SelectedItems, StatusType.Finished);
}
//-----------------------------------------------------------------------
private void btnCalculate_Click(object sender, System.EventArgs e)
{
DataRowView drvData = (DataRowView)currManagerTotal.Current;
CalculateTotalPage(drvData.Row);
}
//-----------------------------------------------------------------------
private void lvManager_DoubleClick(object sender, System.EventArgs e)
{
OpenItemInForm(treeNodeType);
}
//-----------------------------------------------------------------------
private void frmManager_Resize(object sender, System.EventArgs e)
{
Form f = (Form)sender;
double x = (double)f.Width / 2;
dgOut.Width = (int)x;
panel3.AutoScroll = true;
int step = panel10.Width / 3;
Point pt1 = new Point(step, splitter3.Location.Y);
splitter3.Location = pt1;
Point pt2 = new Point(2 * step, splitter3.Location.Y);
splitter3.Location = pt2;
this.SetWitdhForDataGrids();
}
//-----------------------------------------------------------------------
private void miNewCourse_Click(object sender, System.EventArgs e)
{
this.AddNewCourse();
tvManager_AfterSelect(tvManager, new TreeViewEventArgs(selectedNode));
}
//-----------------------------------------------------------------------
private void miNewDirection_Click(object sender, System.EventArgs e)
{
this.AddNewDirection();
tvManager_AfterSelect(tvManager, new TreeViewEventArgs(selectedNode));
}
//-----------------------------------------------------------------------
private void dgIncome_DoubleClick(object sender, System.EventArgs e)
{
MessageBox.Show("OK");
}
private void miCopy_Click(object sender, System.EventArgs e)
{
try
{
if (SelectingClient)
{
oldGroupNode = selectedNode;
miPaste.Enabled = true;
miCopy.Enabled = false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void miPaste_Click(object sender, System.EventArgs e)
{
try
{
if(SelectingClient)
{
TransferClients(oldGroupNode, selectedNode);
miPaste.Enabled = false;
miCopy.Enabled = false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Удаление записей
private void miDelete_Click(object sender, System.EventArgs e)
{
try
{
DialogResult dr = MessageBox.Show("Вы действительно желаете удалить запись?",
"Удаление записи", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (dr == DialogResult.OK)
{
foreach (ListViewItem lvi in lvManager.SelectedItems)
{
if (!(selectedNode is GroupTreeNode))
{
CustomListItem item = (CustomListItem)lvi;
selectedNode.Nodes.Remove(selectedNode.Nodes[item.Index]);
item.BindedRow.Delete();
lvManager.Items.Remove(item);
}
else
{
CustomListItem item = (CustomListItem)lvi;
item.BindedRow.Delete();
lvManager.Items.Remove(item);
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void btnUpdateMain_Click(object sender, System.EventArgs e)
{
this.UpdateMainData();
}
//-----------------------------------------------------------------------
private void miContents_Click(object sender, System.EventArgs e)
{
Help.ShowHelp(this, hpManager.HelpNamespace);
}
//-----------------------------------------------------------------------
private void directions_RowDeleted(object sender, DataRowChangeEventArgs e)
{
MessageBox.Show(e.Row[1].ToString() + " is deleted");
}
//-----------------------------------------------------------------------
private void lnkToday_Click(object sender, System.EventArgs e)
{
if (currManagerTotal.Position == mainDataSet.data.Rows.Count - 2)
currManagerTotal.Position += 1;
}
//-----------------------------------------------------------------------
private void btnCreateGroup_Click(object sender, System.EventArgs e)
{
this.AddNewGroupWaitingRoom();
}
//-----------------------------------------------------------------------
private void btnCreateClient_Click(object sender, System.EventArgs e)
{
this.AddNewClientWaitingRoom();
}
//-----------------------------------------------------------------------
private void btnShowGroups_Click(object sender, System.EventArgs e)
{
dgGroups.DataSource = null;
dgClients.DataSource = null;
if (cmbDirections.SelectedIndex >= 0)
{
this.LoadCoursesDataGrid(cmbDirections.SelectedIndex + 1);
}
btnCreateGroup.Enabled = false;
btnCreateClient.Enabled = false;
btnShowGroups.Enabled = false;
btnDeleteClient.Enabled = false;
btnDeleteGroup.Enabled = false;
}
// Показать клиентов
//-----------------------------------------------------------------------
internal void dgGroups_Click(object sender, System.EventArgs e)
{
try
{
if (dgGroups.DataSource != null)
{
DataGrid dg = (DataGrid)sender;
int rowID = dg.CurrentRowIndex;
if (rowID >= 0)
{
DataView dvGroups = (DataView)dg.DataSource;
DataRow group = dvGroups[rowID].Row;
int groupID = (int)group["groupID"];
btnDeleteGroup.Enabled = true;
btnDeleteGroup.Tag = groupID;
DataView dvGroupClients = new DataView(mainDataSet.group_clients);
dvGroupClients.RowFilter = "groupID = " + groupID.ToString();
DataRow[] clients = new DataRow[dvGroupClients.Count];
// Получаем записи клиентов
int i = 0;
foreach (DataRowView drv in dvGroupClients)
clients[i++] = drv.Row.GetParentRow("clientsgroup_clients");
// Помещаем полученные записи в таблицу dtClients
if (clients.Length > 0)
{
DataTable dtClients = clients[0].Table.Clone();
foreach (DataRow client in clients)
dtClients.Rows.Add(client.ItemArray);
dgClients.DataSource = dtClients;
dtClients.RowChanged+=new DataRowChangeEventHandler(dtClients_RowChanged);
cmClientsTable = (CurrencyManager)this.BindingContext[dtClients, null];
}
else
dgClients.DataSource = null;
btnCreateClient.Enabled = true;
btnFindPasteClient.Enabled = true;
}
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Показать группы
private void dgCourses_Click(object sender, System.EventArgs e)
{
DataGrid dg = (DataGrid)sender;
int rowID = dg.CurrentRowIndex;
if (rowID >= 0)
{
DataView dvCourses = (DataView)dg.DataSource;
DataRow course = dvCourses[rowID].Row;
int courseID = (int)course["courseID"];
int statusID = cmbGroupStatus.SelectedIndex + 1;
DataView dvGroups = new DataView(mainDataSet.groups);
dvGroups.RowFilter = "courseID = " + courseID.ToString() + " AND StatusID = " + statusID.ToString();
cmGroupsTable = (CurrencyManager)this.BindingContext[dvGroups, null];
dgGroups.DataSource = dvGroups;
btnCreateGroup.Enabled = true;
btnCreateClient.Enabled = false;
btnFindPasteClient.Enabled = false;
btnDeleteClient.Enabled = false;
btnDeleteGroup.Enabled = false;
dgClients.DataSource = null;
}
}
//-----------------------------------------------------------------------
private void cmiClientPersonData_Click(object sender, System.EventArgs e)
{
try
{
int rowID = dgClients.CurrentRowIndex;
if (rowID >= 0)
{
DataView dvGroups = (DataView)dgGroups.DataSource;
int selectedGroupRowID = (int)dvGroups[dgGroups.CurrentRowIndex].Row["groupID"];
DataRow selectedGroupRow = dvGroups[dgGroups.CurrentRowIndex].Row;
DataTable dtClients = (DataTable)dgClients.DataSource;
DataRow clientRow = dtClients.Rows[rowID];
frmClient client = new frmClient(clientRow, this.mainDataSet);
// Определяем данные по умолчанию на форме клиента
int clientID = (int)clientRow["clientID"];
client.ClientID = clientID;
client.txtFirstName.Text = clientRow["fname"].ToString();
client.txtLastName.Text = clientRow["lname"].ToString();
client.txtFatherName.Text = clientRow["fathName"].ToString();
DataView dvIncome = new DataView(mainDataSet.income);
dvIncome.RowFilter = "clientID = " + clientID.ToString();
client.Text += selectedGroupRowID.ToString();
client.dgPayments.DataSource = dvIncome;
DataView dvRealizedTable = new DataView(mainDataSet.RealizedTable);
dvRealizedTable.RowFilter = "clientID = " + clientID.ToString();
client.dgClientsRealization.DataSource = dvRealizedTable;
client.GroupID = selectedGroupRowID;
client.MainForm = this;
if (client.ShowDialog() == DialogResult.OK)
{
// Обновление оригинальной записи клиента,
// т.к. источником у таблицы клиентов является копия таблицы
MainDataSet.clientsRow originalClientRow = mainDataSet.clients.FindByclientID(clientID);
originalClientRow["fname"] = client.txtFirstName.Text;
originalClientRow["lname"] = client.txtLastName.Text;
originalClientRow["fathName"] = client.txtFatherName.Text;
originalClientRow["linkData"] = client.txtPhones.Text;
originalClientRow["recorddate"] = client.dtpRecordDate.Value;
originalClientRow["note"] = client.txtNotes.Text;
// Обновление копии записи клиента
clientRow["fname"] = client.txtFirstName.Text;
clientRow["lname"] = client.txtLastName.Text;
clientRow["fathName"] = client.txtFatherName.Text;
clientRow["linkData"] = client.txtPhones.Text;
clientRow["recorddate"] = client.dtpRecordDate.Value;
clientRow["note"] = client.txtNotes.Text;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void dgGroups_DoubleClick(object sender, System.EventArgs e)
{
try
{
int selectedGroupRowID = dgGroups.CurrentRowIndex;
if (selectedGroupRowID >= 0)
{
int selectedCourseID = dgCourses.CurrentRowIndex;
DataView dvCourses = (DataView)dgCourses.DataSource;
DataRow selectedCourseRow = dvCourses[selectedCourseID].Row;
DataView dvGroups = (DataView)dgGroups.DataSource;
DataRow selectedGroupRow = dvGroups[selectedGroupRowID].Row;
frmGroup group = new frmGroup(mainDataSet, selectedGroupRow);
group.Text += selectedCourseRow["courseName"].ToString();
if (group.ShowDialog() == DialogResult.OK)
{
dgCourses_Click(dgCourses, new EventArgs());
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void cmbDirections_Validated(object sender, System.EventArgs e)
{
if (cmbDirections.SelectedIndex >= 0 cmbGroupStatus.SelectedIndex >= 0)
btnShowGroups.Enabled = true;
else
btnShowGroups.Enabled = false;
}
//-----------------------------------------------------------------------
private void cmbGroupStatus_Validated(object sender, System.EventArgs e)
{
if (cmbDirections.SelectedIndex >= 0 cmbGroupStatus.SelectedIndex >= 0)
btnShowGroups.Enabled = true;
else
btnShowGroups.Enabled = false;
}
//-----------------------------------------------------------------------
private void frmManager_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
DataSet ds = mainDataSet.GetChanges();
if (ds != null)
if (MessageBox.Show("Были произведены изменения в таблицах.\nВы желаете обновить данные в базе данных ?", "Внимание", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
== DialogResult.Yes)
UpdateMainData();
if (MessageBox.Show("Вы действительно желаете выйти из программы ?", "Внимание", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2)
== DialogResult.No)
e.Cancel = true;
}
//-----------------------------------------------------------------------
private void btnPrevDate_Click(object sender, System.EventArgs e)
{
int dataID = 0;
if (currManagerTotal.Position > 0)
{
currManagerTotal.Position -= 1;
DataRowView drvDataRow = (DataRowView)currManagerTotal.Current;
dataID = (int)drvDataRow.Row["dataID"];
DateTime date = (DateTime)drvDataRow.Row["currentDate"];
lblDateTime.Text = date.ToString("dd MMMM yyyy");
}
DataRowView drvData = (DataRowView)currManagerTotal.Current;
CalculateTotalPage(drvData.Row);
currentDataID = dataID;
switch (userGroup)
{
case frmAuthorization.UserGroup.PManagers:
if (dataID == DataID)
dgIncome.ReadOnly = false;
else
dgIncome.ReadOnly = true;
break;
}
}
//-----------------------------------------------------------------------
private void btnNextDate_Click(object sender, System.EventArgs e)
{
int dataID = 0;
if (currManagerTotal.Position < mainDataSet.data.Rows.Count)
{
currManagerTotal.Position += 1;
DataRowView drvDataRow = (DataRowView)currManagerTotal.Current;
dataID = (int)drvDataRow.Row["dataID"];
DateTime date = (DateTime)drvDataRow.Row["currentDate"];
lblDateTime.Text = date.ToString("dd MMMM yyyy");
}
DataRowView drvData = (DataRowView)currManagerTotal.Current;
CalculateTotalPage(drvData.Row);
currentDataID = dataID;
switch (userGroup)
{
case frmAuthorization.UserGroup.PManagers:
if (dataID == DataID)
dgIncome.ReadOnly = false;
else
dgIncome.ReadOnly = true;
break;
}
}
//-----------------------------------------------------------------------
private void cmbFilteringDirection_SelectionChangeCommitted(object sender, EventArgs e)
{
btnCalculateOwe.Enabled = true;
}
//-----------------------------------------------------------------------
private void btnCalculateOwe_Click(object sender, EventArgs e)
{
this.GetOweStatistic();
}
//-----------------------------------------------------------------------
private void cmiFindIncomeOutClient_Click(object sender, EventArgs e)
{
try
{
frmSearchClient f = new frmSearchClient(this.mainDataSet);
if ((f.ShowDialog() == DialogResult.OK)
(f.SelectedRow != null)
(dgIncome.CurrentCell.ColumnNumber == 0))
{
MainDataSet.dataRow totalRow = mainDataSet.data.FindBydataID(currentDataID);
DataView dvIncome = new DataView(mainDataSet.income);
dvIncome.RowFilter = "dataID = " + currentDataID.ToString();
DataRow incomeRow = dvIncome[dgIncome.CurrentRowIndex].Row;
incomeRow["clientID"] = (int)f.SelectedRow["clientID"];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void income_RowChanging(object sender, DataRowChangeEventArgs e)
{
MessageBox.Show("OK");
}
//-----------------------------------------------------------------------
private void dgClients_MouseUp(object sender, MouseEventArgs e)
{
try
{
Point point = new Point(e.X, e.Y);
System.Windows.Forms.DataGrid.HitTestInfo hti = dgClients.HitTest(point);
dgClients.ContextMenu = null;
if (hti.Row >= 0)
{
if (e.Button == MouseButtons.Right)
{
cmiFindClientsClientID.Visible = false;
if (hti.Column == 0)
cmiFindClientsClientID.Visible = true;
dgClients.CurrentRowIndex = hti.Row;
cmClients.Show(dgClients, point);
}
btnDeleteClient.Enabled = true;
DataTable table = (DataTable)dgClients.DataSource;
if (hti.Row <= table.Rows.Count - 1)
btnDeleteClient.Tag = table.Rows[hti.Row]["clientID"];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void cmiFindClientsClientID_Click(object sender, EventArgs e)
{
try
{
frmSearchClient f = new frmSearchClient(this.mainDataSet);
if ((f.ShowDialog() == DialogResult.OK)
(f.SelectedRow != null)
(dgClients.CurrentCell.ColumnNumber == 0))
{
DataTable dtClients = (DataTable)dgClients.DataSource;
DataRow clientRow = dtClients.Rows[dgClients.CurrentRowIndex];
DataGridColumnStyle column = dgClients.TableStyles["clients"].GridColumnStyles[0];
column.ReadOnly = false;
clientRow["clientID"] = (int)f.SelectedRow["clientID"];
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void btnFindPasteClient_Click(object sender, EventArgs e)
{
frmSearchClient f = new frmSearchClient(this.mainDataSet);
if (f.ShowDialog() == DialogResult.OK)
{
DataRow newClient = mainDataSet.clients.NewRow();
int intClientIDToTableClientGroups;
intClientIDToTableClientGroups = (int)f.SelectedRow["clientID"];
// Добавляем данные в таблицу Group_Clients
DataRow newGroupClientRow = mainDataSet.group_clients.NewRow();
newGroupClientRow["clientID"] = intClientIDToTableClientGroups;
DataView dvGroups = (DataView)dgGroups.DataSource;
DataRow group = dvGroups[dgGroups.CurrentRowIndex].Row;
int groupID = (int)group["groupID"];
newGroupClientRow["groupID"] = groupID;
mainDataSet.group_clients.Rows.Add(newGroupClientRow);
dgGroups_Click(dgGroups, new EventArgs());
}
}
//-----------------------------------------------------------------------
private void menuItem8_Click(object sender, System.EventArgs e)
{
this.LoadPaymentDataBase();
}
//-----------------------------------------------------------------------
private void frmManager_Closed(object sender, EventArgs e)
{
System.Environment.Exit(1);
}
//-----------------------------------------------------------------------
private void miChangePassword_Click(object sender, EventArgs e)
{
frmPassword pass = new frmPassword();
if (pass.ShowDialog() == DialogResult.OK)
{
}
}
//-----------------------------------------------------------------------
private void dgIncome_MouseUp(object sender, MouseEventArgs e)
{
try
{
this.RemoveTempFindControl();
if (e.Button == MouseButtons.Right)
{
int delta = 0;
DataGrid dg = (DataGrid)sender;
DataGrid.HitTestInfo hti = dg.HitTest(e.X, e.Y);
DataView dv = (DataView)currManagerIncome.List;
FindControl.FindControl fc = null;
int columnIndex = hti.Column;
int rowIndex = hti.Row;
if ((columnIndex == -1) || (rowIndex == -1))
return;
else
{
fc = new FindControl.FindControl();
fc.Visible = true;
fc.Tag = "Temp";
string tableName = dg.Tag.ToString();
delta = (tableName == "income") ? 0 : 60 ;
fc.Table = mainDataSet.Tables[tableName];
fc.TargetRow = (tableName == "income") ? this.GetTablesRow(fc.Table, rowIndex, currManagerIncome):
this.GetTablesRow(fc.Table, rowIndex, currManagerOut);
if (fc.TargetRow == null)
{
Exception ex = new Exception("Ошибка получения записи.");
throw ex;
}
// Выбрано поле ClientID в таблице expenses или income
if (((tableName == "income") || (tableName == "expenses")) (columnIndex == 3))
{
fc.SelectingForm = new frmSearchClient(this.mainDataSet);
int objectID = (int)fc.TargetRow["ClientID"];
DataRow personRow = (DataRow)mainDataSet.clients.FindByclientID(objectID);
//fc.PersonForm = new frmClient(personRow, this.mainDataSet);
fc.PersonForm = new frmClient(this.mainDataSet);
fc.ColumnName = "clientID";
fc.Text = "Client";
}
// Выбрано поле PaymentTypeID в таблице expenses или income
else if (((tableName == "income") || (tableName == "expenses")) (columnIndex == 1))
{
fc.SelectingForm = new frmPaymentType(this.mainDataSet);
fc.PersonForm = new frmPaymentType(this.mainDataSet);
fc.ColumnName = "payment_typeID";
fc.Text = "Payment";
}
// Выбрано поле EmployeeID в таблице expenses
else if ((tableName == "expenses") (columnIndex == 4))
{
fc.SelectingForm = new frmEmployee(this.mainDataSet);
fc.PersonForm = new frmEmployee(this.mainDataSet);
fc.ColumnName = "employeeID";
fc.Text = "Employee";
}
else
return;
// Добавляем пользовательский элемент управления поиска
this.tcManager.TabPages[2].Controls.Add(fc);
Point worldPoint = dg.PointToScreen(new Point(e.X - delta, e.Y));
Point controlPoint = tcManager.PointToClient(worldPoint);
fc.Location = controlPoint;
fc.BringToFront();
fc.RowSelected += new FindControl.RowSelectedDelegate(fc_RowSelected);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void fc_RowSelected(FindControl.FindControl findControl, DataTable table)
{
try
{
SelectingFormInterface.ISelectingForm selectingForm = findControl.SelectingForm;
if (selectingForm.SelectedRow == null)
{
MessageBox.Show("Не выбрана запись", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
else
{
findControl.TargetRow[findControl.ColumnName] = selectingForm.SelectedRow[findControl.ColumnName];
if (findControl.TargetRow.RowState == DataRowState.Detached)
table.Rows.Add(findControl.TargetRow);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//-----------------------------------------------------------------------
private void btnShowPaymentTypeForm_Click(object sender, EventArgs e)
{
frmPaymentType fpt = new frmPaymentType(this.mainDataSet);
fpt.ShowDialog();
}
//-----------------------------------------------------------------------
private void frmManager_Load(object sender, EventArgs e)
{
this.SetWitdhForDataGrids();
}
//-----------------------------------------------------------------------
private void dtClients_RowChanged(object sender, DataRowChangeEventArgs e)
{
DataRow clientRow = mainDataSet.clients.FindByclientID((int)e.Row["clientID"]);
clientRow["fname"] = e.Row["fname"];
clientRow["lname"] = e.Row["lname"];
clientRow["fathName"] = e.Row["fathName"];
clientRow["linkData"] = e.Row["linkData"];
clientRow["recorddate"] = e.Row["recorddate"];
clientRow["note"] = e.Row["note"];
clientRow["paymentType"] = e.Row["paymentType"];
clientRow["isRinged"] = e.Row["isRinged"];
}
private void menuItem12_Click(object sender, System.EventArgs e)
{
this.UpdateMainData();
}
private void mnuUpdateMainDataBase_Click(object sender, System.EventArgs e)
{
this.UpdateMainData();
}
// Удаление клиента со страницы 'Приемная'
private void btnDeleteClient_Click(object sender, EventArgs e)
{
try
{
if (btnDeleteClient.Tag == null)
{
MessageBox.Show("Нельзя удалить клиента!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
int clientID = (int)btnDeleteClient.Tag;
MainDataSet.clientsRow clientRow = mainDataSet.clients.FindByclientID(clientID);
btnDeleteClient.Enabled = false;
clientRow.Delete();
dgGroups_Click(dgGroups, new EventArgs());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
#endregion
#region Переопределяемые методы
protected override void Dispose( bool disposing )
{
// Описание метода
}
//-----------------------------------------------------------------------
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint (e);
}
#endregion
}
}
При запуске программы пользователь вводит свой логин в домене и пароль (см. рис. 11.1). К примеру, мы рассматриваем домен SomeDomain. Пользователь вводит свою учетную запись в домене, например SomeDomain\someUser, и пароль. Далее проверяется принадлежность пользователя группам Administrators, Managers, Recipients. Эти группы пользователей должны быть предварительно созданы администратором, в противном случае пользователь будет иметь группу FailGroup и не сможет запустить программу. Если пользователь авторизован, то, в зависимости от принадлежности к группе, интерфейс программы будет выглядеть по-разному, т.е. какие-то функции доступны, а какие-то — нет.
Приступим к созданию этой формы. Помещаем на форму из панели ToolBox следующие элементы управления:
TextBox: txtUserName и txtPassword и две надписи Label со свойствами Text "User name:" и "Password:" соответственно. Для элементов TextBox создаем обработчики события TextChanged (см. код программы).btnOK и btnCancel со свойствами Text "OK" и "Cancel" соответственно. Для них создаем обработчиков события Click (см. код программы). Также устанавливаем свойства DialogResult для этих кнопок "OK" и "Cancel" соответственно.Устанавливаем следующие свойства формы:
frmAuthorization, Свойство | Значение |
|---|---|
Text |
Authorization |
AcceptButton |
btnOK |
CancelButton |
btnCancel |
Добавляем в класс формы frmAuthorization следующие методы:
| Сигнатура методов | Описание методов |
|---|---|
private void OpenMainForm(UserGroup userGroup, Label label) |
Открытие главной формы для пользователя с данной группой прав |
private void CheckLogin() |
Авторизация пользователя |
private void InitialDefaultSettings() |
Настройки по умолчанию |
private void CheckTextBoxes() |
Проверка полей ввода |
Создаем обработчик события Activate для формы (см. код программы).
Также в класс формы добавим перечисление с константами групп пользователей:
internal enum UserGroup
{
Administrators,
Managers,
Recipients,
FailGroup
}
Листинг формы frmAuthorization:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Security.Principal;
using System.Windows.Forms;
using System.DirectoryServices;
using System.Management;
using Manager.Schemas;
using Manager.Forms;
using System.Globalization;
using System.Security.Permissions;
using System.Threading;
namespace Manager
{
public class frmAuthorization : System.Windows.Forms.Form
{
// Объявление элементов управления.
internal enum UserGroup
{
Administrators,
Managers,
Recipients,
FailGroup
}
public frmAuthorization()
{
InitializeComponent();
this.InitialDefaultSettings();
}
// Открытие главной формы для пользователя с определенной группой доступа.
private void OpenMainForm(UserGroup userGroup, Label label)
{
frmManager mainForm = new frmManager();
mainForm.userGroup = userGroup;
switch (userGroup)
{
case UserGroup.Administrators:
mainForm.panel12.Visible = true;
mainForm.gbPaymentDB.Visible = true;
mainForm.tbMain.Buttons[3].Visible = true;
mainForm.rbDataMain.Visible = true;
mainForm.rbIncomeMain.Visible = true;
mainForm.rbOutMain.Visible = true;
mainForm.dgWorkTable.ReadOnly = false;
mainForm.tcManager.SelectedTab = mainForm.tcManager.TabPages[1];
mainForm.mnuSecurity.Visible = false;
mainForm.btnShowPaymentTypeForm.Visible = true;
break;
case UserGroup.Managers:
mainForm.panel12.Visible = false;
mainForm.panel16.Dock = DockStyle.Fill;
mainForm.panel18.Visible = false;
mainForm.gbPaymentDB.Visible = false;
mainForm.tbMain.Buttons[3].Visible = false;
mainForm.rbDataMain.Visible = false;
mainForm.dgOut.Visible = false;
mainForm.splitter2.Visible = false;
mainForm.rbIncomeMain.Visible = true;
mainForm.rbOutMain.Visible = false;
mainForm.dgWorkTable.ReadOnly = false;
mainForm.tcManager.SelectedTab = mainForm.tcManager.TabPages[0];
mainForm.mnuSecurity.Visible = false;
mainForm.btnShowPaymentTypeForm.Visible = false;
break;
case UserGroup.Recipients:
mainForm.panel12.Visible = false;
mainForm.panel16.Dock = DockStyle.Fill;
mainForm.panel18.Visible = false;
mainForm.gbPaymentDB.Visible = false;
mainForm.tbMain.Buttons[3].Visible = false;
mainForm.rbDataMain.Visible = false;
mainForm.dgOut.Visible = false;
mainForm.splitter2.Visible = false;
mainForm.rbIncomeMain.Visible = false;
mainForm.rbOutMain.Visible = false;
mainForm.dgWorkTable.ReadOnly = false;
mainForm.tcManager.SelectedTab = mainForm.tcManager.TabPages[0];
mainForm.gbBaseTables.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
mainForm.mnuSecurity.Visible = false;
mainForm.btnShowPaymentTypeForm.Visible = false;
break;
case UserGroup.FailGroup:
MessageBox.Show("Вы не имеете полномочий запускать данное приложение.\n\n" +
"Чтобы запустить, приложение вам необходимо принадлежать группам:\n" +
"Administrators, Managers или Recipients.\n\n" +
"Проверьте учетную запись или обратитесь к администратору.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
System.Environment.Exit(1);
break;
}
label.Text = "Loading database ...";
mainForm.LoadMainDataBase();
label.Text = "Checking data ...";
mainForm.PasteDateRow();
label.Text = "Loading ...";
mainForm.FillPaymentsPage();
mainForm.Explorer();
mainForm.Show();
mainForm.CheckEmployeesBirthDays();
label.Text = "Ready";
}
// Проверка имени и пароля
private void CheckLogin()
{
try
{
frmHeadBand headBand = new frmHeadBand();
headBand.Show();
headBand.Cursor = Cursors.WaitCursor;
headBand.label1.Text = "Checking...";
this.Visible = false;
UserGroup userGroup = UserGroup.FailGroup;
DirectoryEntry de=new DirectoryEntry();
try
{
de.Path = "LDAP:// ";
de.Username = txtUserName.Text;
de.Password = txtPassword.Text;
// Если была неверно введена учетная запись,
//тогда инструкция if сгенерирует исключение
//System.Runtime.InteropServices.COMException
if(de.NativeObject == null)
MessageBox.Show("Failed");
}
catch(System.Runtime.InteropServices.COMException)
{
headBand.Dispose();
MessageBox.Show("Неверное имя пользователя или пароль",
"Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
System.Environment.Exit(1);
}
WindowsIdentity wi = WindowsIdentity.GetCurrent();
WindowsPrincipal wp = new WindowsPrincipal(wi);
if (wi.Name.ToLower() != de.Username.ToLower())
{
headBand.Dispose();
MessageBox.Show("Вы не имеете полномочий запускать данное приложение.\n\n" +
"Проверьте, что ваша учетная запись совпадает с текущей учетной записью.",
"Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
System.Environment.Exit(1);
}
// Авторизация пользователя
if (wp.IsInRole(@"SomeDomain\Administrators")) // Administrators
userGroup = UserGroup.Administrators;
else if (wp.IsInRole(@"SomeDomain \Managers")) // Managers
userGroup = UserGroup.Managers;
else if (wp.IsInRole(@"SomeDomain \Recipients")) // Recipients
userGroup = UserGroup.Recipients;
this.OpenMainForm(userGroup, headBand.label1);
headBand.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
System.Environment.Exit(1);
}
}
// Настройки по умолчанию
private void InitialDefaultSettings()
{
this.MinimumSize = this.Size;
this.MaximumSize = this.Size;
this.StartPosition = FormStartPosition.CenterScreen;
this.txtUserName.TextChanged += new EventHandler(txtUserName_TextChanged);
this.txtPassword.TextChanged += new EventHandler(txtPassword_TextChanged);
this.btnOK.Click += new EventHandler(btnOK_Click);
this.btnCancel.Click += new EventHandler(btnCancel_Click);
this.Activated += new EventHandler(frmAuthorization_Activated);
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private static void Main()
{
Application.Run(new frmAuthorization());
}
private void InitializeComponent()
{
// Описание метода
}
#endregion
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void CheckTextBoxes()
{
if ((txtPassword.Text != "") (txtUserName.Text != ""))
btnOK.Enabled = true;
else
btnOK.Enabled = false;
}
private void txtUserName_TextChanged(object sender, EventArgs e)
{
this.CheckTextBoxes();
}
private void txtPassword_TextChanged(object sender, EventArgs e)
{
this.CheckTextBoxes();
}
private void btnOK_Click(object sender, EventArgs e)
{
this.CheckLogin();
}
private void frmAuthorization_Activated(object sender, EventArgs e)
{
WindowsIdentity t = WindowsIdentity.GetCurrent();
this.txtUserName.Text=t.Name.ToString();
this.txtPassword.Focus();
}
}
}
Эта форма используется для создания новых учебных направлений в окне проводника главной формы. Для добавления направления щелкаем в проводнике правой кнопкой и в появившемся контекстном меню выбираем New-Direction (рис. 11.31).
(рис 11.31) Создание нового направленияВ результате появляется окно, в которое вводим название направления и его описание (рис. 11.32).
(рис 11.32) Форма frmDirectionПриступим к созданию этой формы. Помещаем на нее из окна ToolBox следующие элементы управления:
TextBox txtDirectionName, две надписи Label lblDirectionName и lblDirectionNote со свойствами Text "Направление:" и "Описание:" соответственно. Элемент TextBox txtDirectionNote (устанавливаем свойству MultiLine значение true ). Для элементов TextBox создаем обработчики событий Validated (см. код программы).btnOK и btnCancel со свойствами Text "OK" и "Cancel" соответственно. Для них создаем обработчиков события Click (см. код программы). Также устанавливаем свойства DialogResult для этих кнопок "OK" и "Cancel" соответственно.Устанавливаем свойства формы frmDirection:
| Свойство | Значение |
|---|---|
Text |
Учебный центр |
AcceptButton |
BtnOK |
CancelButton |
BtnCancel |
Для формы создаем обработчик события Load (см. код программы).
В классе формы добавляем поле и свойство для него:
private DataRow bindingRow;
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
Помимо конструктора по умолчанию, будем использовать следующий конструктор:
public frmDirection(DataRow bindingRow)
{
InitializeComponent();
this.bindingRow = bindingRow;
this.txtDirectionName.Text = bindingRow["directName"].ToString();
this.txtDirectionNote.Text = bindingRow["note"].ToString();
}
Далее листинг формы:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace Manager
{
/// <summary>
/// Форма для направлений.
/// </summary>
public class frmDirection : System.Windows.Forms.Form
{
// Описание элементов управления
public frmDirection()
{
InitializeComponent();
}
private DataRow bindingRow;
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
public frmDirection(DataRow bindingRow)
{
InitializeComponent();
this.bindingRow = bindingRow;
this.txtDirectionName.Text = bindingRow["directName"].ToString();
this.txtDirectionNote.Text = bindingRow["note"].ToString();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
#endregion
private void txtDirectionName_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (txtDirectionName.Text != this.bindingRow["directName"].ToString())
{
this.bindingRow["directName"] = txtDirectionName.Text;
}
}
private void txtDirectionNote_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (txtDirectionNote.Text != this.bindingRow["note"].ToString())
{
this.bindingRow["note"] = txtDirectionNote.Text;
}
}
private void frmDirection_Load(object sender, System.EventArgs e)
{
txtDirectionName.Focus();
}
}
}
При копировании клиента из группы и последующей его вставки в другую группу появляется промежуточная форма перевода. Для ее создания помещаем на форму из окна ToolBox следующие элементы управления (рис. 11.33):
(рис 11.33) Форма frmClientTransferЛистинг этой формы:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace Manager
{
/// <summary>
/// Промежуточная форма управления клиентом.
/// </summary>
public class frmClientTransfer : System.Windows.Forms.Form
{
// Описание элементов управлений
public frmClientTransfer()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void frmClientTransfer_Load(object sender, System.EventArgs e)
{
txtClientName.Focus();
}
}
}
В программе реализована возможность поиска клиентов по фамилии, имени или дате записи. Располагаем на форме элементы управления, изображенные на рис. 11.34.
(рис 11.34) Форма frmSearchClientДля кнопок создаем обработчиков события Click. (см. код программы). Обратите внимание, что в коде вместо конструктора по умолчанию используется другой конструктор с параметром. Класс формы также был наследован от интерфейса ISelectingForm, и были переопределены его члены.
Листинг формы frmSearchClient:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using SelectingFormInterface;
using Manager.Forms;
namespace Manager
{
/// <summary>
/// Форма для поиска клиентов
/// </summary>
public class frmSearchClient : System.Windows.Forms.Form, ISelectingForm
{
private DataTable dtClients; // Таблица клиентов
public DataView dvSearchRez;
private CurrencyManager currManagerClients;
public CurrencyManager CurrencyManagerClients
{
get { return currManagerClients; }
set { currManagerClients = value; }
}
// Объявление элементов управления
public frmSearchClient(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
this.MakeStyleForDataGrid();
dtClients = mainDataSet.clients;
dtClients.RowChanged += new DataRowChangeEventHandler(dtSearchRez_RowChanged);
dgSearchRez.MouseUp += new MouseEventHandler(dgSearchRez_MouseUp);
dgSearchRez.Click += new EventHandler(dgSearchRez_Click);
currManagerClients = (CurrencyManager)this.BindingContext[mainDataSet, "income"];
}
private void MakeStyleForDataGrid()
{
DataGridTableStyle clientsTableStyle = new DataGridTableStyle();
clientsTableStyle.MappingName = "clients";
DataGridTextBoxColumn clientIDStyle = new DataGridTextBoxColumn();
clientIDStyle.MappingName = "clientID";
clientIDStyle.Width = 50;
clientIDStyle.HeaderText = "ID";
DataGridTextBoxColumn clientFirstNameStyle = new DataGridTextBoxColumn();
clientFirstNameStyle.MappingName = "fname";
clientFirstNameStyle.Width = 150;
clientFirstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn clientLastNameStyle = new DataGridTextBoxColumn();
clientLastNameStyle.MappingName = "lname";
clientLastNameStyle.Width = 150;
clientLastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn clientFatherNameStyle = new DataGridTextBoxColumn();
clientFatherNameStyle.MappingName = "fathName";
clientFatherNameStyle.Width = 150;
clientFatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn clientLinkDataStyle = new DataGridTextBoxColumn();
clientLinkDataStyle.MappingName = "linkData";
clientLinkDataStyle.Width = 150;
clientLinkDataStyle.HeaderText = "Контакты";
DataGridTextBoxColumn clientRecordDateStyle = new DataGridTextBoxColumn();
clientRecordDateStyle.MappingName = "recorddate";
clientRecordDateStyle.Width = 150;
clientRecordDateStyle.HeaderText = "Дата записи";
DataGridTextBoxColumn clientNotesStyle = new DataGridTextBoxColumn();
clientNotesStyle.MappingName = "note";
clientNotesStyle.Width = 150;
clientNotesStyle.HeaderText = "Заметки";
DataGridTextBoxColumn clientPaymentTypeStyle = new DataGridTextBoxColumn();
clientPaymentTypeStyle.MappingName = "paymentType";
clientPaymentTypeStyle.Width = 150;
clientPaymentTypeStyle.HeaderText = "Вид оплаты";
clientsTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
clientIDStyle,
clientFirstNameStyle,
clientLastNameStyle,
clientFatherNameStyle,
clientLinkDataStyle,
clientRecordDateStyle,
clientNotesStyle,
clientPaymentTypeStyle});
dgSearchRez.TableStyles.Add(clientsTableStyle);
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
// Начать поиск
private void btnFind_Click(object sender, System.EventArgs e)
{
try
{
dvSearchRez = new DataView(dtClients);
string str = @"fname LIKE '" + txtFname.Text + @"' OR lname LIKE '" + txtLname.Text + @"'" + @" OR recorddate = '" + dtpRecDate.Value.Date.ToString() + @"'";
dvSearchRez.RowFilter = str;
dgSearchRez.DataSource = dvSearchRez;
currManagerClients = (CurrencyManager)this.BindingContext[dvSearchRez, null];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Обновление данных
private void btnGetChanges_Click(object sender, System.EventArgs e) // внести изменения
{
try
{
daSearch.Update(dtClients.GetChanges());
btnGetChanges.Enabled = false;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
// Доступ к кнопке изменений
private void dtSearchRez_RowChanged(object sender, DataRowChangeEventArgs e)
{
btnGetChanges.Enabled = true;
}
private void btnExit_Click(object sender, System.EventArgs e)
{
this.Close();
}
private void dgSearchRez_ShowParentDetailsButtonClick(object sender, EventArgs e)
{
MessageBox.Show("OK");
}
private void dgSearchRez_MouseUp(object sender, MouseEventArgs e)
{
Point point = new Point(e.X, e.Y);
int rowIndex = dgSearchRez.CurrentRowIndex;
if (rowIndex >= 0)
{
System.Windows.Forms.DataGrid.HitTestInfo hti = dgSearchRez.HitTest(point);
this.SelectedRow = dvSearchRez[hti.Row].Row;
}
}
#region IFindingForm Members
private DataRow selectedRow;
public DataRow SelectedRow
{
get
{
return selectedRow;
}
set
{
selectedRow = value;
}
}
#endregion
}
}
Форма frmClient, используемая для добавления новых клиентов, содержит ряд вкладок. Располагаем элементы управления и называем их в соответствии с рис. 11.35–11.38.

(рис 11.36) Вкладка "Данные клиента"(рис 11.35) Вкладка "Оплата и реализация"
(рис 11.38) Вкладка "Архив"(рис 11.37) Вкладка "Группы клиента"Листинг frmClient:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Manager.Forms;
namespace Manager
{
public class frmClient : System.Windows.Forms.Form
{
// Объявление элементов управления
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
private int groupID = 0;
internal int GroupID
{
get { return groupID; }
set { groupID = value; }
}
private int clientID = 0;
internal int ClientID
{
get { return clientID; }
set { clientID = value; }
}
private frmManager mainForm = null;
private Manager.Forms.MainDataSet mainDataSet1;
internal frmManager MainForm
{
get { return mainForm; }
set { mainForm = value; }
}
internal CurrencyManager cmPaymentType;
private MainDataSet mainDataSet = null;
public frmClient(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
dgPayments.Tag = "Payments";
dgClientsRealization.Tag = "Realization";
Size labelSize = new Size(this.Width, lblClientID.Size.Height);
this.lblClientID.Size = labelSize;
mainDataSet.income.Columns["clientID"].DefaultValue = this.ClientID;
mainDataSet.RealizedTable.Columns["clientID"].DefaultValue = this.ClientID;
DesigneDataGrids();
btnCreateClientPayment.Click += new EventHandler(btnCreateClientPayment_Click);
btnRealizeClient.Click += new EventHandler(btnRealizeClient_Click);
cmbPaymentType.DataSource = mainDataSet.payment_type;
cmbPaymentType.DisplayMember = "payment_typeName";
cmPaymentType = (CurrencyManager)this.BindingContext[mainDataSet, "payment_type"];
cmPaymentType.Position = 0;
//*****************************
btnFindClient.Click += new EventHandler(btnFindClient_Click);
btnSelectClient.Click += new EventHandler(btnSelectClient_Click);
dgFindedClients.MouseUp += new MouseEventHandler(dgFindedClients_MouseUp);
dgPayments.MouseUp += new MouseEventHandler(dgPayments_MouseUp);
dgClientsRealization.MouseUp += new MouseEventHandler(dgPayments_MouseUp);
//*****************************
}
public frmClient(DataRow bindingRow, MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
dgPayments.Tag = "Payments";
dgClientsRealization.Tag = "Realization";
IsCreating = true;
Size labelSize = new Size(this.Width, lblClientID.Size.Height);
this.lblClientID.Size = labelSize;
this.bindingRow = bindingRow;
this.ClientID = (int)bindingRow["clientID"];
this.lblClientID.Text += this.ClientID.ToString();
this.txtFirstName.Text = bindingRow["fname"].ToString();
this.txtLastName.Text = bindingRow["lname"].ToString();
this.txtFatherName.Text = bindingRow["fathName"].ToString();
this.txtPhones.Text = bindingRow["linkData"].ToString();
this.dtpRecordDate.Value = (DateTime)bindingRow["recordDate"];
this.txtNotes.Text = bindingRow["note"].ToString();
mainDataSet.income.Columns["clientID"].DefaultValue = this.ClientID;
mainDataSet.RealizedTable.Columns["clientID"].DefaultValue = this.ClientID;
btnCreateClientPayment.Click += new EventHandler(btnCreateClientPayment_Click);
btnRealizeClient.Click += new EventHandler(btnRealizeClient_Click);
DesigneDataGrids();
cmbPaymentType.DataSource = mainDataSet.payment_type;
cmbPaymentType.DisplayMember = "payment_typeName";
cmPaymentType = (CurrencyManager)this.BindingContext[mainDataSet, "payment_type"];
cmPaymentType.Position = 0;
//**********************
btnFindClient.Click += new EventHandler(btnFindClient_Click);
btnSelectClient.Click += new EventHandler(btnSelectClient_Click);
dgFindedClients.MouseUp += new MouseEventHandler(dgFindedClients_MouseUp);
dgPayments.MouseUp += new MouseEventHandler(dgPayments_MouseUp);
dgClientsRealization.MouseUp += new MouseEventHandler(dgPayments_MouseUp);
//**********************
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void txtLastName_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtLastName.Text != this.bindingRow["lname"].ToString())
{
this.bindingRow["lname"] = txtLastName.Text;
}
}
private void txtFirstName_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtFirstName.Text != this.bindingRow["fname"].ToString())
{
this.bindingRow["fname"] = txtFirstName.Text;
}
}
private void txtFartherName_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtFatherName.Text != this.bindingRow["fathName"].ToString())
{
this.bindingRow["fathName"] = txtFatherName.Text;
}
}
private void txtPhones_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtPhones.Text != this.bindingRow["linkData"].ToString())
{
this.bindingRow["linkData"] = txtPhones.Text;
}
}
private void dtpRecordDate_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (dtpRecordDate.Value != (DateTime)this.bindingRow["recorddate"])
{
this.bindingRow["recorddate"] = dtpRecordDate.Value;
}
}
private void txtNotes_Validated(object sender, System.EventArgs e)
{
if (IsCreating)
if (txtNotes.Text != this.bindingRow["note"].ToString())
{
this.bindingRow["note"] = txtNotes.Text;
}
}
// Реализация клиента
private void btnRealizeClient_Click(object sender, System.EventArgs e)
{
try
{
DataRow realizedRow = mainDataSet.RealizedTable.NewRow();
realizedRow["realizedSumm"] = double.Parse(txtRealizedSumm.Text);
realizedRow["realizingDate"] = dtpRealizedDate.Value;
realizedRow["note"] = txtRealizingNotes.Text;
realizedRow["clientID"] = clientID;
mainDataSet.RealizedTable.Rows.Add(realizedRow);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void frmClient_Activated(object sender, System.EventArgs e)
{
txtLastName.Focus();
}
private void btnCalculate_Click(object sender, System.EventArgs e)
{
try
{
DataView dvIncome = (DataView)dgPayments.DataSource;
double incomeSumm = 0;
foreach (DataRowView drvIncome in dvIncome)
{
incomeSumm += (double)drvIncome.Row["summa"];
}
txtIncomeSumm.Text = incomeSumm.ToString("C");
DataView dvRealized = (DataView)dgClientsRealization.DataSource;
double realizedSumm = 0;
foreach (DataRowView drvRealized in dvRealized)
{
realizedSumm += (double)drvRealized.Row["realizedSumm"];
}
txtRealizationSumm.Text = realizedSumm.ToString("C");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void DesigneDataGrids()
{
// Стиль таблицы оплат клиента
DataGridTableStyle incomeTableStyle = new DataGridTableStyle();
incomeTableStyle.MappingName = "income";
DataGridTextBoxColumn summaStyle = new DataGridTextBoxColumn();
summaStyle.MappingName = "summa";
summaStyle.Width = 100;
summaStyle.Format = "#.0";
summaStyle.HeaderText = "Сумма";
DataGridTextBoxColumn payment_typeIDStyle = new DataGridTextBoxColumn();
payment_typeIDStyle.MappingName = "payment_typeID";
payment_typeIDStyle.Width = 100;
payment_typeIDStyle.HeaderText = "Код вида оплаты";
DataGridTextBoxColumn noteStyle = new DataGridTextBoxColumn();
noteStyle.MappingName = "note";
noteStyle.Width = 100;
noteStyle.HeaderText = "Заметки";
DataGridBoolColumn realizedStyle = new DataGridBoolColumn();
realizedStyle.MappingName = "IsRealized";
realizedStyle.Width = 100;
realizedStyle.HeaderText = "Реализовано";
incomeTableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[] {
summaStyle,
payment_typeIDStyle,
noteStyle});
dgPayments.TableStyles.Add(incomeTableStyle);
// Стиль таблицы реализации оплат клиента
DataGridTableStyle PlanRealizationTableStyle = new DataGridTableStyle();
PlanRealizationTableStyle.MappingName = "PlanRealization";
DataGridTextBoxColumn SummaRealizationStyle = new DataGridTextBoxColumn();
SummaRealizationStyle.MappingName = "SummaRealization";
SummaRealizationStyle.Width = 150;
SummaRealizationStyle.Format = "#.0";
SummaRealizationStyle.HeaderText = "Сумма реализации";
DataGridTextBoxColumn DateRealizationStyle = new DataGridTextBoxColumn();
DateRealizationStyle.MappingName = "DateRealization";
DateRealizationStyle.Width = 100;
DateRealizationStyle.HeaderText = "Дата реализации";
DataGridTextBoxColumn noteRealizationStyle = new DataGridTextBoxColumn();
noteRealizationStyle.MappingName = "Cause";
noteRealizationStyle.Width = 100;
noteRealizationStyle.HeaderText = "Заметки";
PlanRealizationTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
SummaRealizationStyle,
DateRealizationStyle,
noteRealizationStyle});
dgPayments.TableStyles.Add(PlanRealizationTableStyle);
// Стиль таблицы фактической реализации оплат клиента
DataGridTableStyle RealizedTableStyle = new DataGridTableStyle();
RealizedTableStyle.MappingName = "RealizedTable";
DataGridTextBoxColumn RealizationSummStyle = new DataGridTextBoxColumn();
RealizationSummStyle.MappingName = "realizedSumm";
RealizationSummStyle.Width = 150;
RealizationSummStyle.HeaderText = "Сумма";
DataGridTextBoxColumn RealizingDateStyle = new DataGridTextBoxColumn();
RealizingDateStyle.MappingName = "realizingDate";
RealizingDateStyle.Width = 150;
RealizingDateStyle.Format = "dd-MMMM-yyyy";
RealizingDateStyle.HeaderText = "Дата реализации";
DataGridTextBoxColumn NoteRealizationStyle = new DataGridTextBoxColumn();
NoteRealizationStyle.MappingName = "note";
NoteRealizationStyle.Width = 100;
NoteRealizationStyle.HeaderText = "Заметки";
RealizedTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
RealizationSummStyle,
RealizingDateStyle,
NoteRealizationStyle});
dgClientsRealization.TableStyles.Add(RealizedTableStyle);
}
private void btnCreateClientPayment_Click(object sender, System.EventArgs e)
{
try
{
DataRow incomeRow = mainDataSet.income.NewRow();
incomeRow["dataID"] = frmManager.DataID;
incomeRow["clientID"] = this.clientID;
incomeRow["summa"] = double.Parse(txtIncomeClientSumm.Text);
incomeRow["note"] = txtIncomeNote.Text;
incomeRow["IsRealized"] = 0;
DataRowView payment_typeRowView = (DataRowView)cmPaymentType.Current;
incomeRow["payment_typeID"] = payment_typeRowView.Row["payment_typeID"];
///
///Добавление столбца с датой ввода суммы (по умолчанию равной текущей дате)
///
mainDataSet.income.Rows.Add(incomeRow);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
//**************************
private void FilterClients()
{
string clientLastName = txtLastName.Text;
string clientFirstName = txtFirstName.Text;
string clientFatherName = txtFatherName.Text;
DataView dataView = new DataView(mainDataSet.clients);
string filter = "fname = \'" + clientFirstName + "\' OR lname = \'" + clientLastName + "\' OR fathName = \'" + clientFatherName + "\'";
dataView.RowFilter = filter;
dgFindedClients.DataSource = dataView;
}
private int GetClientIDInSearchDataGrid(DataGrid.HitTestInfo hti)
{
if (hti.Row == -1)
return -1;
DataView searchDataView = (DataView)dgFindedClients.DataSource;
return (int)searchDataView[hti.Row].Row["clientID"];
}
private void PasteSelectedClient()
{
try
{
if (selectedClientIDInDataGrid == -1)
{
MessageBox.Show("Не выбран клиент!");
return;
}
DataRow groupClientsRow = mainDataSet.group_clients.NewRow();
groupClientsRow["groupID"] = this.GroupID;
groupClientsRow["clientID"] = selectedClientIDInDataGrid;
groupClientsRow["IsPaid"] = false;
mainDataSet.group_clients.Rows.Add(groupClientsRow);
if (this.MainForm != null)
MainForm.dgGroups_Click(MainForm.dgGroups, new EventArgs());
this.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void btnFindClient_Click(object sender, EventArgs e)
{
this.FilterClients();
}
private void btnSelectClient_Click(object sender, EventArgs e)
{
this.PasteSelectedClient();
}
int selectedClientIDInDataGrid = -1;
//**************************
private void dgFindedClients_MouseUp(object sender, MouseEventArgs e)
{
selectedClientIDInDataGrid = this.GetClientIDInSearchDataGrid(dgFindedClients.HitTest(e.X, e.Y));
}
private void dgPayments_MouseUp(object sender, MouseEventArgs e)
{
DataGrid dataGrid = (DataGrid)sender;
DataGrid.HitTestInfo hti = dataGrid.HitTest(new Point(e.X, e.Y));
if ((hti.Row < 0) || (hti.Column < 0))
return;
this.ShowDate(dataGrid, hti);
}
private void ShowDate(DataGrid dataGrid, DataGrid.HitTestInfo hti)
{
string caption = dataGrid.Tag.ToString();
dataGrid.CaptionText = "";
DataView dataView = (DataView)dataGrid.DataSource;
DataRow row = null;
row = (DataRow)dataView[hti.Row].Row;
DateTime date;
DataRow mainRow = null;
if (dataGrid.Tag.ToString() == "Payments")
{
mainRow = row.GetParentRow("dataincome");
if (mainRow == null)
return;
date = (DateTime)mainRow["currentDate"];
}
else if (dataGrid.Tag.ToString() == "Realization")
{
mainRow = row;
if (mainRow == null)
return;
date = (DateTime)mainRow["DateRealization"];
}
else
return;
string textFormat = String.Format(" - Date: {0}", date.ToString("dd MMMM yyyy"));
caption += textFormat;
dataGrid.CaptionText = caption;
}
}
}
При выборе одного из направлений в проводнике можно добавлять новые курсы, щелкнув правой кнопкой и выбрав в контекстном меню пункт New/Сourse (рис. 11.39):
(рис 11.39) Добавление нового курсаРасполагаем элементы управления и называем их в соответствии с рис. 11.40.
(рис 11.40) Форма frmCourseЛистинг формы frmCourse:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace Manager
{
/// <summary>
/// Форма курса
/// </summary>
public class frmCourse : System.Windows.Forms.Form
{
// Объявление элементов управления
public frmCourse()
{
InitializeComponent();
}
private DataRow bindingRow;
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
public frmCourse(DataRow bindingRow)
{
InitializeComponent();
this.bindingRow = bindingRow;
this.lblCourseNumber.Text += bindingRow.ItemArray[0].ToString();
this.txtCourseName.Text = bindingRow.ItemArray[1].ToString();
this.txtCoursePrice.Text = bindingRow.ItemArray[4].ToString();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void txtCourseName_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (txtCourseName.Text != this.bindingRow["courseName"].ToString())
{
this.bindingRow["courseName"] = txtCourseName.Text;
}
}
private void txtCoursePrice_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (double.Parse(txtCourseName.Text) != (double)this.bindingRow["priceNumber"])
{
this.bindingRow["priceNumber"] = double.Parse(txtCourseName.Text);
}
}
private void frmCourse_Load(object sender, System.EventArgs e)
{
txtCourseName.Focus();
}
}
}
В программе предусмотрена возможность извлечения, добавления и изменения информации о сотрудниках центра. Для этого используется форма frmEmployee, добавляем элементы управления в соответствии с рис. 11.41.
(рис 11.41) Форма frmEmployeeКласс формы frmEmployee наследуем от интерфейса ISelectingForm.
Листинг формы frmEmployee:
using System;
using System.Data;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using SelectingFormInterface;
using Manager.Forms;
namespace Manager
{
public class frmEmployee : System.Windows.Forms.Form, ISelectingForm
{
// Объявление элементов управления
#region IFindingForm Members
private DataRow selectedRow = null;
public DataRow SelectedRow
{
get { return selectedRow; }
set { selectedRow = value; }
}
#endregion
public frmEmployee(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
this.InitDefaultSettings();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void InitDefaultSettings()
{
try
{
cmEmployees = (CurrencyManager)this.BindingContext[mainDataSet, "employees"];
txtEmployeeFirstName.DataBindings.Add("Text", mainDataSet, "employees.FirstName");
txtEmployeeLastName.DataBindings.Add("Text", mainDataSet, "employees.LastName");
txtEmployeeFatherName.DataBindings.Add("Text", mainDataSet, "employees.FatherName");
dtpBirthday.DataBindings.Add("Value", mainDataSet, "employees.birthDay");
txtEmployeeNotes.DataBindings.Add("Text", mainDataSet, "employees.linkData");
cmbDirections.DataBindings.Add("Text", mainDataSet, "employees.directionID");
dgEmployees.DataSource = mainDataSet.employees;
dgEmployees.MouseUp += new MouseEventHandler(dgEmployees_MouseUp);
btnNext.Click += new EventHandler(btnNext_Click);
btnPrev.Click += new EventHandler(btnPrev_Click);
this.DesignDatagrid();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void miExit_Click(object sender, System.EventArgs e)
{
this.Close();
}
private void btnNext_Click(object sender, EventArgs e)
{
if (cmEmployees.Position < mainDataSet.employees.Rows.Count)
cmEmployees.Position++;
}
private void btnPrev_Click(object sender, EventArgs e)
{
if (cmEmployees.Position > 0)
cmEmployees.Position--;
}
private void SetSelectedRow(DataGrid dataGrid, DataGrid.HitTestInfo hti)
{
try
{
int rowIndex = hti.Row;
DataTable table = (DataTable)dataGrid.DataSource;
if (rowIndex == table.Rows.Count)
return;
DataRow selectedRow = table.Rows[rowIndex];
this.SelectedRow = selectedRow;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
private void dgEmployees_MouseUp(object sender, MouseEventArgs e)
{
DataGrid.HitTestInfo hti = dgEmployees.HitTest(e.X, e.Y);
if ((hti.Row != -1) (hti.Column != -1))
SetSelectedRow(dgEmployees, hti);
}
private void DesignDatagrid()
{
DataGridTableStyle employeesTableStyle = new DataGridTableStyle();
employeesTableStyle.MappingName = "employees";
DataGridTextBoxColumn employeeIDStyle = new DataGridTextBoxColumn();
employeeIDStyle.MappingName = "employeeID";
employeeIDStyle.Width = 50;
employeeIDStyle.HeaderText = "ID";
DataGridTextBoxColumn lastNameStyle = new DataGridTextBoxColumn();
lastNameStyle.MappingName = "LastName";
lastNameStyle.Width = 120;
lastNameStyle.HeaderText = "Фамилия";
DataGridTextBoxColumn firstNameStyle = new DataGridTextBoxColumn();
firstNameStyle.MappingName = "FirstName";
firstNameStyle.Width = 150;
firstNameStyle.HeaderText = "Имя";
DataGridTextBoxColumn fatherNameStyle = new DataGridTextBoxColumn();
fatherNameStyle.MappingName = "amountToday";
fatherNameStyle.Width = 150;
fatherNameStyle.HeaderText = "Отчество";
DataGridTextBoxColumn linkDataStyle = new DataGridTextBoxColumn();
linkDataStyle.MappingName = "linkData";
linkDataStyle.Width = 150;
linkDataStyle.HeaderText = "Контакты";
DataGridTextBoxColumn birthDayStyle = new DataGridTextBoxColumn();
birthDayStyle.MappingName = "birthDay";
birthDayStyle.Width = 100;
birthDayStyle.HeaderText = "День рождения";
DataGridTextBoxColumn directionIDStyle = new DataGridTextBoxColumn();
directionIDStyle.MappingName = "directionID";
directionIDStyle.Width = 60;
directionIDStyle.HeaderText = "directionID";
DataGridTextBoxColumn addressStyle = new DataGridTextBoxColumn();
addressStyle.MappingName = "Address";
addressStyle.Width = 300;
addressStyle.HeaderText = "Адрес";
DataGridTextBoxColumn notesStyle = new DataGridTextBoxColumn();
notesStyle.MappingName = "Notes";
notesStyle.Width = 100;
notesStyle.HeaderText = "Notes";
DataGridTextBoxColumn passportSerialNumberStyle = new DataGridTextBoxColumn();
passportSerialNumberStyle.MappingName = "PassportSerialNumber";
passportSerialNumberStyle.Width = 100;
passportSerialNumberStyle.HeaderText = "Серия паспорта";
DataGridTextBoxColumn dataPrinyatiyaStyle = new DataGridTextBoxColumn();
dataPrinyatiyaStyle.MappingName = "DataP";
dataPrinyatiyaStyle.Width = 100;
dataPrinyatiyaStyle.HeaderText = "DataP";
DataGridTextBoxColumn kStyle = new DataGridTextBoxColumn();
kStyle.MappingName = "K";
kStyle.Width = 100;
kStyle.HeaderText = "K";
DataGridTextBoxColumn postStyle = new DataGridTextBoxColumn();
postStyle.MappingName = "Post";
postStyle.Width = 100;
postStyle.HeaderText = "Post";
employeesTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
employeeIDStyle,
lastNameStyle,
firstNameStyle,
fatherNameStyle,
linkDataStyle,
birthDayStyle,
directionIDStyle,
addressStyle,
notesStyle,
passportSerialNumberStyle,
dataPrinyatiyaStyle,
kStyle,
postStyle});
dgEmployees.TableStyles.Add(employeesTableStyle);
}
}
}
Для добавления группы по выбранному курсу используется форма frmGroup. Добавляем элементы управления в соответствии с рис. 11.42.
(рис 11.42) Форма frmGroupЛистинг формы frmGroup:
using System;
using System.Drawing;
using System.Data;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Manager.Forms;
namespace Manager
{
/// <summary>
/// Форма группы
/// </summary>
public class frmGroup : System.Windows.Forms.Form
{
// Объявление элементов управления
internal CurrencyManager cmEmployees;
internal CurrencyManager cmGroupStatus;
private Manager.Forms.MainDataSet mainDataSet;
private DataRow bindingRow;
internal DataRow BindingRow
{
get { return bindingRow; }
set { bindingRow = value; }
}
public frmGroup(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
cmbStatus.DataSource = mainDataSet.GroupStatus;
cmbStatus.DisplayMember = "StatusName";
cmGroupStatus = (CurrencyManager)this.BindingContext[mainDataSet, "GroupStatus"];
cmGroupStatus.Position = 0;
cmbEmployee.DataSource = mainDataSet.employees;
cmbEmployee.DisplayMember = "EmployeeName";
cmEmployees = (CurrencyManager)this.BindingContext[mainDataSet, "employees"];
cmEmployees.Position = 0;
Size labelSize = new Size(this.Width, lblGroupID.Size.Height);
this.lblGroupID.Size = labelSize;
}
public frmGroup(MainDataSet ds, DataRow bindingRow)
{
InitializeComponent();
mainDataSet = ds;
cmbStatus.DataSource = mainDataSet.GroupStatus;
cmbStatus.DisplayMember = "StatusName";
cmGroupStatus = (CurrencyManager)this.BindingContext[mainDataSet, "GroupStatus"];
DataView dvStatus = (DataView)cmGroupStatus.List;
dvStatus.Sort = "StatusID";
int statusPos = dvStatus.Find(bindingRow["StatusID"]);
cmbStatus.SelectedIndex = statusPos;
cmbEmployee.DataSource = mainDataSet.employees;
cmbEmployee.DisplayMember = "EmployeeName";
cmEmployees = (CurrencyManager)this.BindingContext[mainDataSet, "employees"];
DataView dvEmployee = (DataView)cmEmployees.List;
dvEmployee.Sort = "employeeID";
int employeePos = dvEmployee.Find(bindingRow["employeeID"]);
cmbEmployee.SelectedIndex = employeePos;
Size labelSize = new Size(this.Width, lblGroupID.Size.Height);
this.lblGroupID.Size = labelSize;
this.bindingRow = bindingRow;
int groupID = (int)bindingRow[0];
this.lblGroupID.Text += groupID.ToString();
DateTime beginDate = (DateTime)bindingRow[1];
this.dtpBeginDate.Value = beginDate;
DateTime endDate = (DateTime)bindingRow[2];
this.dtpEndDate.Value = endDate;
if (bindingRow.ItemArray[3] == null)
{
this.dtpBeginTime.Text = "";
}
else
{
DateTime beginTime = (DateTime)bindingRow[3];
this.dtpBeginTime.Text = beginTime.ToString("HH:mm");
}
if (bindingRow.ItemArray[4] == null)
{
this.dtpEndTime.Text = "";
}
else
{
DateTime endTime = (DateTime)bindingRow[4];
this.dtpEndTime.Text = endTime.ToString("HH:mm");
}
this.txtNotes.Text = bindingRow[9].ToString();
this.cmbClassNumber.Text = bindingRow[6].ToString();
}
protected override void Dispose( bool disposing )
{
// Описание метода
}
private void InitializeComponent()
{
// Описание метода
}
private void frmGroup_Load(object sender, System.EventArgs e)
{
txtNotes.Focus();
}
// Проверка обновлений в элементах управлений
private void dtpBeginDate_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (dtpBeginDate.Value != (DateTime)this.bindingRow["beginDate"])
{
this.bindingRow["beginDate"] = DateTime.Parse(dtpBeginDate.Value.ToString("dd MMMM yyyy"));
}
}
private void dtpEndDate_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (dtpEndDate.Value != (DateTime)this.bindingRow["endDate"])
{
this.bindingRow["endDate"] = DateTime.Parse(dtpEndDate.Value.ToString("dd MMMM yyyy"));
}
}
private void dtpBeginTime_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (dtpBeginTime.Value != (DateTime)this.bindingRow["beginTime"])
{
this.bindingRow["beginTime"] = DateTime.Parse(dtpBeginTime.Value.ToString("HH:mm"));
}
}
private void dtpEndTime_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (dtpEndTime.Value != (DateTime)this.bindingRow["endTime"])
{
this.bindingRow["endTime"] = DateTime.Parse(dtpEndTime.Value.ToString("HH:mm"));
}
}
private void txtNotes_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (txtNotes.Text != this.bindingRow["note"].ToString())
{
this.bindingRow["note"] = txtNotes.Text;
}
}
private void cmbClassNumber_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
if (cmbClassNumber.Text != this.bindingRow["classNumber"].ToString())
{
this.bindingRow["classNumber"] = cmbClassNumber.Text;
}
}
private void cmbStatus_Validated(object sender, System.EventArgs e)
{
if (this.bindingRow != null)
{
DataRow statusRow = this.bindingRow.GetParentRow("GroupStatusgroups");
if (cmbStatus.Text != statusRow["StatusName"].ToString())
{
this.bindingRow["StatusID"] = cmbStatus.SelectedIndex + 1;
}
}
}
}
}
На вкладке "Оплаты" при нажатии на одноименную кнопку появляется окно, в котором можно указывать
(рис 11.43) Форма frmPaymentTypeКласс формы должен наследовать от интерфейса ISelectingForm.
Листинг формы frmPaymentType:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using SelectingFormInterface;
using System.Data;
using Manager.Forms;
namespace Manager
{
public class frmPaymentType : System.Windows.Forms.Form, ISelectingForm
{
private MainDataSet mainDataSet = null;
public frmPaymentType(MainDataSet mainDataSet)
{
InitializeComponent();
this.mainDataSet = mainDataSet;
this.InitialDefaultSettings();
}
protected override void Dispose( bool disposing )
{
//Описание метода
}
private void InitializeComponent()
{
//Описание метода
}
private System.Windows.Forms.DataGrid dgPaymentType;
private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button bntCancel;
private DataRow selectedRow = null;
public DataRow SelectedRow
{
get { return selectedRow; }
set { selectedRow = value; }
}
private void InitialDefaultSettings()
{
dgPaymentType.DataSource = mainDataSet;
dgPaymentType.DataMember = "payment_type";
dgPaymentType.Click += new EventHandler(dgPaymentType_Click);
dgPaymentType.CurrentCellChanged += new EventHandler(dgPaymentType_CurrentCellChanged);
this.DesignDataGrid();
}
private void DesignDataGrid()
{
// Дизайн таблицы payment_type
DataGridTableStyle paymentTypeStyle = new DataGridTableStyle();
paymentTypeStyle.MappingName = "payment_type";
DataGridTextBoxColumn paymentTypeIDStyle = new DataGridTextBoxColumn();
paymentTypeIDStyle.MappingName = "payment_typeID";
paymentTypeIDStyle.Width = 50;
paymentTypeIDStyle.HeaderText = "ID";
DataGridTextBoxColumn paymentTypeNameStyle = new DataGridTextBoxColumn();
paymentTypeNameStyle.MappingName = "payment_typeName";
paymentTypeNameStyle.Width = 100;
paymentTypeNameStyle.HeaderText = "Name";
DataGridTextBoxColumn paymentTypeNoteStyle = new DataGridTextBoxColumn();
paymentTypeNoteStyle.MappingName = "note";
paymentTypeNoteStyle.Width = 200;
paymentTypeNoteStyle.HeaderText = "Notes";
paymentTypeStyle.GridColumnStyles.AddRange( new DataGridTextBoxColumn[] {
paymentTypeIDStyle,
paymentTypeNameStyle,
paymentTypeNoteStyle});
dgPaymentType.TableStyles.Add(paymentTypeStyle);
}
private void dgPaymentType_Click(object sender, EventArgs e)
{
if ((dgPaymentType.CurrentCell.RowNumber != -1) (dgPaymentType.CurrentCell.ColumnNumber != -1))
dgPaymentType_CurrentCellChanged(dgPaymentType, new EventArgs());
}
private void dgPaymentType_CurrentCellChanged(object sender, EventArgs e)
{
try
{
this.SelectedRow = mainDataSet.payment_type.Rows[dgPaymentType.CurrentRowIndex];
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
}
}
В проекте были использованы дополнительные классы, листинг которых приводится далее.
using System;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
namespace Manager
{
internal abstract class ManagerTreeNode : TreeNode
{
internal abstract void GetChilds();
}
}
using System;
using System.Windows.Forms;
namespace Manager
{
internal class ClientTreeNode : ManagerTreeNode
{
internal ClientTreeNode()
{
}
private int clientID;
internal int ClientID
{
get { return clientID; }
set { clientID = value; }
}
private int groupID;
internal int GroupID
{
get { return groupID; }
set { groupID = value; }
}
private int courseID;
internal int CourseID
{
get { return courseID; }
set { courseID = value; }
}
private string firstName;
internal string FirstName
{
get { return firstName; }
set { firstName = value; }
}
private string lastName;
internal string LastName
{
get { return lastName; }
set { lastName = value; }
}
private string fatherName;
internal string FatherName
{
get { return fatherName; }
set { fatherName = value; }
}
private string linkData;
internal string LinkData
{
get { return linkData; }
set { linkData = value; }
}
private DateTime recorddate;
internal DateTime RecordDate
{
get { return recorddate; }
set { recorddate = value; }
}
private string note;
internal string Note
{
get { return note; }
set { note = value; }
}
private string paymentType;
internal string PaymentType
{
get { return paymentType; }
set { paymentType = value; }
}
private double clientSumm;
internal double ClientSumm
{
get { return clientSumm; }
set { clientSumm = value; }
}
internal override void GetChilds()
{
}
public override string ToString()
{
return lastName + " " + firstName + " " + fatherName;
}
}
}
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using Manager.Forms;
namespace Manager
{
internal class GroupTreeNode : ManagerTreeNode
{
private MainDataSet mainDataSet = null;
internal MainDataSet NDDataSet
{
get { return mainDataSet; }
set { mainDataSet = value; }
}
private int courseID;
internal int CourseID
{
get { return courseID; }
set { courseID = value; }
}
private int groupID;
internal int GroupID
{
get { return groupID; }
set { groupID = value; }
}
private DateTime beginDate;
internal DateTime BeginDate
{
get { return beginDate; }
set { beginDate = value; }
}
private DateTime endDate;
internal DateTime EndDate
{
get { return endDate; }
set { endDate = value; }
}
private DateTime beginTime;
internal DateTime BeginTime
{
get { return beginTime; }
set { beginTime = value; }
}
private DateTime endTime;
internal DateTime EndTime
{
get { return endTime; }
set { endTime = value; }
}
private int clientsCount;
internal int ClientsCount
{
get { return clientsCount; }
set { clientsCount = value; }
}
private int classNumber;
internal int ClassNumber
{
get { return classNumber; }
set { classNumber = value; }
}
private int directionID;
internal int DirectionID
{
get { return directionID; }
set { directionID = value; }
}
private int employeeID;
internal int EmployeeID
{
get { return employeeID; }
set { employeeID = value; }
}
private string groupNote;
internal string GroupNote
{
get { return groupNote; }
set { groupNote = value; }
}
private int status;
internal int Status
{
get { return status; }
set { status = value; }
}
internal override void GetChilds()
{
DataView dvGroupClients = new DataView(this.NDDataSet.group_clients);
dvGroupClients.RowFilter = "groupID = " + this.GroupID.ToString();
ClientTreeNode[] ctns = new ClientTreeNode[dvGroupClients.Count];
ClientTreeNode ctn = null;
int i = 0;
foreach(DataRowView drv in dvGroupClients)
{
DataRow clientRow = drv.Row.GetParentRow("clientsgroup_clients");
ctn = new ClientTreeNode();
ctn.ClientID = (int)clientRow["clientID"];
ctn.FirstName = clientRow["fname"].ToString();
ctn.LastName = clientRow["lname"].ToString();
ctn.FatherName = clientRow["fathName"].ToString();
ctn.LinkData = clientRow["linkData"].ToString();
ctn.RecordDate = (DateTime)clientRow["recordDate"];
ctn.Note = clientRow["note"].ToString();
ctn.PaymentType = clientRow["paymentType"].ToString();
ctn.Text = ctn.LastName + " " + ctn.FirstName + " " + ctn.FatherName;
ctn.ImageIndex = 6;
ctn.ForeColor = Color.Teal;
ctn.Tag = clientRow;
ctns[i++] = ctn;
ctn = null;
}
this.ForeColor = Color.Crimson;
this.Nodes.AddRange(ctns);
}
}
}
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using Manager.Forms;
namespace Manager
{
internal class CourseTreeNode : ManagerTreeNode
{
private MainDataSet mainDataSet = null;
internal MainDataSet NDDataSet
{
get { return mainDataSet; }
set { mainDataSet = value; }
}
private int directionID;
internal int DirectionID
{
get { return directionID; }
set { directionID = value; }
}
private int courseID;
internal int CourseID
{
get { return courseID; }
set { courseID = value; }
}
private string courseName;
internal string CourseName
{
get {return courseName;}
set {courseName = value;}
}
private decimal coursePrice;
internal decimal CoursePrice
{
get { return coursePrice; }
set { coursePrice = value; }
}
public override string ToString()
{
return courseName;
}
internal override void GetChilds()
{
DataView dvGroups = new DataView(this.NDDataSet.groups);
dvGroups.RowFilter = "courseID = " + this.courseID.ToString();
GroupTreeNode[] gtns = new GroupTreeNode[dvGroups.Count];
GroupTreeNode gtn = null;
int i = 0;
foreach (DataRowView drv in dvGroups)
{
DataRow dr = drv.Row;
gtn = new GroupTreeNode();
gtn.NDDataSet = this.NDDataSet;
gtn.CourseID = this.courseID;
gtn.GroupID = (int)dr["groupID"];
gtn.BeginDate = (DateTime)dr["beginDate"];
gtn.EndDate = (DateTime)dr["endDate"];
gtn.BeginTime = (DateTime)dr["beginTime"];
gtn.EndTime = (DateTime)dr["endTime"];
gtn.ClientsCount = (int)dr["clientsCount"];
gtn.ClassNumber = (int)dr["classNumber"];
gtn.CourseID = (int)dr["courseID"];
gtn.EmployeeID = (int)dr["employeeID"];
gtn.GroupNote = dr["note"].ToString();
gtn.Status = (int)dr["statusID"];
gtn.Text = gtn.GroupID.ToString();
gtn.ImageIndex = 6;
if ((int)dr["StatusID"] == 1) // Группа набирается
{
gtn.ForeColor = Color.Red;
}
else if ((int)dr["StatusID"] == 2) // Группа обучается
{
gtn.ForeColor = Color.Green;
}
else if ((int)dr["StatusID"] == 3) // Группа закончила обучение
{
gtn.ForeColor = Color.Blue;
}
gtn.Tag = dr;
gtns[i++] = gtn;
gtn = null;
}
this.ForeColor = Color.Green;
this.Nodes.AddRange(gtns);
}
}
}
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using Manager.Forms;
namespace Manager
{
internal class DirectionTreeNode : ManagerTreeNode
{
private MainDataSet mainDataSet = null;
internal MainDataSet NDDataSet
{
get { return mainDataSet; }
set { mainDataSet = value; }
}
private string directionName;
internal string DirectionName
{
get { return directionName; }
set { directionName = value; }
}
private string managerFirstName;
internal string ManagerFirstName
{
get { return managerFirstName; }
set { managerFirstName = value; }
}
private string managerLastName;
internal string ManagerLastName
{
get { return managerLastName; }
set { managerLastName = value; }
}
private string managerFatherName;
internal string ManagerFatherName
{
get { return managerFatherName; }
set { managerFatherName = value; }
}
private int directionID;
internal int DirectionID
{
get { return directionID; }
set { directionID = value; }
}
private string directionNote;
internal string DirectionNote
{
get { return directionNote; }
set { directionNote = value; }
}
private int managerID;
internal int ManagerID
{
get { return managerID;}
set { managerID = value;}
}
public override string ToString()
{
return directionName;
}
internal override void GetChilds()
{
DataView dvCourse = new DataView(this.NDDataSet.course);
dvCourse.RowFilter = "directionID = " + this.directionID.ToString();
CourseTreeNode[] ctns = new CourseTreeNode[dvCourse.Count];
CourseTreeNode ctn = null;
int i = 0;
foreach (DataRowView drv in dvCourse)
{
DataRow dr = drv.Row;
ctn = new CourseTreeNode();
ctn.NDDataSet = this.NDDataSet;
ctn.DirectionID = this.directionID;
ctn.CourseID = int.Parse(dr["courseID"].ToString());
ctn.CourseName = ctn.Text = dr["courseName"].ToString();
ctn.CoursePrice = (decimal)dr["priceNumber"];
ctn.ImageIndex = 10;
ctn.ForeColor = Color.Green;
ctn.GetChilds();
ctn.Tag = dr; // Теперь мы можем обращаться к элементам в ListView по свойству tag
ctns[i++] = ctn;
ctn = null;
}
this.ForeColor = Color.RoyalBlue;
this.Nodes.AddRange(ctns);
}
}
}
using System;
using System.Data;
namespace Manager
{
// Класс содержит строку для данного объекта из БД
public class CustomListItem : System.Windows.Forms.ListViewItem
{
public CustomListItem():base()
{
bindedRow = null;
}
public CustomListItem(string[] subItems, int imageIndex):base(subItems, imageIndex)
{
bindedRow = null;
}
private DataRow bindedRow;
internal DataRow BindedRow
{
get { return bindedRow; }
set { bindedRow = value; }
}
}
}
Этот интерфейс наследуют формы, в которых можно выбирать какие-нибудь записи:
using System;
using System.Data;
using System.Windows.Forms;
namespace SelectingFormInterface
{
public interface ISelectingForm
{
DataRow SelectedRow
{
get;
set;
}
}
}
Добавляем в окне Solution Explorer новый проект Windows Control Library и называем его FindControl.
Это пользовательский элемент управления, с которыми мы сталкивались в лекции 3.
Добавляем на форму три кнопки в соответствии с рис. 11.44.
(рис 11.44) Форма FindControlЛистинг формы FindControl:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Reflection;
using SelectingFormInterface;
namespace FindControl
{
public delegate void RowSelectedDelegate(FindControl findControl, DataTable table);
public class FindControl : System.Windows.Forms.UserControl
{
/// <summary>
/// Событие генерируется, когда выбрана запись из формы поиска в режиме диалога
/// </summary>
public event RowSelectedDelegate RowSelected;
private ISelectingForm selectingForm = null;
public ISelectingForm SelectingForm
{
get { return selectingForm; }
set { selectingForm = value; }
}
private Form personForm = null;
public Form PersonForm
{
get { return personForm; }
set { personForm = value; }
}
private string text = "";
public override string Text
{
get
{
return text;
}
set
{
text = value;
btnFind.Text = text;
}
}
private DataRow targetRow = null;
/// <summary>
/// Запись, в которую добавляется значение из формы поиска и выбора
/// </summary>
public DataRow TargetRow
{
get { return targetRow; }
set { targetRow = value; }
}
private string columnName = null;
private System.Windows.Forms.Button btnData;
/// <summary>
/// Название колонки, в которую можно добавить номер выбранной записи из формы поиска и выбора
/// </summary>
public string ColumnName
{
get { return columnName; }
set { columnName = value; }
}
private DataTable table = null;
/// <summary>
/// Таблица, в которую добавляется запись
/// </summary>
public DataTable Table
{
get { return table; }
set { table = value; }
}
public FindControl()
{
InitializeComponent();
this.btnCancel.Click += new EventHandler(btnCancel_Click);
this.btnFind.Click += new EventHandler(btnFind_Click);
this.btnData.Click += new EventHandler(btnData_Click);
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components.Dispose();
}
base.Dispose( disposing );
}
#region Component Designer generated code
private void InitializeComponent()
{
// Описание метода
}
#endregion
private void btnCancel_Click(object sender, EventArgs e)
{
this.Visible = true;
this.Dispose();
}
private void btnFind_Click(object sender, EventArgs e)
{
try
{
Form form = (Form)this.SelectingForm;
if (form.ShowDialog() == DialogResult.OK)
RowSelected(this, this.Table);
btnCancel_Click(btnCancel, new EventArgs());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, ex.Source);
}
}
public override string ToString()
{
return "FindControl";
}
private void btnData_Click(object sender, EventArgs e)
{
if (personForm == null)
{
MessageBox.Show("Нет данных для отображения формы");
return;
}
personForm.ShowDialog();
this.Dispose();
}
}
}
На диске, прилагаемом к книге, вы найдете приложение EducationCenter (Code\Glava11\ Manager).
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.