Опубликован: 11.09.2006 | Уровень: специалист | Доступ: платный
Лекция 11:

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

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

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

При выборе одного из направлений в проводнике можно добавлять новые курсы, щелкнув правой кнопкой и выбрав в контекстном меню пункт New/Сourse (рис. 11.39):

Добавление нового курса

увеличить изображение
Рис. 11.39. Добавление нового курса

Располагаем элементы управления и называем их в соответствии с рис. 11.40.

Форма frmCourse

Рис. 11.40. Форма frmCourse

Листинг формы frmCourse:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace Manager
{
	/// <summary>
	/// Форма курса
	/// </summary>
	public class frmCourse : System.Windows.Forms.Form
	{
		// Объявление элементов управления	
public frmCourse()
		{
			InitializeComponent();

		}

		private DataRow bindingRow;
		internal DataRow BindingRow
		{
			get { return bindingRow; }
			set { bindingRow = value; }
		}

		public frmCourse(DataRow bindingRow)
		{
			InitializeComponent();

			this.bindingRow = bindingRow;
			this.lblCourseNumber.Text += bindingRow.ItemArray[0].ToString();
			this.txtCourseName.Text = bindingRow.ItemArray[1].ToString();
			this.txtCoursePrice.Text = bindingRow.ItemArray[4].ToString();
		}
		
		protected override void Dispose( bool disposing )
		{
// Описание метода
		}

		private void InitializeComponent()
		{
			// Описание метода
		}

		private void txtCourseName_Validated(object sender, System.EventArgs e)
		{
			if (this.bindingRow != null)
				if (txtCourseName.Text != this.bindingRow["courseName"].ToString())
				{
					this.bindingRow["courseName"] = txtCourseName.Text;
				}
		}

		private void txtCoursePrice_Validated(object sender, System.EventArgs e)
		{
			if (this.bindingRow != null)
				if (double.Parse(txtCourseName.Text) != (double)this.bindingRow["priceNumber"])
				{
					this.bindingRow["priceNumber"] = double.Parse(txtCourseName.Text);
				}
		}

		private void frmCourse_Load(object sender, System.EventArgs e)
		{
			txtCourseName.Focus();
		}
	}
}
Листинг 11.8.

Форма frmEmployee

В программе предусмотрена возможность извлечения, добавления и изменения информации о сотрудниках центра. Для этого используется форма frmEmployee, добавляем элементы управления в соответствии с рис. 11.41.

Форма frmEmployee

увеличить изображение
Рис. 11.41. Форма frmEmployee

Класс формы frmEmployee наследуем от интерфейса ISelectingForm.

Листинг формы frmEmployee:

using System;
using System.Data;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using SelectingFormInterface;
using Manager.Forms;

namespace Manager
{
	public class frmEmployee : System.Windows.Forms.Form, ISelectingForm
	{
// Объявление элементов управления

		#region IFindingForm Members

		private DataRow selectedRow = null;
		public DataRow SelectedRow
		{
			get { return selectedRow; }
			set { selectedRow = value; }
		}

		#endregion

		public frmEmployee(MainDataSet mainDataSet)
		{
			InitializeComponent();

			this.mainDataSet = mainDataSet;
			this.InitDefaultSettings();
		}

		protected override void Dispose( bool disposing )
		{
// Описание метода
		}

		private void InitializeComponent()
		{
// Описание метода
		}

		private void InitDefaultSettings()
		{
			try
			{
				cmEmployees = (CurrencyManager)this.BindingContext[mainDataSet, "employees"];
			
				txtEmployeeFirstName.DataBindings.Add("Text", mainDataSet, "employees.FirstName");
				txtEmployeeLastName.DataBindings.Add("Text", mainDataSet, "employees.LastName");
				txtEmployeeFatherName.DataBindings.Add("Text", mainDataSet, "employees.FatherName");
				dtpBirthday.DataBindings.Add("Value", mainDataSet, "employees.birthDay");
				txtEmployeeNotes.DataBindings.Add("Text", mainDataSet, "employees.linkData");
				cmbDirections.DataBindings.Add("Text", mainDataSet, "employees.directionID");

				dgEmployees.DataSource = mainDataSet.employees;
				dgEmployees.MouseUp += new MouseEventHandler(dgEmployees_MouseUp);
				btnNext.Click += new EventHandler(btnNext_Click);
				btnPrev.Click += new EventHandler(btnPrev_Click);

				this.DesignDatagrid();
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message, ex.Source);
			}
		}

		private void miExit_Click(object sender, System.EventArgs e)
		{
			this.Close();
		}

		private void btnNext_Click(object sender, EventArgs e)
		{
			if (cmEmployees.Position < mainDataSet.employees.Rows.Count)
				cmEmployees.Position++;
			
		}

		private void btnPrev_Click(object sender, EventArgs e)
		{
			if (cmEmployees.Position > 0)
				cmEmployees.Position--;
		}

		private void SetSelectedRow(DataGrid dataGrid, DataGrid.HitTestInfo hti)
		{
			try
			{
				int rowIndex = hti.Row;
				DataTable table = (DataTable)dataGrid.DataSource;
				
				if (rowIndex == table.Rows.Count)
					return;				
				
				DataRow selectedRow = table.Rows[rowIndex];

				this.SelectedRow = selectedRow;
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message, ex.Source);
			}
		}

		private void dgEmployees_MouseUp(object sender, MouseEventArgs e)
		{
			DataGrid.HitTestInfo hti = dgEmployees.HitTest(e.X, e.Y);
			if ((hti.Row != -1) && (hti.Column != -1))
				SetSelectedRow(dgEmployees, hti);
		}

		private void DesignDatagrid()
		{
			DataGridTableStyle employeesTableStyle = new DataGridTableStyle();
			employeesTableStyle.MappingName = "employees";

			DataGridTextBoxColumn employeeIDStyle = new DataGridTextBoxColumn();
			employeeIDStyle.MappingName = "employeeID";
			employeeIDStyle.Width = 50;
			employeeIDStyle.HeaderText = "ID";

			DataGridTextBoxColumn lastNameStyle = new DataGridTextBoxColumn();
			lastNameStyle.MappingName = "LastName";
			lastNameStyle.Width = 120;
			lastNameStyle.HeaderText = "Фамилия";

			DataGridTextBoxColumn firstNameStyle = new DataGridTextBoxColumn();
			firstNameStyle.MappingName = "FirstName";
			firstNameStyle.Width = 150;
			firstNameStyle.HeaderText = "Имя";

			DataGridTextBoxColumn fatherNameStyle = new DataGridTextBoxColumn();
			fatherNameStyle.MappingName = "amountToday";
			fatherNameStyle.Width = 150;
			fatherNameStyle.HeaderText = "Отчество";

			DataGridTextBoxColumn linkDataStyle = new DataGridTextBoxColumn();
			linkDataStyle.MappingName = "linkData";
			linkDataStyle.Width = 150;
			linkDataStyle.HeaderText = "Контакты";

			DataGridTextBoxColumn birthDayStyle = new DataGridTextBoxColumn();
			birthDayStyle.MappingName = "birthDay";
			birthDayStyle.Width = 100;
			birthDayStyle.HeaderText = "День рождения";

			DataGridTextBoxColumn directionIDStyle = new DataGridTextBoxColumn();
			directionIDStyle.MappingName = "directionID";
			directionIDStyle.Width = 60;
			directionIDStyle.HeaderText = "directionID";

			DataGridTextBoxColumn addressStyle = new DataGridTextBoxColumn();
			addressStyle.MappingName = "Address";
			addressStyle.Width = 300;
			addressStyle.HeaderText = "Адрес";

			DataGridTextBoxColumn notesStyle = new DataGridTextBoxColumn();
			notesStyle.MappingName = "Notes";
			notesStyle.Width = 100;
			notesStyle.HeaderText = "Notes";

			DataGridTextBoxColumn passportSerialNumberStyle = new DataGridTextBoxColumn();
			passportSerialNumberStyle.MappingName = "PassportSerialNumber";
			passportSerialNumberStyle.Width = 100;
			passportSerialNumberStyle.HeaderText = "Серия паспорта";

			DataGridTextBoxColumn dataPrinyatiyaStyle = new DataGridTextBoxColumn();
			dataPrinyatiyaStyle.MappingName = "DataP";
			dataPrinyatiyaStyle.Width = 100;
			dataPrinyatiyaStyle.HeaderText = "DataP";

			DataGridTextBoxColumn kStyle = new DataGridTextBoxColumn();
			kStyle.MappingName = "K";
			kStyle.Width = 100;
			kStyle.HeaderText = "K";

			DataGridTextBoxColumn postStyle = new DataGridTextBoxColumn();
			postStyle.MappingName = "Post";
			postStyle.Width = 100;
			postStyle.HeaderText = "Post";

			employeesTableStyle.GridColumnStyles.AddRange(new DataGridTextBoxColumn[] {
																					   employeeIDStyle, 
																					   lastNameStyle,
																					   firstNameStyle,
																					   fatherNameStyle,
																					   linkDataStyle, 
																					   birthDayStyle, 	
																					   directionIDStyle, 
																					   addressStyle, 
																					   notesStyle, 
																					   passportSerialNumberStyle, 
																					   dataPrinyatiyaStyle, 
	   																				   kStyle, 
																					   postStyle});

			dgEmployees.TableStyles.Add(employeesTableStyle);
		}
	}
}
Листинг 11.9.

Форма frmGroup — форма добавления новой группы

Для добавления группы по выбранному курсу используется форма frmGroup. Добавляем элементы управления в соответствии с рис. 11.42.

Форма frmGroup

Рис. 11.42. Форма frmGroup

Листинг формы frmGroup:

using System;
using System.Drawing;
using System.Data;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using Manager.Forms;

namespace Manager
{
	/// <summary>
	/// Форма группы
	/// </summary>
	public class frmGroup : System.Windows.Forms.Form
	{
		// Объявление элементов управления	

internal CurrencyManager cmEmployees;
		internal CurrencyManager cmGroupStatus;
		private Manager.Forms.MainDataSet mainDataSet;
		private DataRow bindingRow;
		internal DataRow BindingRow
		{
			get { return bindingRow; }
			set { bindingRow = value; }
		}

		public frmGroup(MainDataSet mainDataSet)
		{
			InitializeComponent();
			this.mainDataSet = mainDataSet;
			
			cmbStatus.DataSource = mainDataSet.GroupStatus;
			cmbStatus.DisplayMember = "StatusName";
			cmGroupStatus = (CurrencyManager)this.BindingContext[mainDataSet, "GroupStatus"];
			cmGroupStatus.Position = 0;

			cmbEmployee.DataSource = mainDataSet.employees;
			cmbEmployee.DisplayMember = "EmployeeName";
			cmEmployees = (CurrencyManager)this.BindingContext[mainDataSet, "employees"];
			cmEmployees.Position = 0;
			
			Size labelSize = new Size(this.Width, lblGroupID.Size.Height); 
			this.lblGroupID.Size = labelSize;
		}

		public frmGroup(MainDataSet ds, DataRow bindingRow)
		{
			InitializeComponent();
			mainDataSet = ds;
			
			cmbStatus.DataSource = mainDataSet.GroupStatus;
			cmbStatus.DisplayMember = "StatusName";
			cmGroupStatus = (CurrencyManager)this.BindingContext[mainDataSet, "GroupStatus"];
			DataView dvStatus = (DataView)cmGroupStatus.List;
			dvStatus.Sort = "StatusID";
			int statusPos = dvStatus.Find(bindingRow["StatusID"]);
			cmbStatus.SelectedIndex = statusPos;

			cmbEmployee.DataSource = mainDataSet.employees;
			cmbEmployee.DisplayMember = "EmployeeName";
			cmEmployees = (CurrencyManager)this.BindingContext[mainDataSet, "employees"];
			DataView dvEmployee = (DataView)cmEmployees.List;
			dvEmployee.Sort = "employeeID";
			int employeePos = dvEmployee.Find(bindingRow["employeeID"]);
			cmbEmployee.SelectedIndex = employeePos;

			Size labelSize = new Size(this.Width, lblGroupID.Size.Height); 
			this.lblGroupID.Size = labelSize;

			this.bindingRow = bindingRow;

			int groupID = (int)bindingRow[0];
			this.lblGroupID.Text += groupID.ToString();

			DateTime beginDate = (DateTime)bindingRow[1];
			this.dtpBeginDate.Value = beginDate;
						
			DateTime endDate = (DateTime)bindingRow[2];
			this.dtpEndDate.Value = endDate;

			if (bindingRow.ItemArray[3] == null)
			{
				this.dtpBeginTime.Text = "";				
			}
			else
			{
				DateTime beginTime = (DateTime)bindingRow[3];
				this.dtpBeginTime.Text = beginTime.ToString("HH:mm");
			}
			
			if (bindingRow.ItemArray[4] == null)
			{
				this.dtpEndTime.Text = "";				
			}
			else
			{
				DateTime endTime = (DateTime)bindingRow[4];
				this.dtpEndTime.Text = endTime.ToString("HH:mm");
			}
			
			this.txtNotes.Text = bindingRow[9].ToString();
			this.cmbClassNumber.Text = bindingRow[6].ToString();
		}

		protected override void Dispose( bool disposing )
		{
			// Описание метода
		}

		private void InitializeComponent()
		{
// Описание метода
		}

		private void frmGroup_Load(object sender, System.EventArgs e)
		{
			txtNotes.Focus();
		}

		// Проверка обновлений в элементах управлений
		private void dtpBeginDate_Validated(object sender, System.EventArgs e)
		{
			if (this.bindingRow != null)
				if (dtpBeginDate.Value != (DateTime)this.bindingRow["beginDate"])
				{
					this.bindingRow["beginDate"] = DateTime.Parse(dtpBeginDate.Value.ToString("dd MMMM yyyy"));
				}
		}

		private void dtpEndDate_Validated(object sender, System.EventArgs e)
		{
			if (this.bindingRow != null)
				if (dtpEndDate.Value != (DateTime)this.bindingRow["endDate"])
				{
					this.bindingRow["endDate"] = DateTime.Parse(dtpEndDate.Value.ToString("dd MMMM yyyy"));
				}
		}

		private void dtpBeginTime_Validated(object sender, System.EventArgs e)
		{
			if (this.bindingRow != null)
				if (dtpBeginTime.Value != (DateTime)this.bindingRow["beginTime"])
				{
					this.bindingRow["beginTime"] = DateTime.Parse(dtpBeginTime.Value.ToString("HH:mm"));
				}
		}

		private void dtpEndTime_Validated(object sender, System.EventArgs e)
		{
			if (this.bindingRow != null)
				if (dtpEndTime.Value != (DateTime)this.bindingRow["endTime"])
				{
					this.bindingRow["endTime"] = DateTime.Parse(dtpEndTime.Value.ToString("HH:mm"));
				}
		}

		private void txtNotes_Validated(object sender, System.EventArgs e)
		{
			if (this.bindingRow != null)
				if (txtNotes.Text != this.bindingRow["note"].ToString())
			{
				this.bindingRow["note"] = txtNotes.Text;
			}
		}

		private void cmbClassNumber_Validated(object sender, System.EventArgs e)
		{
			if (this.bindingRow != null)
				if (cmbClassNumber.Text != this.bindingRow["classNumber"].ToString())
			{
				this.bindingRow["classNumber"] = cmbClassNumber.Text;
			}
		}

		private void cmbStatus_Validated(object sender, System.EventArgs e)
		{
			if (this.bindingRow != null)
			{
				DataRow statusRow = this.bindingRow.GetParentRow("GroupStatusgroups");
				if (cmbStatus.Text != statusRow["StatusName"].ToString())
				{
					this.bindingRow["StatusID"] = cmbStatus.SelectedIndex + 1;
				}
			}
		}
	}
}
Листинг 11.10.

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

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

Форма frmPaymentType

Рис. 11.43. Форма frmPaymentType

Класс формы должен наследовать от интерфейса ISelectingForm.

Листинг формы frmPaymentType:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using SelectingFormInterface;
using System.Data;
using Manager.Forms;

namespace Manager
{
	public class frmPaymentType : System.Windows.Forms.Form, ISelectingForm	 
	{

		private MainDataSet mainDataSet = null;
		public frmPaymentType(MainDataSet mainDataSet)
		{
			InitializeComponent();

			this.mainDataSet = mainDataSet; 
			this.InitialDefaultSettings();
		}

		protected override void Dispose( bool disposing )
		{
//Описание метода
		}

		private void InitializeComponent()
		{
			//Описание метода
		}

		private System.Windows.Forms.DataGrid dgPaymentType;
		private System.Windows.Forms.Button btnOK;
		private System.Windows.Forms.Button bntCancel;

		private DataRow selectedRow = null;
		public DataRow SelectedRow
		{
			get { return selectedRow; }
			set { selectedRow = value; }
		}

		private void InitialDefaultSettings()
		{
			dgPaymentType.DataSource = mainDataSet;
			dgPaymentType.DataMember = "payment_type";
			
			dgPaymentType.Click += new EventHandler(dgPaymentType_Click);
			dgPaymentType.CurrentCellChanged += new EventHandler(dgPaymentType_CurrentCellChanged);
			
			this.DesignDataGrid();
		}

		private void DesignDataGrid()
		{
			// Дизайн таблицы payment_type
			DataGridTableStyle paymentTypeStyle = new DataGridTableStyle();
			paymentTypeStyle.MappingName = "payment_type";

			DataGridTextBoxColumn paymentTypeIDStyle = new DataGridTextBoxColumn();
			paymentTypeIDStyle.MappingName = "payment_typeID";
			paymentTypeIDStyle.Width = 50;
			paymentTypeIDStyle.HeaderText = "ID";


			DataGridTextBoxColumn paymentTypeNameStyle = new DataGridTextBoxColumn();
			paymentTypeNameStyle.MappingName = "payment_typeName";
			paymentTypeNameStyle.Width = 100;
			paymentTypeNameStyle.HeaderText = "Name";

			
			DataGridTextBoxColumn paymentTypeNoteStyle = new DataGridTextBoxColumn();
			paymentTypeNoteStyle.MappingName = "note";
			paymentTypeNoteStyle.Width = 200;
			paymentTypeNoteStyle.HeaderText = "Notes";

			paymentTypeStyle.GridColumnStyles.AddRange( new DataGridTextBoxColumn[] {
																						paymentTypeIDStyle,
																						paymentTypeNameStyle, 
																						paymentTypeNoteStyle});

			dgPaymentType.TableStyles.Add(paymentTypeStyle);
		}
		
private void dgPaymentType_Click(object sender, EventArgs e)
		{
			if ((dgPaymentType.CurrentCell.RowNumber != -1) && (dgPaymentType.CurrentCell.ColumnNumber != -1))
				dgPaymentType_CurrentCellChanged(dgPaymentType, new EventArgs());
		}

		private void dgPaymentType_CurrentCellChanged(object sender, EventArgs e)
		{
			try
			{
				this.SelectedRow = mainDataSet.payment_type.Rows[dgPaymentType.CurrentRowIndex];
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message, ex.Source);
			}
		}
	}
}
Листинг 11.11.

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

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

Класс ManagerTreeNode(ManagerTreeNode.cs)
using System;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;

namespace Manager
{
	internal abstract class ManagerTreeNode : TreeNode
	{
		internal abstract void GetChilds();
	}
}
Листинг 11.12.
Класс ClientTreeNode(Clients.cs)
using System;
using System.Windows.Forms;

namespace Manager
{
	internal class ClientTreeNode : ManagerTreeNode
	{
		internal ClientTreeNode()
		{
			
		}

		private int clientID;
		internal int ClientID
		{
			get { return clientID; }
			set { clientID = value; }
		}

		private int groupID;
		internal int GroupID
		{
			get { return groupID; }
			set { groupID = value; }
		}

		private int courseID;
		internal int CourseID
		{
			get { return courseID; }
			set { courseID = value; }
		}	

		private string firstName;
		internal string FirstName
		{
			get { return firstName; }
			set { firstName = value; }
		}

		private string lastName;
		internal string LastName
		{
			get { return lastName; }
			set { lastName = value; }
		}

		private string fatherName;
		internal string FatherName
		{
			get { return fatherName; }
			set { fatherName = value; }
		}

		private string linkData;
		internal string LinkData
		{
			get { return linkData; }
			set { linkData = value; }
		}

		private DateTime recorddate;
		internal DateTime RecordDate
		{
			get { return recorddate; }
			set { recorddate = value; }
		}

		private string note;
		internal string Note
		{
			get { return note; }
			set { note = value; }
		}

		private string paymentType;
		internal string PaymentType
		{
			get { return paymentType; }
			set { paymentType = value; }
		}

		private double clientSumm;
		internal double ClientSumm
		{
			get { return clientSumm; }
			set { clientSumm = value; }
		}

		internal override void GetChilds()
		{

		}
		
		public override string ToString()
		{
			return  lastName + " " + firstName + " " + fatherName;
		}
	}
}
Листинг 11.13.
Класс GroupTreeNode (Groups.cs)
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using Manager.Forms;

namespace Manager
{
	internal class GroupTreeNode : ManagerTreeNode
	{
		private MainDataSet mainDataSet = null;

		internal MainDataSet NDDataSet
		{
			get { return mainDataSet; }
			set { mainDataSet = value; }
		}

		private int courseID;
		internal int CourseID
		{
			get { return courseID; }
			set { courseID = value; }
		}

		private int groupID;
		internal int GroupID
		{
			get { return groupID; }
			set { groupID = value; }
		}
		
		private DateTime beginDate;
		internal DateTime BeginDate
		{
			get { return beginDate; }
			set { beginDate = value; }
		}

		private	DateTime endDate;
		internal DateTime EndDate
		{
			get { return endDate; }
			set { endDate = value; }
		}

		private	DateTime beginTime;
		internal DateTime BeginTime
		{
			get { return beginTime; }
			set { beginTime = value; }
		}

		private	DateTime endTime;
		internal DateTime EndTime
		{
			get { return endTime; }
			set { endTime = value; }
		}

		private	int clientsCount;
		internal int ClientsCount
		{
			get { return clientsCount; }
			set { clientsCount = value; }
		}

		private	int classNumber;
		internal int ClassNumber
		{
			get { return classNumber; }
			set { classNumber = value; }
		}

		private	int directionID;
		internal int DirectionID
		{
			get { return directionID; }
			set { directionID = value; }
		}

		private	int employeeID;
		internal int EmployeeID
		{
			get { return employeeID; }
			set { employeeID = value; }
		}

		private	string groupNote;
		internal string GroupNote
		{
			get { return groupNote; }
			set { groupNote = value; }
		}

		private	int status;
		internal int Status
		{
			get { return status; }
			set { status = value; }
		}

		internal override void GetChilds()
		{
			DataView dvGroupClients = new DataView(this.NDDataSet.group_clients);
			dvGroupClients.RowFilter = "groupID = " + this.GroupID.ToString();
				
			ClientTreeNode[] ctns = new ClientTreeNode[dvGroupClients.Count];
			ClientTreeNode ctn = null;
				
			int i = 0;
			foreach(DataRowView drv in dvGroupClients)
			{
				DataRow clientRow = drv.Row.GetParentRow("clientsgroup_clients");
				ctn = new ClientTreeNode();
				
				ctn.ClientID = (int)clientRow["clientID"];
				ctn.FirstName = clientRow["fname"].ToString(); 
				ctn.LastName = clientRow["lname"].ToString();
				ctn.FatherName = clientRow["fathName"].ToString();
				ctn.LinkData = clientRow["linkData"].ToString();
				ctn.RecordDate = (DateTime)clientRow["recordDate"];
				ctn.Note = clientRow["note"].ToString();
				ctn.PaymentType = clientRow["paymentType"].ToString();
				
				ctn.Text = ctn.LastName + " " + ctn.FirstName + " " + ctn.FatherName;
				ctn.ImageIndex = 6;
				ctn.ForeColor = Color.Teal;

				ctn.Tag = clientRow;
				
				ctns[i++] = ctn;
				ctn = null;
			}
			
			this.ForeColor = Color.Crimson;
			this.Nodes.AddRange(ctns);
		}
	}
}
Листинг 11.14.
Класс CourseTreeNode (Courses.cs)
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using Manager.Forms;

namespace Manager
{
	internal class CourseTreeNode : ManagerTreeNode
	{
		private MainDataSet mainDataSet = null;

		internal MainDataSet NDDataSet
		{
			get { return mainDataSet; }
			set { mainDataSet = value; }
		}

		private int directionID;
		internal int DirectionID
		{
			get { return directionID; }
			set { directionID = value; }
		}

		private int courseID;
		internal int CourseID
		{
			get { return courseID; }
			set { courseID = value; }
		}
		
		private string courseName;
		internal string CourseName
		{
			get {return courseName;}
			set {courseName = value;}
		}

		private decimal coursePrice;
		internal decimal CoursePrice
		{
			get { return coursePrice; }
			set { coursePrice = value; }
		}

		public override string ToString()
		{
			return courseName;
		}

		internal override void GetChilds()
		{
			DataView dvGroups = new DataView(this.NDDataSet.groups);
			dvGroups.RowFilter = "courseID = " + this.courseID.ToString();

			GroupTreeNode[] gtns = new GroupTreeNode[dvGroups.Count];
			GroupTreeNode gtn = null;
			
			int i = 0;
			foreach (DataRowView drv in dvGroups)
			{
				DataRow dr = drv.Row;
				gtn = new GroupTreeNode();
				
				gtn.NDDataSet = this.NDDataSet;
				gtn.CourseID = this.courseID;
				gtn.GroupID = (int)dr["groupID"];

				gtn.BeginDate = (DateTime)dr["beginDate"];
				gtn.EndDate = (DateTime)dr["endDate"];
				gtn.BeginTime = (DateTime)dr["beginTime"];
				gtn.EndTime = (DateTime)dr["endTime"];

				gtn.ClientsCount = (int)dr["clientsCount"];
				gtn.ClassNumber = (int)dr["classNumber"];
				gtn.CourseID = (int)dr["courseID"];
				gtn.EmployeeID = (int)dr["employeeID"];
		      gtn.GroupNote = dr["note"].ToString();
				gtn.Status = (int)dr["statusID"];

				gtn.Text = gtn.GroupID.ToString();
				gtn.ImageIndex = 6;

				if ((int)dr["StatusID"] == 1) // Группа набирается
				{
					gtn.ForeColor = Color.Red;
				}
				else if ((int)dr["StatusID"] == 2) // Группа обучается
				{
					gtn.ForeColor = Color.Green;
				}
				else if ((int)dr["StatusID"] == 3) // Группа закончила обучение
				{
					gtn.ForeColor = Color.Blue;
				}

				gtn.Tag = dr;
			
				gtns[i++] = gtn;
				gtn = null;
			}
			

			this.ForeColor = Color.Green;
			
			this.Nodes.AddRange(gtns);		
		}
	}
}
Листинг 11.15.
Класс DirectionTreeNode(Directions.cs)
using System;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using Manager.Forms;

namespace Manager
{
	internal class DirectionTreeNode : ManagerTreeNode
	{
		private MainDataSet mainDataSet = null;

		internal MainDataSet NDDataSet
		{
			get { return mainDataSet; }
			set { mainDataSet = value; }
		}

		private string directionName;
		internal string DirectionName
		{
			get { return directionName; }
			set { directionName = value; }
		}

		private string managerFirstName;
		internal string ManagerFirstName
		{
			get { return managerFirstName; }
			set { managerFirstName = value; }
		}

		private string managerLastName;
		internal string ManagerLastName
		{
			get { return managerLastName; }
			set { managerLastName = value; }
		}

		private string managerFatherName;
		internal string ManagerFatherName
		{
			get { return managerFatherName; }
			set { managerFatherName = value; }
		}

		private int directionID;
		internal int DirectionID
		{
			get { return directionID; }
			set { directionID = value; }
		}

		private string directionNote;
		internal string DirectionNote
		{
			get { return directionNote; }
			set { directionNote = value; }
		}

		private int managerID;
		internal int ManagerID
		{
			get { return managerID;}
			set { managerID = value;}
		}

		public override string ToString()
		{
			return directionName;
		}

		internal override void GetChilds()
		{
			DataView dvCourse = new DataView(this.NDDataSet.course);
			dvCourse.RowFilter = "directionID = " + this.directionID.ToString();
			
			CourseTreeNode[] ctns = new CourseTreeNode[dvCourse.Count];
			CourseTreeNode ctn = null;

			int i = 0;
			foreach (DataRowView drv in dvCourse)
			{
				DataRow dr = drv.Row;
				ctn = new CourseTreeNode();

				ctn.NDDataSet = this.NDDataSet;
				ctn.DirectionID = this.directionID;
				ctn.CourseID = int.Parse(dr["courseID"].ToString());
				ctn.CourseName = ctn.Text = dr["courseName"].ToString();
				ctn.CoursePrice = (decimal)dr["priceNumber"];

            ctn.ImageIndex = 10;
				ctn.ForeColor = Color.Green;
				ctn.GetChilds();

				ctn.Tag = dr; // Теперь мы можем обращаться к элементам в ListView по свойству tag

				ctns[i++] = ctn;
				ctn = null;
			}
			
			this.ForeColor = Color.RoyalBlue;
			this.Nodes.AddRange(ctns);
		}
	}
}
Листинг 11.16.
Класс CustomListItem(CustomListItem.cs)
using System;
using System.Data;

namespace Manager
{
	// Класс содержит строку для данного объекта из БД
	public class CustomListItem : System.Windows.Forms.ListViewItem
	{
		public CustomListItem():base()
		{
			bindedRow = null;
		}

		public CustomListItem(string[] subItems, int imageIndex):base(subItems, imageIndex)
		{
			bindedRow = null;
		}

		private DataRow bindedRow;
		internal DataRow BindedRow
		{
			get { return bindedRow; }
			set { bindedRow = value; }
		}
	}
}
Листинг 11.17.
Интерфейс ISelectingForm(SelectingFormInterface.cs)

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

using System;
using System.Data;
using System.Windows.Forms;

namespace SelectingFormInterface
{
	public interface ISelectingForm 
	{
		DataRow SelectedRow
		{
			get;
			set;
		}
	}
}
Листинг 11.18.
Элемент управления FindControl (FindControl.cs)

Добавляем в окне Solution Explorer новый проект Windows Control Library и называем его FindControl. Это пользовательский элемент управления, с которыми мы сталкивались в "Работа с элементами управления (продолжение)" .

Добавляем на форму три кнопки в соответствии с рис. 11.44.

Форма FindControl

Рис. 11.44. Форма FindControl

Листинг формы FindControl:

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Reflection;
using SelectingFormInterface;

namespace FindControl
{
	public delegate void RowSelectedDelegate(FindControl findControl, DataTable table);
	
	public class FindControl : System.Windows.Forms.UserControl
	{
		/// <summary>
		/// Событие генерируется, когда выбрана запись из формы поиска в режиме диалога
		/// </summary>
		public event RowSelectedDelegate RowSelected;

		private ISelectingForm selectingForm = null;
		public ISelectingForm SelectingForm
		{
			get { return selectingForm; }
			set { selectingForm = value; }
		}

		private Form personForm = null;
		public Form PersonForm
		{
			get { return personForm; }
			set { personForm = value; }
		}

		private string text = "";
		public override string Text
		{
			get
			{
				return text;
			}
			set
			{
				text = value;
				btnFind.Text = text;
			}
		}

		private DataRow targetRow = null;
		/// <summary>
		/// Запись, в которую добавляется значение из формы поиска и выбора
		/// </summary>
		public DataRow TargetRow 
		{
			get { return targetRow; }
			set { targetRow = value; } 
		}

		private string columnName = null;
		private System.Windows.Forms.Button btnData;
		/// <summary>
		/// Название колонки, в которую можно добавить номер выбранной записи из формы поиска и выбора
		/// </summary>
		public string ColumnName 
		{
			get { return columnName; }
			set { columnName = value; } 
		}


		private DataTable table = null;
		/// <summary>
		/// Таблица, в которую добавляется запись
		/// </summary>
		public DataTable Table 
		{
			get { return table; }
			set { table = value; } 
		}

		public FindControl()
		{
			InitializeComponent();

			this.btnCancel.Click += new EventHandler(btnCancel_Click);
			this.btnFind.Click += new EventHandler(btnFind_Click);
			this.btnData.Click += new EventHandler(btnData_Click);
		}

		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if( components != null )
					components.Dispose();
			}
			base.Dispose( disposing );
		}

		#region Component Designer generated code
		private void InitializeComponent()
		{
			// Описание метода

		}
		#endregion

		private void btnCancel_Click(object sender, EventArgs e)
		{
			this.Visible = true;
			this.Dispose();				
		}

		private void btnFind_Click(object sender, EventArgs e)
		{
			try
			{
				Form form = (Form)this.SelectingForm;
				if (form.ShowDialog() == DialogResult.OK)
					RowSelected(this, this.Table);
			
				btnCancel_Click(btnCancel, new EventArgs());
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message, ex.Source);
			}
		}

		public override string ToString()
		{
			return "FindControl";
		}

		private void btnData_Click(object sender, EventArgs e)
		{
			if (personForm == null)
			{
				MessageBox.Show("Нет данных для отображения формы");
				return;
			}

			personForm.ShowDialog();
			this.Dispose();
		}
	}
}
Листинг 11.19.

На диске, прилагаемом к книге, вы найдете приложение EducationCenter (Code\Glava11\ Manager).

< Лекция 10 || Лекция 11: 1234567891011
Елена Дьяконова
Елена Дьяконова

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

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

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

Затем:

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

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

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

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

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000