Создание Windows-приложений на основе Visual C#

Финальный проект — программа education center

Разбить на страницы
Показывать лекцию целиком
Для работы с данной лекцией используйте примеры.

Когда вы заканчиваете изучать очередной учебник по программированию, даже как следует разобравшись со всеми его примерами, вы задаетесь вопросом — как же научиться собирать все эти детали мозаики в целое, из чего и состоят программы? Эта лекция целиком посвящена достаточно сложной программе Education center, используемой на практике в крупном учебном центре для организации его деятельности. Почему же решено было написать свою программу, а не воспользоваться одним из существующих пакетов делопроизводства, например, мощным пакетом "1С Бухгалтерия"? Дело в том, что была необходимость в создании программы с предельно ясным и понятным интерфейсом, различным для трех групп пользователей — администраторов, менеджеров или операторов. В программе есть три группы пользователей:

  • Administrators — администраторы, обладающие максимальным уровнем доступа.
  • Managers — менеджеры, управляющие одним направлением обучения.
  • Recipients — операторы, регистрирующие клиентов и вносящие данные об оплате.
  • Если пользователь не входит ни в одну группу, тогда он принадлежит группе 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.2).
  • "Основные таблицы" — выводится содержимое таблиц базы (рис. 11.3).
  • "Оплаты" — вывод приходов и расходов по учебному центру (рис. 11.4).
  • "Проводник" — выводится иерархическая структура курсов, предлагаемых учебным центром. Также можно быстро управлять направлениями, курсами, группами и клиентами в группах (рис. 11.5).
  • Статистика — здесь можно посмотреть статистику по должникам в данном направлении (рис. 11.6).
  • (рис 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.10).
  • "Оплата и реализация" — учет платежей клиента (рис. 11.12).
  • "Архив" — данные об оплаченных и реализованных суммах клиента (рис. 11.13).
  • "Группы клиента" — номера групп клиента, в которых он был записан (рис. 11.14).
  • (рис 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 Income Денежные приходы
    11 Payment_type Виды оплат
    12 PlanRealization Разницы между суммой прихода и реализованной суммой
    13 RealizedTable Реализованные деньги клиентов

    Структура таблиц

    Clients
    ПолеТип данныхОписание
    ClientID Счетчик Номер клиента
    Fname Текстовый Имя
    Lname Текстовый Фамилия
    FathName Текстовый Отчество
    LinkData Текстовый Контактные данные
    Recorddate Дата/Время Дата записи
    Note Текстовый Заметки
    PaymentType Текстовый Вид оплаты
    IsRinged Логический Был ли оповещен клиент по телефону
    Course
    ПолеТип данныхОписание
    CourseID Счетчик Номер курса
    CourseName Текстовый Название курса
    PriceText Текстовый Цена в виде текста
    DirectionID Числовой Номер направления
    PriceNumber Числовой Цена курса
    Note Текстовый Заметки по курсу
    Data
    ПолеТип данныхОписание
    DataID Счетчик Номер
    CurrentDate Дата/Время Текущая дата
    amountYesterday Денежный Всего вчера
    AmountToday Денежный Всего сегодня
    IncomeToday Денежный Приход на сегодня
    expanseToday Денежный Расход на сегодня
    Note Текстовый Заметки
    Directions
    ПолеТип данныхОписание
    DirectionID Счетчик Номер направления
    DirectName Текстовый Наименование направления
    Note Текстовый Заметки
    Employees
    ПолеТип данныхОписание
    EmployeeID Счетчик Номер сотрудника
    LastName Текстовый Фамилия
    FirstName Текстовый Имя
    FatherName Текстовый Отчество
    LinkData Текстовый Контактные данные
    BirthDay Дата/Время Дата рождения
    DirectionID Числовой Номер направления
    Address Текстовый Адрес
    Notes Текстовый Заметки
    Expenses
    ПолеТип данныхОписание
    ExpenseID Счетчик Номер расхода
    DataID Числовой Номер даты
    Note Текстовый Заметки
    Summa Денежный Сумма прихода
    ClientID Числовой Номер клиента
    EmployeeID Числовой Номер сотрудника
    payment_typeID Числовой Номер вида оплаты
    Group_clients
    ПолеТип данныхОписание
    GroupClientID Счетчик Номер
    GroupID Числовой Номер группы
    ClientID Числовой Номер клиента
    IsPaid Логический Оплатил
    Notes Текстовый Заметки
    Groups
    ПолеТип данныхОписание
    GroupID Счетчик Номер группы
    BeginDate Дата/время Дата начала обучения
    EndDate Дата/время Дата конца обучения
    BeginTime Дата/время Время начала обучения
    EndTime Дата/время Время конца обучения
    ClientsCount Числовой Кол-во клиентов в группе
    ClassNumber Числовой Номер класса
    CourseID Числовой Номер курса
    EmployeeID Числовой Номер преподователя в группе
    Note Текстовый Заметки
    StatusID Числовой Номер статуса группы
    GroupStatus
    ПолеТип данныхОписание
    StatusID Счетчик Номер статуса
    StatusName Текстовый Наименование
    Income
    ПолеТип данныхОписание
    IncomeID Счетчик Номер прихода
    IsRealized Логический Сумма реализована
    DataID Числовой Номер даты
    Summa Денежный Сумма прихода
    payment_typeID Числовой Номер вида оплаты
    Note Текстовый Заметки
    ClientID Числовой Номер клиента
    Payment_type
    ПолеТип данныхОписание
    payment_typeID Счетчик Номер вида оплаты
    payment_typeName Текстовый Вид оплаты
    Note Текстовый Заметки
    PlanRealization
    ПолеТип данныхОписание
    ID Счетчик Номер записи
    IncomeID Числовой Номер прихода
    SummaPlan Денежный Запланнированная сумма
    SummaRealization Денежный Реализованная сумма
    IsRealized Логический Реализовано
    DateRealization Дата/время Дата реализации
    Cause Текстовый Причина реализации
    RealizedTable
    ПолеТип данныхОписание
    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 проводника

    Описание создания программы

    Далее мы последовательно будет создавать приложение Education Center. В окончательном итоге был создан результирующий файл Manager.sln (Code\Glava11\Educationcenter\Manager), содержащий ссылки на все промежуточные проекты. В папке также имеются отдельные проекты — например, пользовательские элементы управления.

    Для каждой формы я привожу рисунок, на котором имеются надписи свойства Name элементов. Для большинства элементов в тексте я также привожу значения свойств, определяемых в режиме дизайна. Впрочем, большинство незначительных свойств лучше попытаться восстановить по внешнему виду, приводимому на соответствующих рисунках. Возможно, вам даже удастся найти более оптимальные значения. Если же вы будете затрудняться в настройке этих элементов — смотрите исходные проекты. (Напомню, что свойства элементов, значения которых были изменены, выделяются жирным шрифтом)

    Методы InitializeComponent, Dispose, а также объявление элементов управлений во всех классах были убраны. Эти места выделены жирным шрифтом. Все комментарии, а также документирование XML-тегами в кодах также выделены жирным шрифтом.

    Форма frmManager (Manager.cs)

    Свойству Text формы устанавливаем значение Education Center.

    Помещаем на форму из окна ToolBox следующие элементы управления:

  • ToolBar. Называем его tbMain. В коллекцию Buttons элемента tbMain добавляем кнопки класса ToolBarButton:
  • tbnRefreshMainDB — кнопка обновления главной БД;
  • tbnEmployees — кнопка открытия формы сотрудников frmEmployees ;
  • tbnFind — кнопка открытия формы поиска клиентов frmSearchClient.
  • Создаем обработчик события ButtonClick для tbMain (см. код), который управляет функциональностью нажатия кнопок на tbMain.

  • TabControl. Называем его tcManager.
  • Свойству Dock элемента tcManager устанавливаем значение Fill. В коллекцию TabPages элемента tcManager добавляем вкладки класса TabPage:
  • tpWaitingRoom — свойству Text устанавливаем значение "Приемная";
  • tpBaseTables — свойству Text устанавливаем значение "Основные таблицы";
  • tpPayment — свойству Text устанавливаем значение "Оплаты";
  • tpExplorer — свойству Text устанавливаем значение "Проводник";
  • tpStatistic — свойству Text устанавливаем значение "Статистика".
  • Помещаем панель на страницу tpWaitingRoom, и свойству Dock панели устанавливаем Bottom. В нее добавляем кнопки btnCreateGroup (свойство Text у кнопки "Создать группу"), btnDeleteGroup (свойство Text у кнопки "Удалить группу"), btnCreateClient (свойство Text у кнопки "Создать клиента"), btnDeleteClient (свойство Text у кнопки "Удалить клиента"). Для этих кнопок создаем обработчики события Click ( btnCreateGroup_Click, btnDeleteGroup_Click, btnCreateClient_Click, btnDeleteClient_Click соответственно, см. код программы)
  • На эту же страницу добавляем другую панель, и свойству Dock панели устанавливаем Top. Помещаем на эту панель 2 элемента ComboBox: cmbDirections и cmbGroupStatus и 2 Label-а со свойствами Text "Направления" и "Отображаемые группы". Для этих элементов ComboBox создаем обработчики события SelectionChangeCommitted (и реализацию этих обработчиков в коде программы). Затем на эту же панель добавляем кнопку btnShowGroups, которая будет заполнять курсы данного выбранного направления и группы с данным выбранным статусом. Создаем для этой кнопки обработчик события Click (см. код программы).
  • На эту же страницу добавляем еще панель, и свойству Dock панели устанавливаем Fill. В эту панель добавляем DataGrid dgCourses (свойству Dock устанавливаем значение Left, а свойству CaptionText устанавливаем значение "Курсы"), Splitter (не изменяем свойства), панель (свойству Dock устанавливаем Fill ). В последнюю добавленную панель добавляем DataGrid dgGroups (свойству Dock устанавливаем Top, а свойству CaptionText устанавливаем значение "Группы"), Splitter (свойству Dock устанавливаем значение Top ), DataGrid dgClients (свойству Dock устанавливаем значение Fill, а свойству CaptionText устанавливаем значение "Клиенты") (рис. 11.25).
  • (рис 11.26) Форма frmManager, страница "Приемная"
  • Переходим на страницу "Основные таблицы". Помещаем на страницу панель (свойству Dock устанавливаем значение Right ), DataGrid dgMainTable (свойству Dock устанавливаем значение Left ). На панель добавляем GroupBox и несколько элементов RadioButton: rbClients, rbGroups, rbCourses, rbDirections, rbIncomeMain, rbOutMain, rbRealizedTableMain, rbPaymentTypeMain, rbDataMain, rbGroupClientsMain, rbStatusMain со свойствами Text "Клиенты", "Группы", "Курсы", "Направления", "Приходы", "Расходы", "Реализация", "Виды оплат", "Данные", "Группы-Клиенты", "Статусы группы" соответственно. Для радиокнопки rbClients создаем обработчик события CheckedChanged, и у остальных RadioButton-ов из окна событий выбираем на событие CheckedChanged обработчик rbClients_ CheckedChanged. В итоге у всех RadioButton-ов будет один и тот же обработчик события —rbClients_ CheckedChanged (см. код программы). (рис. 11.27).
  • (рис 11.27) Форма frmManager, страница "Основные таблицы"
  • Переходим на страницу "Оплаты". Помещаем на страницу панель (свойству Dock устанавливаем значение Bottom), на эту панель помещаем 5 элементов TextBox txtResultIncome, txtResultOut, txtBalance, txtYesterdaySumm, txtResultCount со свойствами Text "Итого приход", "Итого расход", "Баланс", "Вчера" и "Всего" соответственно. Добавляем Button btnCalculate и создаем для него обработчик события Click (см. код программы). Также на эту панель помещаем 2 кнопки навигации по записям btnNextDate и btnPrevDate. Для каждой из кнопок создаем обработчиков события Click. Помещаем кнопку btnShowPaymentTypeForm, которая будет открывать форму frmPaymentType, и создаем для этой кнопки обработчик события Click. Помещаем на эту же страницу еще одну панель (свойству Dock устанавливаем значение Fill ), на эту панель помещаем DataGrid dgIncome (свойству Dock устанавливаем значение Left, свойству CaptionText устанавливаем значение "Приход"), Splitter и DataGrid dgOut (свойству Dock устанавливаем значение Fill, свойству CaptionText устанавливаем значение "Расход") ( рис. 11.28).
  • (рис 11.28) Форма frmManager, страница "Оплаты"
  • Переходим на страницу "Проводник". Помещаем на эту страницу панель (свойству Dock устанавливаем значение Bottom ), на эту панель помещаем StatusBar sbMain, добавляем на страницу другую панель (свойству Dock устанавливаем значение Fill ), на эту панель помещаем TreeView tvManager (свойству Dock устанавливаем значение Left ), Splitter, ListView lvManager (свойству Dock устанавливаем значение Fill ). Для tvManager создаем обработчики tvManager_AfterSelect, а для lvManagerlvManager_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.

    Методы формы frmManager
    Сигнатура методовОписание методов
    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		
    
    	}
    }

    Форма frmAuthorization — форма авторизации пользователей

    При запуске программы пользователь вводит свой логин в домене и пароль (см. рис. 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();
    		}
    	}
    }

    Форма frmDirection — форма указания направления

    Эта форма используется для создания новых учебных направлений в окне проводника главной формы. Для добавления направления щелкаем в проводнике правой кнопкой и в появившемся контекстном меню выбираем 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();
    		}
    	}
    }

    Форма frmClientTransfer — форма перевода клиента

    При копировании клиента из группы и последующей его вставки в другую группу появляется промежуточная форма перевода. Для ее создания помещаем на форму из окна 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();
    		}
    	}
    }

    Форма frmSearchClient — форма для поиска клиентов

    В программе реализована возможность поиска клиентов по фамилии, имени или дате записи. Располагаем на форме элементы управления, изображенные на рис. 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

    Форма 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;
    		}
    	}
    }

    Форма frmCourse — форма курсов

    При выборе одного из направлений в проводнике можно добавлять новые курсы, щелкнув правой кнопкой и выбрав в контекстном меню пункт 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

    В программе предусмотрена возможность извлечения, добавления и изменения информации о сотрудниках центра. Для этого используется форма 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 — форма добавления новой группы

    Для добавления группы по выбранному курсу используется форма 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;
    				}
    			}
    		}
    	}
    }

    Форма frmPaymentType — форма для произведения оплаты за услуги

    На вкладке "Оплаты" при нажатии на одноименную кнопку появляется окно, в котором можно указывать вид расчетов. Добавляем элементы управления в соответствии с рис. 11.43.

    (рис 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);
    			}
    		}
    	}
    }

    Дополнительные классы

    В проекте были использованы дополнительные классы, листинг которых приводится далее.

    Класс ManagerTreeNode(ManagerTreeNode.cs)

    using System;
    using System.Windows.Forms;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace Manager
    {
    	internal abstract class ManagerTreeNode : TreeNode
    	{
    		internal abstract void GetChilds();
    	}
    }

    Класс ClientTreeNode(Clients.cs)

    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;
    		}
    	}
    }

    Класс GroupTreeNode (Groups.cs)

    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);
    		}
    	}
    }

    Класс CourseTreeNode (Courses.cs)

    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);		
    		}
    	}
    }

    Класс DirectionTreeNode(Directions.cs)

    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);
    		}
    	}
    }

    Класс CustomListItem(CustomListItem.cs)

    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; }
    		}
    	}
    }

    Интерфейс ISelectingForm(SelectingFormInterface.cs)

    Этот интерфейс наследуют формы, в которых можно выбирать какие-нибудь записи:

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace SelectingFormInterface
    {
    	public interface ISelectingForm 
    	{
    		DataRow SelectedRow
    		{
    			get;
    			set;
    		}
    	}
    }

    Элемент управления FindControl (FindControl.cs)

    Добавляем в окне 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).

    Страницы:
    Для работы с данной лекцией используйте примеры.

    Когда вы заканчиваете изучать очередной учебник по программированию, даже как следует разобравшись со всеми его примерами, вы задаетесь вопросом — как же научиться собирать все эти детали мозаики в целое, из чего и состоят программы? Эта лекция целиком посвящена достаточно сложной программе Education center, используемой на практике в крупном учебном центре для организации его деятельности. Почему же решено было написать свою программу, а не воспользоваться одним из существующих пакетов делопроизводства, например, мощным пакетом "1С Бухгалтерия"? Дело в том, что была необходимость в создании программы с предельно ясным и понятным интерфейсом, различным для трех групп пользователей — администраторов, менеджеров или операторов. В программе есть три группы пользователей:

  • Administrators — администраторы, обладающие максимальным уровнем доступа.
  • Managers — менеджеры, управляющие одним направлением обучения.
  • Recipients — операторы, регистрирующие клиентов и вносящие данные об оплате.
  • Если пользователь не входит ни в одну группу, тогда он принадлежит группе 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.2).
  • "Основные таблицы" — выводится содержимое таблиц базы (рис. 11.3).
  • "Оплаты" — вывод приходов и расходов по учебному центру (рис. 11.4).
  • "Проводник" — выводится иерархическая структура курсов, предлагаемых учебным центром. Также можно быстро управлять направлениями, курсами, группами и клиентами в группах (рис. 11.5).
  • Статистика — здесь можно посмотреть статистику по должникам в данном направлении (рис. 11.6).
  • (рис 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.10).
  • "Оплата и реализация" — учет платежей клиента (рис. 11.12).
  • "Архив" — данные об оплаченных и реализованных суммах клиента (рис. 11.13).
  • "Группы клиента" — номера групп клиента, в которых он был записан (рис. 11.14).
  • (рис 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 Income Денежные приходы
    11 Payment_type Виды оплат
    12 PlanRealization Разницы между суммой прихода и реализованной суммой
    13 RealizedTable Реализованные деньги клиентов

    Структура таблиц

    Clients
    ПолеТип данныхОписание
    ClientID Счетчик Номер клиента
    Fname Текстовый Имя
    Lname Текстовый Фамилия
    FathName Текстовый Отчество
    LinkData Текстовый Контактные данные
    Recorddate Дата/Время Дата записи
    Note Текстовый Заметки
    PaymentType Текстовый Вид оплаты
    IsRinged Логический Был ли оповещен клиент по телефону
    Course
    ПолеТип данныхОписание
    CourseID Счетчик Номер курса
    CourseName Текстовый Название курса
    PriceText Текстовый Цена в виде текста
    DirectionID Числовой Номер направления
    PriceNumber Числовой Цена курса
    Note Текстовый Заметки по курсу
    Data
    ПолеТип данныхОписание
    DataID Счетчик Номер
    CurrentDate Дата/Время Текущая дата
    amountYesterday Денежный Всего вчера
    AmountToday Денежный Всего сегодня
    IncomeToday Денежный Приход на сегодня
    expanseToday Денежный Расход на сегодня
    Note Текстовый Заметки
    Directions
    ПолеТип данныхОписание
    DirectionID Счетчик Номер направления
    DirectName Текстовый Наименование направления
    Note Текстовый Заметки
    Employees
    ПолеТип данныхОписание
    EmployeeID Счетчик Номер сотрудника
    LastName Текстовый Фамилия
    FirstName Текстовый Имя
    FatherName Текстовый Отчество
    LinkData Текстовый Контактные данные
    BirthDay Дата/Время Дата рождения
    DirectionID Числовой Номер направления
    Address Текстовый Адрес
    Notes Текстовый Заметки
    Expenses
    ПолеТип данныхОписание
    ExpenseID Счетчик Номер расхода
    DataID Числовой Номер даты
    Note Текстовый Заметки
    Summa Денежный Сумма прихода
    ClientID Числовой Номер клиента
    EmployeeID Числовой Номер сотрудника
    payment_typeID Числовой Номер вида оплаты
    Group_clients
    ПолеТип данныхОписание
    GroupClientID Счетчик Номер
    GroupID Числовой Номер группы
    ClientID Числовой Номер клиента
    IsPaid Логический Оплатил
    Notes Текстовый Заметки
    Groups
    ПолеТип данныхОписание
    GroupID Счетчик Номер группы
    BeginDate Дата/время Дата начала обучения
    EndDate Дата/время Дата конца обучения
    BeginTime Дата/время Время начала обучения
    EndTime Дата/время Время конца обучения
    ClientsCount Числовой Кол-во клиентов в группе
    ClassNumber Числовой Номер класса
    CourseID Числовой Номер курса
    EmployeeID Числовой Номер преподователя в группе
    Note Текстовый Заметки
    StatusID Числовой Номер статуса группы
    GroupStatus
    ПолеТип данныхОписание
    StatusID Счетчик Номер статуса
    StatusName Текстовый Наименование
    Income
    ПолеТип данныхОписание
    IncomeID Счетчик Номер прихода
    IsRealized Логический Сумма реализована
    DataID Числовой Номер даты
    Summa Денежный Сумма прихода
    payment_typeID Числовой Номер вида оплаты
    Note Текстовый Заметки
    ClientID Числовой Номер клиента
    Payment_type
    ПолеТип данныхОписание
    payment_typeID Счетчик Номер вида оплаты
    payment_typeName Текстовый Вид оплаты
    Note Текстовый Заметки
    PlanRealization
    ПолеТип данныхОписание
    ID Счетчик Номер записи
    IncomeID Числовой Номер прихода
    SummaPlan Денежный Запланнированная сумма
    SummaRealization Денежный Реализованная сумма
    IsRealized Логический Реализовано
    DateRealization Дата/время Дата реализации
    Cause Текстовый Причина реализации
    RealizedTable
    ПолеТип данныхОписание
    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 проводника

    Описание создания программы

    Далее мы последовательно будет создавать приложение Education Center. В окончательном итоге был создан результирующий файл Manager.sln (Code\Glava11\Educationcenter\Manager), содержащий ссылки на все промежуточные проекты. В папке также имеются отдельные проекты — например, пользовательские элементы управления.

    Для каждой формы я привожу рисунок, на котором имеются надписи свойства Name элементов. Для большинства элементов в тексте я также привожу значения свойств, определяемых в режиме дизайна. Впрочем, большинство незначительных свойств лучше попытаться восстановить по внешнему виду, приводимому на соответствующих рисунках. Возможно, вам даже удастся найти более оптимальные значения. Если же вы будете затрудняться в настройке этих элементов — смотрите исходные проекты. (Напомню, что свойства элементов, значения которых были изменены, выделяются жирным шрифтом)

    Методы InitializeComponent, Dispose, а также объявление элементов управлений во всех классах были убраны. Эти места выделены жирным шрифтом. Все комментарии, а также документирование XML-тегами в кодах также выделены жирным шрифтом.

    Форма frmManager (Manager.cs)

    Свойству Text формы устанавливаем значение Education Center.

    Помещаем на форму из окна ToolBox следующие элементы управления:

  • ToolBar. Называем его tbMain. В коллекцию Buttons элемента tbMain добавляем кнопки класса ToolBarButton:
  • tbnRefreshMainDB — кнопка обновления главной БД;
  • tbnEmployees — кнопка открытия формы сотрудников frmEmployees ;
  • tbnFind — кнопка открытия формы поиска клиентов frmSearchClient.
  • Создаем обработчик события ButtonClick для tbMain (см. код), который управляет функциональностью нажатия кнопок на tbMain.

  • TabControl. Называем его tcManager.
  • Свойству Dock элемента tcManager устанавливаем значение Fill. В коллекцию TabPages элемента tcManager добавляем вкладки класса TabPage:
  • tpWaitingRoom — свойству Text устанавливаем значение "Приемная";
  • tpBaseTables — свойству Text устанавливаем значение "Основные таблицы";
  • tpPayment — свойству Text устанавливаем значение "Оплаты";
  • tpExplorer — свойству Text устанавливаем значение "Проводник";
  • tpStatistic — свойству Text устанавливаем значение "Статистика".
  • Помещаем панель на страницу tpWaitingRoom, и свойству Dock панели устанавливаем Bottom. В нее добавляем кнопки btnCreateGroup (свойство Text у кнопки "Создать группу"), btnDeleteGroup (свойство Text у кнопки "Удалить группу"), btnCreateClient (свойство Text у кнопки "Создать клиента"), btnDeleteClient (свойство Text у кнопки "Удалить клиента"). Для этих кнопок создаем обработчики события Click ( btnCreateGroup_Click, btnDeleteGroup_Click, btnCreateClient_Click, btnDeleteClient_Click соответственно, см. код программы)
  • На эту же страницу добавляем другую панель, и свойству Dock панели устанавливаем Top. Помещаем на эту панель 2 элемента ComboBox: cmbDirections и cmbGroupStatus и 2 Label-а со свойствами Text "Направления" и "Отображаемые группы". Для этих элементов ComboBox создаем обработчики события SelectionChangeCommitted (и реализацию этих обработчиков в коде программы). Затем на эту же панель добавляем кнопку btnShowGroups, которая будет заполнять курсы данного выбранного направления и группы с данным выбранным статусом. Создаем для этой кнопки обработчик события Click (см. код программы).
  • На эту же страницу добавляем еще панель, и свойству Dock панели устанавливаем Fill. В эту панель добавляем DataGrid dgCourses (свойству Dock устанавливаем значение Left, а свойству CaptionText устанавливаем значение "Курсы"), Splitter (не изменяем свойства), панель (свойству Dock устанавливаем Fill ). В последнюю добавленную панель добавляем DataGrid dgGroups (свойству Dock устанавливаем Top, а свойству CaptionText устанавливаем значение "Группы"), Splitter (свойству Dock устанавливаем значение Top ), DataGrid dgClients (свойству Dock устанавливаем значение Fill, а свойству CaptionText устанавливаем значение "Клиенты") (рис. 11.25).
  • (рис 11.26) Форма frmManager, страница "Приемная"
  • Переходим на страницу "Основные таблицы". Помещаем на страницу панель (свойству Dock устанавливаем значение Right ), DataGrid dgMainTable (свойству Dock устанавливаем значение Left ). На панель добавляем GroupBox и несколько элементов RadioButton: rbClients, rbGroups, rbCourses, rbDirections, rbIncomeMain, rbOutMain, rbRealizedTableMain, rbPaymentTypeMain, rbDataMain, rbGroupClientsMain, rbStatusMain со свойствами Text "Клиенты", "Группы", "Курсы", "Направления", "Приходы", "Расходы", "Реализация", "Виды оплат", "Данные", "Группы-Клиенты", "Статусы группы" соответственно. Для радиокнопки rbClients создаем обработчик события CheckedChanged, и у остальных RadioButton-ов из окна событий выбираем на событие CheckedChanged обработчик rbClients_ CheckedChanged. В итоге у всех RadioButton-ов будет один и тот же обработчик события —rbClients_ CheckedChanged (см. код программы). (рис. 11.27).
  • (рис 11.27) Форма frmManager, страница "Основные таблицы"
  • Переходим на страницу "Оплаты". Помещаем на страницу панель (свойству Dock устанавливаем значение Bottom), на эту панель помещаем 5 элементов TextBox txtResultIncome, txtResultOut, txtBalance, txtYesterdaySumm, txtResultCount со свойствами Text "Итого приход", "Итого расход", "Баланс", "Вчера" и "Всего" соответственно. Добавляем Button btnCalculate и создаем для него обработчик события Click (см. код программы). Также на эту панель помещаем 2 кнопки навигации по записям btnNextDate и btnPrevDate. Для каждой из кнопок создаем обработчиков события Click. Помещаем кнопку btnShowPaymentTypeForm, которая будет открывать форму frmPaymentType, и создаем для этой кнопки обработчик события Click. Помещаем на эту же страницу еще одну панель (свойству Dock устанавливаем значение Fill ), на эту панель помещаем DataGrid dgIncome (свойству Dock устанавливаем значение Left, свойству CaptionText устанавливаем значение "Приход"), Splitter и DataGrid dgOut (свойству Dock устанавливаем значение Fill, свойству CaptionText устанавливаем значение "Расход") ( рис. 11.28).
  • (рис 11.28) Форма frmManager, страница "Оплаты"
  • Переходим на страницу "Проводник". Помещаем на эту страницу панель (свойству Dock устанавливаем значение Bottom ), на эту панель помещаем StatusBar sbMain, добавляем на страницу другую панель (свойству Dock устанавливаем значение Fill ), на эту панель помещаем TreeView tvManager (свойству Dock устанавливаем значение Left ), Splitter, ListView lvManager (свойству Dock устанавливаем значение Fill ). Для tvManager создаем обработчики tvManager_AfterSelect, а для lvManagerlvManager_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.

    Методы формы frmManager
    Сигнатура методовОписание методов
    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		
    
    	}
    }

    Форма frmAuthorization — форма авторизации пользователей

    При запуске программы пользователь вводит свой логин в домене и пароль (см. рис. 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();
    		}
    	}
    }

    Форма frmDirection — форма указания направления

    Эта форма используется для создания новых учебных направлений в окне проводника главной формы. Для добавления направления щелкаем в проводнике правой кнопкой и в появившемся контекстном меню выбираем 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();
    		}
    	}
    }

    Форма frmClientTransfer — форма перевода клиента

    При копировании клиента из группы и последующей его вставки в другую группу появляется промежуточная форма перевода. Для ее создания помещаем на форму из окна 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();
    		}
    	}
    }

    Форма frmSearchClient — форма для поиска клиентов

    В программе реализована возможность поиска клиентов по фамилии, имени или дате записи. Располагаем на форме элементы управления, изображенные на рис. 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

    Форма 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;
    		}
    	}
    }

    Форма frmCourse — форма курсов

    При выборе одного из направлений в проводнике можно добавлять новые курсы, щелкнув правой кнопкой и выбрав в контекстном меню пункт 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

    В программе предусмотрена возможность извлечения, добавления и изменения информации о сотрудниках центра. Для этого используется форма 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 — форма добавления новой группы

    Для добавления группы по выбранному курсу используется форма 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;
    				}
    			}
    		}
    	}
    }

    Форма frmPaymentType — форма для произведения оплаты за услуги

    На вкладке "Оплаты" при нажатии на одноименную кнопку появляется окно, в котором можно указывать вид расчетов. Добавляем элементы управления в соответствии с рис. 11.43.

    (рис 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);
    			}
    		}
    	}
    }

    Дополнительные классы

    В проекте были использованы дополнительные классы, листинг которых приводится далее.

    Класс ManagerTreeNode(ManagerTreeNode.cs)

    using System;
    using System.Windows.Forms;
    using System.Data;
    using System.Data.SqlClient;
    
    namespace Manager
    {
    	internal abstract class ManagerTreeNode : TreeNode
    	{
    		internal abstract void GetChilds();
    	}
    }

    Класс ClientTreeNode(Clients.cs)

    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;
    		}
    	}
    }

    Класс GroupTreeNode (Groups.cs)

    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);
    		}
    	}
    }

    Класс CourseTreeNode (Courses.cs)

    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);		
    		}
    	}
    }

    Класс DirectionTreeNode(Directions.cs)

    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);
    		}
    	}
    }

    Класс CustomListItem(CustomListItem.cs)

    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; }
    		}
    	}
    }

    Интерфейс ISelectingForm(SelectingFormInterface.cs)

    Этот интерфейс наследуют формы, в которых можно выбирать какие-нибудь записи:

    using System;
    using System.Data;
    using System.Windows.Forms;
    
    namespace SelectingFormInterface
    {
    	public interface ISelectingForm 
    	{
    		DataRow SelectedRow
    		{
    			get;
    			set;
    		}
    	}
    }

    Элемент управления FindControl (FindControl.cs)

    Добавляем в окне 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).

    Вернуться к учебному плану