Опубликован: 11.09.2006 | Доступ: свободный | Студентов: 7649 / 473 | Оценка: 4.26 / 3.45 | Длительность: 30:46:00
ISBN: 978-5-9556-0080-2
Лекция 11:

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

< Лекция 10 || Лекция 11: 1234567891011

Соединение с базой данных

После того как на форме были размещены элементы управления, на форму необходимо добавить элементы управления для подключения к базе данных.

Открываем окно 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; }
		}
Листинг 11.1.

Добавим в класс формы frmManager методы, указываемые в таблице 11.17.

Таблица 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		

	}
}
Листинг 11.2.

Форма 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();
		}
	}
}
Листинг 11.3.
< Лекция 10 || Лекция 11: 1234567891011
Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/