From bf23306693e3964088b232c6f9b9a283b234a190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=B7=D0=B0=D0=BC=D0=B0=D1=82=20=D0=98=D1=88=D1=82?= =?UTF-8?q?=D1=83=D0=B3=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Sun, 22 Dec 2024 13:48:47 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectSchedule/Entities/Audience.cs | 27 ++ .../ProjectSchedule/Entities/Discipline.cs | 22 ++ .../DisciplineStudingPlanSupplement.cs | 26 ++ .../Entities/Enums/TypeAudience.cs | 15 + .../Entities/Enums/TypePair.cs | 14 + .../Entities/Enums/TypeWeek.cs | 14 + .../ProjectSchedule/Entities/Group.cs | 26 ++ .../ProjectSchedule/Entities/Schedule.cs | 40 +++ .../Entities/StudingPlanSupplement.cs | 36 +++ .../ProjectSchedule/Entities/Teacher.cs | 26 ++ .../ProjectSchedule/Form1.Designer.cs | 39 --- ProjectSchedule/ProjectSchedule/Form1.cs | 10 - .../ProjectSchedule/FormSchedule.Designer.cs | 145 +++++++++ .../ProjectSchedule/FormSchedule.cs | 89 ++++++ .../{Form1.resx => FormSchedule.resx} | 0 .../Forms/FormAudience.Designer.cs | 146 +++++++++ .../ProjectSchedule/Forms/FormAudience.cs | 95 ++++++ .../ProjectSchedule/Forms/FormAudience.resx | 120 +++++++ .../Forms/FormAudiences.Designer.cs | 127 ++++++++ .../ProjectSchedule/Forms/FormAudiences.cs | 104 +++++++ .../ProjectSchedule/Forms/FormAudiences.resx | 120 +++++++ .../Forms/FormDiscipline.Designer.cs | 96 ++++++ .../ProjectSchedule/Forms/FormDiscipline.cs | 72 +++++ .../ProjectSchedule/Forms/FormDiscipline.resx | 120 +++++++ .../Forms/FormDisciplines.Designer.cs | 127 ++++++++ .../ProjectSchedule/Forms/FormDisciplines.cs | 104 +++++++ .../Forms/FormDisciplines.resx | 120 +++++++ .../Forms/FormGroup.Designer.cs | 145 +++++++++ .../ProjectSchedule/Forms/FormGroup.cs | 74 +++++ .../ProjectSchedule/Forms/FormGroup.resx | 120 +++++++ .../Forms/FormGroups.Designer.cs | 127 ++++++++ .../ProjectSchedule/Forms/FormGroups.cs | 104 +++++++ .../ProjectSchedule/Forms/FormGroups.resx | 120 +++++++ .../Forms/FormSchedule.Designer.cs | 294 ++++++++++++++++++ .../ProjectSchedule/Forms/FormSchedule.cs | 65 ++++ .../ProjectSchedule/Forms/FormSchedule.resx | 120 +++++++ .../Forms/FormSchedules.Designer.cs | 99 ++++++ .../ProjectSchedule/Forms/FormSchedules.cs | 48 +++ .../ProjectSchedule/Forms/FormSchedules.resx | 120 +++++++ .../FormStudingPlanSupplement.Designer.cs | 225 ++++++++++++++ .../Forms/FormStudingPlanSupplement.cs | 70 +++++ .../Forms/FormStudingPlanSupplement.resx | 129 ++++++++ .../FormStudingPlanSupplements.Designer.cs | 113 +++++++ .../Forms/FormStudingPlanSupplements.cs | 86 +++++ .../Forms/FormStudingPlanSupplements.resx | 120 +++++++ .../Forms/FormTeacher.Designer.cs | 140 +++++++++ .../ProjectSchedule/Forms/FormTeacher.cs | 71 +++++ .../ProjectSchedule/Forms/FormTeacher.resx | 120 +++++++ .../Forms/FormTeachers.Designer.cs | 127 ++++++++ .../ProjectSchedule/Forms/FormTeachers.cs | 104 +++++++ .../ProjectSchedule/Forms/FormTeachers.resx | 120 +++++++ ProjectSchedule/ProjectSchedule/Program.cs | 19 +- .../ProjectSchedule/ProjectSchedule.csproj | 16 + .../Properties/Resources.Designer.cs | 103 ++++++ .../ProjectSchedule/Properties/Resources.resx | 133 ++++++++ .../Repositories/IAudienceRepository.cs | 17 + .../Repositories/IDisciplineRepository.cs | 17 + .../Repositories/IGroupRepository.cs | 17 + .../Repositories/IScheduleRepository.cs | 15 + .../IStudingPlanSupplementRepository.cs | 16 + .../Repositories/ITeacherRepository.cs | 17 + .../Implementations/AudienceRepository.cs | 29 ++ .../Implementations/DisciplineRepository.cs | 28 ++ .../Implementations/GroupRepository.cs | 24 ++ .../Implementations/ScheduleRepository.cs | 16 + .../StudingPlanSupplementRepository.cs | 18 ++ .../Implementations/TeacherRepository.cs | 24 ++ .../Resources/добавить.jpg | Bin 0 -> 8697 bytes .../Resources/редактировать.jpg | Bin 0 -> 32694 bytes .../Resources/удалить.jpg | Bin 0 -> 14589 bytes .../ProjectSchedule/Resources/фон.jpg | Bin 0 -> 39142 bytes 71 files changed, 5200 insertions(+), 50 deletions(-) create mode 100644 ProjectSchedule/ProjectSchedule/Entities/Audience.cs create mode 100644 ProjectSchedule/ProjectSchedule/Entities/Discipline.cs create mode 100644 ProjectSchedule/ProjectSchedule/Entities/DisciplineStudingPlanSupplement.cs create mode 100644 ProjectSchedule/ProjectSchedule/Entities/Enums/TypeAudience.cs create mode 100644 ProjectSchedule/ProjectSchedule/Entities/Enums/TypePair.cs create mode 100644 ProjectSchedule/ProjectSchedule/Entities/Enums/TypeWeek.cs create mode 100644 ProjectSchedule/ProjectSchedule/Entities/Group.cs create mode 100644 ProjectSchedule/ProjectSchedule/Entities/Schedule.cs create mode 100644 ProjectSchedule/ProjectSchedule/Entities/StudingPlanSupplement.cs create mode 100644 ProjectSchedule/ProjectSchedule/Entities/Teacher.cs delete mode 100644 ProjectSchedule/ProjectSchedule/Form1.Designer.cs delete mode 100644 ProjectSchedule/ProjectSchedule/Form1.cs create mode 100644 ProjectSchedule/ProjectSchedule/FormSchedule.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/FormSchedule.cs rename ProjectSchedule/ProjectSchedule/{Form1.resx => FormSchedule.resx} (100%) create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormAudience.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormAudience.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormAudience.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormAudiences.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormAudiences.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormAudiences.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormGroup.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormGroup.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormGroup.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormGroups.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormGroups.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormGroups.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormSchedule.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormSchedule.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormSchedule.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormSchedules.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormSchedules.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormSchedules.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormTeacher.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormTeacher.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormTeacher.resx create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormTeachers.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormTeachers.cs create mode 100644 ProjectSchedule/ProjectSchedule/Forms/FormTeachers.resx create mode 100644 ProjectSchedule/ProjectSchedule/Properties/Resources.Designer.cs create mode 100644 ProjectSchedule/ProjectSchedule/Properties/Resources.resx create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/IAudienceRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/IDisciplineRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/IGroupRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/IScheduleRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/IStudingPlanSupplementRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/ITeacherRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/Implementations/AudienceRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/Implementations/DisciplineRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/Implementations/GroupRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/Implementations/ScheduleRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/Implementations/StudingPlanSupplementRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Repositories/Implementations/TeacherRepository.cs create mode 100644 ProjectSchedule/ProjectSchedule/Resources/добавить.jpg create mode 100644 ProjectSchedule/ProjectSchedule/Resources/редактировать.jpg create mode 100644 ProjectSchedule/ProjectSchedule/Resources/удалить.jpg create mode 100644 ProjectSchedule/ProjectSchedule/Resources/фон.jpg diff --git a/ProjectSchedule/ProjectSchedule/Entities/Audience.cs b/ProjectSchedule/ProjectSchedule/Entities/Audience.cs new file mode 100644 index 0000000..2449cb0 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/Audience.cs @@ -0,0 +1,27 @@ +using ProjectSchedule.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities; + +public class Audience +{ + public int Id { get; private set; } + public string Number { get; private set; } = string.Empty; + public int SeatsCount { get; private set; } + public TypeAudience TypeAudience { get; private set; } + + public static Audience CreateEntity(int id, string number, TypeAudience typeAudience, int seatsCount) + { + return new Audience + { + Id = id, + Number = number ?? string.Empty, + TypeAudience = typeAudience, + SeatsCount = seatsCount + }; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Entities/Discipline.cs b/ProjectSchedule/ProjectSchedule/Entities/Discipline.cs new file mode 100644 index 0000000..4992dc1 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/Discipline.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities; + +public class Discipline +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + + public static Discipline CreateEntity(int id, string name) + { + return new Discipline + { + Id = id, + Name = name ?? string.Empty, + }; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Entities/DisciplineStudingPlanSupplement.cs b/ProjectSchedule/ProjectSchedule/Entities/DisciplineStudingPlanSupplement.cs new file mode 100644 index 0000000..6f1b06d --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/DisciplineStudingPlanSupplement.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities; + +public class DisciplineStudingPlanSupplement +{ + public int Id { get; private set; } + public int DisciplineId { get; private set; } + public int LecturesCount { get; private set; } + public int PracticesCount { get; private set; } + + public static DisciplineStudingPlanSupplement CreateElement(int id, int disciplineId, int lecturesCount, int practicesCount) + { + return new DisciplineStudingPlanSupplement + { + Id = id, + DisciplineId = disciplineId, + LecturesCount = lecturesCount, + PracticesCount = practicesCount + }; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Entities/Enums/TypeAudience.cs b/ProjectSchedule/ProjectSchedule/Entities/Enums/TypeAudience.cs new file mode 100644 index 0000000..ce23df3 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/Enums/TypeAudience.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities.Enums; + +[Flags] +public enum TypeAudience +{ + None = 0, + СomputerСlass = 1, + LectureAudience = 2 +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Entities/Enums/TypePair.cs b/ProjectSchedule/ProjectSchedule/Entities/Enums/TypePair.cs new file mode 100644 index 0000000..5ad1300 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/Enums/TypePair.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities.Enums; + +public enum TypePair +{ + None = 0, + Practice = 1, + Lecture = 2 +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Entities/Enums/TypeWeek.cs b/ProjectSchedule/ProjectSchedule/Entities/Enums/TypeWeek.cs new file mode 100644 index 0000000..140d047 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/Enums/TypeWeek.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities.Enums; + +public enum TypeWeek +{ + None = 0, + OddWeek = 1, + EvenWeek = 2 +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Entities/Group.cs b/ProjectSchedule/ProjectSchedule/Entities/Group.cs new file mode 100644 index 0000000..4c7903a --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/Group.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities; + +public class Group +{ + public int Id { get; private set; } + public string Name { get; private set; } = string.Empty; + public string GroupNumber { get; private set; } = string.Empty; + public int StudentsCount { get; private set; } + + public static Group CreateEntity(int id, string name, string groupNumber, int studentsCount) + { + return new Group + { + Id = id, + Name = name ?? string.Empty, + GroupNumber = groupNumber ?? string.Empty, + StudentsCount = studentsCount + }; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Entities/Schedule.cs b/ProjectSchedule/ProjectSchedule/Entities/Schedule.cs new file mode 100644 index 0000000..8256fe0 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/Schedule.cs @@ -0,0 +1,40 @@ +using ProjectSchedule.Entities.Enums; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities; + +public class Schedule +{ + public int Id { get; private set; } + public int TeacherId { get; private set; } + public int DisciplineId { get; private set; } + public int GroupStudentsId { get; private set; } + public int AudienceId { get; private set; } + public DateTime DateDay { get; private set; } + public int NumberDay { get; private set; } + public int NumberPair { get; private set; } + public TypeWeek TypeWeek { get; private set; } + public TypePair TypePair { get; private set; } + + public static Schedule CreateOperation(int id, int teacherId, int disciplineId, int groupStudentsId, int audienceId, + DateTime dateDay, TypeWeek typeWeek, int numberDay, int numberPair, TypePair typePair) + { + return new Schedule + { + Id = id, + TeacherId = teacherId, + DisciplineId = disciplineId, + GroupStudentsId = groupStudentsId, + AudienceId = audienceId, + DateDay = dateDay, + TypeWeek = typeWeek, + NumberDay = numberDay, + NumberPair = numberPair, + TypePair = typePair + }; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Entities/StudingPlanSupplement.cs b/ProjectSchedule/ProjectSchedule/Entities/StudingPlanSupplement.cs new file mode 100644 index 0000000..e90defb --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/StudingPlanSupplement.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities; + +public class StudingPlanSupplement +{ + public int Id { get; private set; } + + public int GroupId { get; private set; } + + public string NameStudingPlan { get; private set; } = string.Empty; + + public string Semester { get; private set; } = string.Empty; + + public DateTime DateApprovePlan { get; private set; } + + public IEnumerable DisciplineStudingPlanSupplements { get; private set; } = []; + + public static StudingPlanSupplement CreateOperation(int id, int groupId, string nameStudingPlan, + string semester, DateTime dateApprovePlan, IEnumerable disciplineStudingPlanSupplements) + { + return new StudingPlanSupplement + { + Id = id, + GroupId = groupId, + NameStudingPlan = nameStudingPlan ?? string.Empty, + Semester = semester ?? string.Empty, + DateApprovePlan = dateApprovePlan, + DisciplineStudingPlanSupplements = disciplineStudingPlanSupplements + }; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Entities/Teacher.cs b/ProjectSchedule/ProjectSchedule/Entities/Teacher.cs new file mode 100644 index 0000000..598dc0d --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Entities/Teacher.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Entities; + +public class Teacher +{ + public int Id { get; private set; } + public string Surname { get; private set; } = string.Empty; + public string Name { get; private set; } = string.Empty; + public string Patronymic { get; private set; } = string.Empty; + + public static Teacher CreateEntity(int id, string surname, string name, string patronymic) + { + return new Teacher + { + Id = id, + Surname = surname ?? string.Empty, + Name = name ?? string.Empty, + Patronymic = patronymic ?? string.Empty + }; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Form1.Designer.cs b/ProjectSchedule/ProjectSchedule/Form1.Designer.cs deleted file mode 100644 index 3180711..0000000 --- a/ProjectSchedule/ProjectSchedule/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace ProjectSchedule -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; - } - - #endregion - } -} diff --git a/ProjectSchedule/ProjectSchedule/Form1.cs b/ProjectSchedule/ProjectSchedule/Form1.cs deleted file mode 100644 index 488af1c..0000000 --- a/ProjectSchedule/ProjectSchedule/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ProjectSchedule -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} diff --git a/ProjectSchedule/ProjectSchedule/FormSchedule.Designer.cs b/ProjectSchedule/ProjectSchedule/FormSchedule.Designer.cs new file mode 100644 index 0000000..cc5822c --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/FormSchedule.Designer.cs @@ -0,0 +1,145 @@ +namespace ProjectSchedule +{ + partial class FormSchedule + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + menuStrip = new MenuStrip(); + referencesToolStripMenuItem = new ToolStripMenuItem(); + audiencesToolStripMenuItem = new ToolStripMenuItem(); + disciplinesToolStripMenuItem = new ToolStripMenuItem(); + teachersToolStripMenuItem = new ToolStripMenuItem(); + groupsStudentsToolStripMenuItem = new ToolStripMenuItem(); + operationsToolStripMenuItem = new ToolStripMenuItem(); + scheduleToolStripMenuItem = new ToolStripMenuItem(); + studingPlanSupplementToolStripMenuItem = new ToolStripMenuItem(); + reportsToolStripMenuItem = new ToolStripMenuItem(); + menuStrip.SuspendLayout(); + SuspendLayout(); + // + // menuStrip + // + menuStrip.ImageScalingSize = new Size(20, 20); + menuStrip.Items.AddRange(new ToolStripItem[] { referencesToolStripMenuItem, operationsToolStripMenuItem, reportsToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Size = new Size(782, 28); + menuStrip.TabIndex = 0; + menuStrip.Text = "menuStrip"; + // + // referencesToolStripMenuItem + // + referencesToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { audiencesToolStripMenuItem, disciplinesToolStripMenuItem, teachersToolStripMenuItem, groupsStudentsToolStripMenuItem }); + referencesToolStripMenuItem.Name = "referencesToolStripMenuItem"; + referencesToolStripMenuItem.Size = new Size(117, 24); + referencesToolStripMenuItem.Text = "Справочники"; + // + // audiencesToolStripMenuItem + // + audiencesToolStripMenuItem.Name = "audiencesToolStripMenuItem"; + audiencesToolStripMenuItem.Size = new Size(224, 26); + audiencesToolStripMenuItem.Text = "Аудитории"; + audiencesToolStripMenuItem.Click += AudiencesToolStripMenuItem_Click; + // + // disciplinesToolStripMenuItem + // + disciplinesToolStripMenuItem.Name = "disciplinesToolStripMenuItem"; + disciplinesToolStripMenuItem.Size = new Size(224, 26); + disciplinesToolStripMenuItem.Text = "Дисциплины"; + disciplinesToolStripMenuItem.Click += DisciplinesToolStripMenuItem_Click; + // + // teachersToolStripMenuItem + // + teachersToolStripMenuItem.Name = "teachersToolStripMenuItem"; + teachersToolStripMenuItem.Size = new Size(224, 26); + teachersToolStripMenuItem.Text = "Преподаватели"; + teachersToolStripMenuItem.Click += TeachersToolStripMenuItem_Click; + // + // groupsStudentsToolStripMenuItem + // + groupsStudentsToolStripMenuItem.Name = "groupsStudentsToolStripMenuItem"; + groupsStudentsToolStripMenuItem.Size = new Size(224, 26); + groupsStudentsToolStripMenuItem.Text = "Группы студентов"; + groupsStudentsToolStripMenuItem.Click += GroupsToolStripMenuItem_Click; + // + // operationsToolStripMenuItem + // + operationsToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { scheduleToolStripMenuItem, studingPlanSupplementToolStripMenuItem }); + operationsToolStripMenuItem.Name = "operationsToolStripMenuItem"; + operationsToolStripMenuItem.Size = new Size(95, 24); + operationsToolStripMenuItem.Text = "Операции"; + // + // scheduleToolStripMenuItem + // + scheduleToolStripMenuItem.Name = "scheduleToolStripMenuItem"; + scheduleToolStripMenuItem.Size = new Size(295, 26); + scheduleToolStripMenuItem.Text = "Составление расписания"; + scheduleToolStripMenuItem.Click += ScheduleToolStripMenuItem_Click; + // + // studingPlanSupplementToolStripMenuItem + // + studingPlanSupplementToolStripMenuItem.Name = "studingPlanSupplementToolStripMenuItem"; + studingPlanSupplementToolStripMenuItem.Size = new Size(295, 26); + studingPlanSupplementToolStripMenuItem.Text = "Дополнение учебного плана"; + studingPlanSupplementToolStripMenuItem.Click += StudingPlanSupplementToolStripMenuItem_Click; + // + // reportsToolStripMenuItem + // + reportsToolStripMenuItem.Name = "reportsToolStripMenuItem"; + reportsToolStripMenuItem.Size = new Size(73, 24); + reportsToolStripMenuItem.Text = "Отчёты"; + // + // FormSchedule + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackgroundImage = Properties.Resources.Bg; + BackgroundImageLayout = ImageLayout.Stretch; + ClientSize = new Size(782, 403); + Controls.Add(menuStrip); + MainMenuStrip = menuStrip; + Name = "FormSchedule"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Расписание"; + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + #endregion + private MenuStrip menuStrip; + private ToolStripMenuItem referencesToolStripMenuItem; + private ToolStripMenuItem audiencesToolStripMenuItem; + private ToolStripMenuItem disciplinesToolStripMenuItem; + private ToolStripMenuItem teachersToolStripMenuItem; + private ToolStripMenuItem groupsStudentsToolStripMenuItem; + private ToolStripMenuItem operationsToolStripMenuItem; + private ToolStripMenuItem scheduleToolStripMenuItem; + private ToolStripMenuItem reportsToolStripMenuItem; + private ToolStripMenuItem studingPlanSupplementToolStripMenuItem; + } +} diff --git a/ProjectSchedule/ProjectSchedule/FormSchedule.cs b/ProjectSchedule/ProjectSchedule/FormSchedule.cs new file mode 100644 index 0000000..febb4d0 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/FormSchedule.cs @@ -0,0 +1,89 @@ +using ProjectSchedule.Forms; +using Unity; + +namespace ProjectSchedule +{ + public partial class FormSchedule : Form + { + private readonly IUnityContainer _container; + + public FormSchedule(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + } + + private void AudiencesToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void DisciplinesToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void TeachersToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void GroupsToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ScheduleToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void StudingPlanSupplementToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/ProjectSchedule/ProjectSchedule/Form1.resx b/ProjectSchedule/ProjectSchedule/FormSchedule.resx similarity index 100% rename from ProjectSchedule/ProjectSchedule/Form1.resx rename to ProjectSchedule/ProjectSchedule/FormSchedule.resx diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormAudience.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormAudience.Designer.cs new file mode 100644 index 0000000..a18474a --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormAudience.Designer.cs @@ -0,0 +1,146 @@ +namespace ProjectSchedule.Forms +{ + partial class FormAudience + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + labelNumberAudience = new Label(); + labelQuantitySeats = new Label(); + labelTypeAudience = new Label(); + buttonSave = new Button(); + buttonCancel = new Button(); + textBoxNumberAudience = new TextBox(); + numericUpDownSeatsCount = new NumericUpDown(); + checkedListBoxTypeAudience = new CheckedListBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownSeatsCount).BeginInit(); + SuspendLayout(); + // + // labelNumberAudience + // + labelNumberAudience.AutoSize = true; + labelNumberAudience.Location = new Point(21, 32); + labelNumberAudience.Name = "labelNumberAudience"; + labelNumberAudience.Size = new Size(138, 20); + labelNumberAudience.TabIndex = 0; + labelNumberAudience.Text = "Номер аудитории:"; + // + // labelQuantitySeats + // + labelQuantitySeats.AutoSize = true; + labelQuantitySeats.Location = new Point(21, 77); + labelQuantitySeats.Name = "labelQuantitySeats"; + labelQuantitySeats.Size = new Size(129, 20); + labelQuantitySeats.TabIndex = 1; + labelQuantitySeats.Text = "Количество мест:"; + // + // labelTypeAudience + // + labelTypeAudience.AutoSize = true; + labelTypeAudience.Location = new Point(21, 127); + labelTypeAudience.Name = "labelTypeAudience"; + labelTypeAudience.Size = new Size(116, 20); + labelTypeAudience.TabIndex = 2; + labelTypeAudience.Text = "Тип аудитории:"; + // + // buttonSave + // + buttonSave.Location = new Point(21, 300); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(116, 29); + buttonSave.TabIndex = 3; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(282, 300); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(116, 29); + buttonCancel.TabIndex = 4; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // textBoxNumberAudience + // + textBoxNumberAudience.Location = new Point(176, 29); + textBoxNumberAudience.Name = "textBoxNumberAudience"; + textBoxNumberAudience.Size = new Size(222, 27); + textBoxNumberAudience.TabIndex = 5; + // + // numericUpDownQuantitySeats + // + numericUpDownSeatsCount.Location = new Point(176, 77); + numericUpDownSeatsCount.Maximum = new decimal(new int[] { 500, 0, 0, 0 }); + numericUpDownSeatsCount.Minimum = new decimal(new int[] { 24, 0, 0, 0 }); + numericUpDownSeatsCount.Name = "numericUpDownQuantitySeats"; + numericUpDownSeatsCount.Size = new Size(222, 27); + numericUpDownSeatsCount.TabIndex = 6; + numericUpDownSeatsCount.Value = new decimal(new int[] { 24, 0, 0, 0 }); + // + // checkedListBoxTypeAudience + // + checkedListBoxTypeAudience.FormattingEnabled = true; + checkedListBoxTypeAudience.Location = new Point(176, 127); + checkedListBoxTypeAudience.Name = "checkedListBoxTypeAudience"; + checkedListBoxTypeAudience.Size = new Size(222, 136); + checkedListBoxTypeAudience.TabIndex = 7; + // + // FormAudience + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(412, 353); + Controls.Add(checkedListBoxTypeAudience); + Controls.Add(numericUpDownSeatsCount); + Controls.Add(textBoxNumberAudience); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(labelTypeAudience); + Controls.Add(labelQuantitySeats); + Controls.Add(labelNumberAudience); + Name = "FormAudience"; + StartPosition = FormStartPosition.CenterParent; + Text = "Аудитория"; + ((System.ComponentModel.ISupportInitialize)numericUpDownSeatsCount).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelNumberAudience; + private Label labelQuantitySeats; + private Label labelTypeAudience; + private Button buttonSave; + private Button buttonCancel; + private TextBox textBoxNumberAudience; + private NumericUpDown numericUpDownSeatsCount; + private CheckedListBox checkedListBoxTypeAudience; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormAudience.cs b/ProjectSchedule/ProjectSchedule/Forms/FormAudience.cs new file mode 100644 index 0000000..0adfec3 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormAudience.cs @@ -0,0 +1,95 @@ +using ProjectSchedule.Entities.Enums; +using ProjectSchedule.Entities; +using ProjectSchedule.Repositories; + +namespace ProjectSchedule.Forms; + +public partial class FormAudience : Form +{ + private readonly IAudienceRepository _audienceRepository; + + private int? _audienceId; + + public int Id + { + set + { + try + { + var audience = _audienceRepository.ReadAudienceById(value); + if (audience == null) + { + throw new InvalidDataException(nameof(audience)); + } + + foreach (TypeAudience elem in Enum.GetValues(typeof(TypeAudience))) + { + if ((elem & audience.TypeAudience) != 0) + { + checkedListBoxTypeAudience.SetItemChecked(checkedListBoxTypeAudience.Items.IndexOf(elem), true); + } + } + + textBoxNumberAudience.Text = audience.Number; + numericUpDownSeatsCount.Value = audience.SeatsCount; + _audienceId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormAudience(IAudienceRepository audienceRepository) + { + InitializeComponent(); + _audienceRepository = audienceRepository ?? + throw new ArgumentNullException(nameof(audienceRepository)); + + foreach (var elem in Enum.GetValues(typeof(TypeAudience))) + { + checkedListBoxTypeAudience.Items.Add(elem); + } + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxNumberAudience.Text) || checkedListBoxTypeAudience.CheckedItems.Count == 0) + { + throw new Exception("Имеются незаполненные поля"); + } + + if (_audienceId.HasValue) + { + _audienceRepository.UpdateAudience(CreateAudience(_audienceId.Value)); + } + else + { + _audienceRepository.CreateAudience(CreateAudience(0)); + } + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Audience CreateAudience(int id) + { + TypeAudience typeAudience = TypeAudience.None; + foreach (var elem in checkedListBoxTypeAudience.CheckedItems) + { + typeAudience |= (TypeAudience)elem; + } + + return Audience.CreateEntity(id, textBoxNumberAudience.Text, typeAudience, Convert.ToInt32(numericUpDownSeatsCount.Value)); + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormAudience.resx b/ProjectSchedule/ProjectSchedule/Forms/FormAudience.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormAudience.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormAudiences.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormAudiences.Designer.cs new file mode 100644 index 0000000..a7e4802 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormAudiences.Designer.cs @@ -0,0 +1,127 @@ +namespace ProjectSchedule.Forms +{ + partial class FormAudiences + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + panelButtons = new Panel(); + buttonDel = new Button(); + buttonUpd = new Button(); + buttonAdd = new Button(); + dataGridViewData = new DataGridView(); + panelButtons.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + SuspendLayout(); + // + // panelButtons + // + panelButtons.Controls.Add(buttonDel); + panelButtons.Controls.Add(buttonUpd); + panelButtons.Controls.Add(buttonAdd); + panelButtons.Dock = DockStyle.Right; + panelButtons.Location = new Point(672, 0); + panelButtons.Name = "panelButtons"; + panelButtons.Size = new Size(140, 483); + panelButtons.TabIndex = 0; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(24, 194); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(94, 66); + buttonDel.TabIndex = 4; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += ButtonDel_Click; + // + // buttonUpd + // + buttonUpd.BackgroundImage = Properties.Resources.Upd; + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(24, 106); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(94, 66); + buttonUpd.TabIndex = 3; + buttonUpd.UseVisualStyleBackColor = true; + buttonUpd.Click += ButtonUpd_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(24, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(94, 66); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.RowHeadersWidth = 51; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(672, 483); + dataGridViewData.TabIndex = 1; + // + // FormAudiences + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(812, 483); + Controls.Add(dataGridViewData); + Controls.Add(panelButtons); + Name = "FormAudiences"; + StartPosition = FormStartPosition.CenterParent; + Text = "Аудитории"; + Load += FormAudiences_Load; + panelButtons.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panelButtons; + private Button buttonDel; + private Button buttonUpd; + private Button buttonAdd; + private DataGridView dataGridViewData; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormAudiences.cs b/ProjectSchedule/ProjectSchedule/Forms/FormAudiences.cs new file mode 100644 index 0000000..4c24825 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormAudiences.cs @@ -0,0 +1,104 @@ +using ProjectSchedule.Repositories; +using Unity; + +namespace ProjectSchedule.Forms +{ + public partial class FormAudiences : Form + { + private readonly IUnityContainer _container; + + private readonly IAudienceRepository _audienceRepository; + + public FormAudiences(IUnityContainer container, IAudienceRepository audienceRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _audienceRepository = audienceRepository ?? + throw new ArgumentNullException(nameof(audienceRepository)); + } + + private void FormAudiences_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpd_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _audienceRepository.DeleteAudience(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewData.DataSource = _audienceRepository.ReadAudiences(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormAudiences.resx b/ProjectSchedule/ProjectSchedule/Forms/FormAudiences.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormAudiences.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.Designer.cs new file mode 100644 index 0000000..b7b81a8 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.Designer.cs @@ -0,0 +1,96 @@ +namespace ProjectSchedule.Forms +{ + partial class FormDiscipline + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + textBoxNameDiscipline = new TextBox(); + labelNameDiscipline = new Label(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // textBoxNameDiscipline + // + textBoxNameDiscipline.Location = new Point(228, 42); + textBoxNameDiscipline.Name = "textBoxNameDiscipline"; + textBoxNameDiscipline.Size = new Size(214, 27); + textBoxNameDiscipline.TabIndex = 0; + // + // labelNameDiscipline + // + labelNameDiscipline.AutoSize = true; + labelNameDiscipline.Location = new Point(25, 45); + labelNameDiscipline.Name = "labelNameDiscipline"; + labelNameDiscipline.Size = new Size(172, 20); + labelNameDiscipline.TabIndex = 1; + labelNameDiscipline.Text = "Название дисциплины:"; + // + // buttonSave + // + buttonSave.Location = new Point(25, 131); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(116, 29); + buttonSave.TabIndex = 4; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(326, 131); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(116, 29); + buttonCancel.TabIndex = 5; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // FormDiscipline + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(468, 184); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(labelNameDiscipline); + Controls.Add(textBoxNameDiscipline); + Name = "FormDiscipline"; + StartPosition = FormStartPosition.CenterParent; + Text = "Дисциплина"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private TextBox textBoxNameDiscipline; + private Label labelNameDiscipline; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.cs b/ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.cs new file mode 100644 index 0000000..ff93d98 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.cs @@ -0,0 +1,72 @@ +using ProjectSchedule.Entities; +using ProjectSchedule.Repositories; + +namespace ProjectSchedule.Forms; + +public partial class FormDiscipline : Form +{ + private readonly IDisciplineRepository _disciplineRepository; + + private int? _disciplineId; + + public int Id + { + set + { + try + { + var discipline = _disciplineRepository.ReadDisciplineById(value); + if (discipline == null) + { + throw new InvalidDataException(nameof(discipline)); + } + + textBoxNameDiscipline.Text = discipline.Name; + _disciplineId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormDiscipline(IDisciplineRepository disciplineRepository) + { + InitializeComponent(); + _disciplineRepository = disciplineRepository ?? + throw new ArgumentNullException(nameof(disciplineRepository)); + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxNameDiscipline.Text)) + { + throw new Exception("Поле 'Название дисциплины' должно быть заполнено."); + } + + if (_disciplineId.HasValue) + { + _disciplineRepository.UpdateDiscipline(CreateDiscipline(_disciplineId.Value)); + } + else + { + _disciplineRepository.CreateDiscipline(CreateDiscipline(0)); + } + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Discipline CreateDiscipline(int id) => + Discipline.CreateEntity(id, textBoxNameDiscipline.Text); +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.resx b/ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormDiscipline.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.Designer.cs new file mode 100644 index 0000000..69defd0 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.Designer.cs @@ -0,0 +1,127 @@ +namespace ProjectSchedule.Forms +{ + partial class FormDisciplines + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + panelButtons = new Panel(); + buttonDel = new Button(); + buttonUpd = new Button(); + buttonAdd = new Button(); + dataGridViewData = new DataGridView(); + panelButtons.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + SuspendLayout(); + // + // panelButtons + // + panelButtons.Controls.Add(buttonDel); + panelButtons.Controls.Add(buttonUpd); + panelButtons.Controls.Add(buttonAdd); + panelButtons.Dock = DockStyle.Right; + panelButtons.Location = new Point(660, 0); + panelButtons.Name = "panelButtons"; + panelButtons.Size = new Size(140, 450); + panelButtons.TabIndex = 1; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(24, 194); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(94, 66); + buttonDel.TabIndex = 4; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += ButtonDel_Click; + // + // buttonUpd + // + buttonUpd.BackgroundImage = Properties.Resources.Upd; + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(24, 106); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(94, 66); + buttonUpd.TabIndex = 3; + buttonUpd.UseVisualStyleBackColor = true; + buttonUpd.Click += ButtonUpd_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(24, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(94, 66); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.RowHeadersWidth = 51; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(660, 450); + dataGridViewData.TabIndex = 2; + // + // FormDisciplines + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewData); + Controls.Add(panelButtons); + Name = "FormDisciplines"; + StartPosition = FormStartPosition.CenterParent; + Text = "Дисциплины"; + Load += FormDisciplines_Load; + panelButtons.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panelButtons; + private Button buttonDel; + private Button buttonUpd; + private Button buttonAdd; + private DataGridView dataGridViewData; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.cs b/ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.cs new file mode 100644 index 0000000..a8bdced --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.cs @@ -0,0 +1,104 @@ +using ProjectSchedule.Repositories; +using Unity; + +namespace ProjectSchedule.Forms +{ + public partial class FormDisciplines : Form + { + private readonly IUnityContainer _container; + + private readonly IDisciplineRepository _disciplineRepository; + + public FormDisciplines(IUnityContainer container, IDisciplineRepository disciplineRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _disciplineRepository = disciplineRepository ?? + throw new ArgumentNullException(nameof(disciplineRepository)); + } + + private void FormDisciplines_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpd_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _disciplineRepository.DeleteDiscipline(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewData.DataSource = _disciplineRepository.ReadDisciplines(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.resx b/ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormDisciplines.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormGroup.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormGroup.Designer.cs new file mode 100644 index 0000000..e951b40 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormGroup.Designer.cs @@ -0,0 +1,145 @@ +namespace ProjectSchedule.Forms +{ + partial class FormGroup + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + labelAbbreviationGroup = new Label(); + labelGroupNumber = new Label(); + labelQuantityStudents = new Label(); + numericUpDownStudentsCount = new NumericUpDown(); + textBoxNameGroup = new TextBox(); + textBoxGroupNumber = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + ((System.ComponentModel.ISupportInitialize)numericUpDownStudentsCount).BeginInit(); + SuspendLayout(); + // + // labelAbbreviationGroup + // + labelAbbreviationGroup.AutoSize = true; + labelAbbreviationGroup.Location = new Point(12, 28); + labelAbbreviationGroup.Name = "labelAbbreviationGroup"; + labelAbbreviationGroup.Size = new Size(167, 20); + labelAbbreviationGroup.TabIndex = 0; + labelAbbreviationGroup.Text = "Аббревиатура группы:"; + // + // labelGroupNumber + // + labelGroupNumber.AutoSize = true; + labelGroupNumber.Location = new Point(12, 74); + labelGroupNumber.Name = "labelGroupNumber"; + labelGroupNumber.Size = new Size(115, 20); + labelGroupNumber.TabIndex = 1; + labelGroupNumber.Text = "Номер группы:"; + // + // labelQuantityStudents + // + labelQuantityStudents.AutoSize = true; + labelQuantityStudents.Location = new Point(12, 123); + labelQuantityStudents.Name = "labelQuantityStudents"; + labelQuantityStudents.Size = new Size(165, 20); + labelQuantityStudents.TabIndex = 2; + labelQuantityStudents.Text = "Количество студентов:"; + // + // numericUpDownQuantityStudents + // + numericUpDownStudentsCount.Location = new Point(213, 121); + numericUpDownStudentsCount.Maximum = new decimal(new int[] { 66, 0, 0, 0 }); + numericUpDownStudentsCount.Minimum = new decimal(new int[] { 2, 0, 0, 0 }); + numericUpDownStudentsCount.Name = "numericUpDownQuantityStudents"; + numericUpDownStudentsCount.Size = new Size(176, 27); + numericUpDownStudentsCount.TabIndex = 3; + numericUpDownStudentsCount.Value = new decimal(new int[] { 2, 0, 0, 0 }); + // + // textBoxAbbreviationGroup + // + textBoxNameGroup.Location = new Point(213, 25); + textBoxNameGroup.Name = "textBoxAbbreviationGroup"; + textBoxNameGroup.Size = new Size(176, 27); + textBoxNameGroup.TabIndex = 4; + // + // textBoxGroupNumber + // + textBoxGroupNumber.Location = new Point(213, 71); + textBoxGroupNumber.Name = "textBoxGroupNumber"; + textBoxGroupNumber.Size = new Size(176, 27); + textBoxGroupNumber.TabIndex = 5; + // + // buttonSave + // + buttonSave.Location = new Point(12, 189); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(116, 29); + buttonSave.TabIndex = 7; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(273, 189); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(116, 29); + buttonCancel.TabIndex = 8; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // FormGroupStudents + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(401, 230); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxGroupNumber); + Controls.Add(textBoxNameGroup); + Controls.Add(numericUpDownStudentsCount); + Controls.Add(labelQuantityStudents); + Controls.Add(labelGroupNumber); + Controls.Add(labelAbbreviationGroup); + Name = "FormGroupStudents"; + StartPosition = FormStartPosition.CenterParent; + Text = "Группа студентов"; + ((System.ComponentModel.ISupportInitialize)numericUpDownStudentsCount).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelAbbreviationGroup; + private Label labelGroupNumber; + private Label labelQuantityStudents; + private NumericUpDown numericUpDownStudentsCount; + private TextBox textBoxNameGroup; + private TextBox textBoxGroupNumber; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormGroup.cs b/ProjectSchedule/ProjectSchedule/Forms/FormGroup.cs new file mode 100644 index 0000000..06ec083 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormGroup.cs @@ -0,0 +1,74 @@ +using ProjectSchedule.Entities; +using ProjectSchedule.Repositories; + +namespace ProjectSchedule.Forms; + +public partial class FormGroup : Form +{ + private readonly IGroupRepository _groupRepository; + + private int? _groupId; + + public int Id + { + set + { + try + { + var group = _groupRepository.ReadGroupById(value); + if (group == null) + { + throw new InvalidDataException(nameof(group)); + } + + textBoxNameGroup.Text = group.Name; + textBoxGroupNumber.Text = group.GroupNumber; + numericUpDownStudentsCount.Value = group.StudentsCount; + _groupId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormGroup(IGroupRepository groupRepository) + { + InitializeComponent(); + _groupRepository = groupRepository ?? + throw new ArgumentNullException(nameof(groupRepository)); + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxNameGroup.Text) || string.IsNullOrWhiteSpace(textBoxGroupNumber.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + + if (_groupId.HasValue) + { + _groupRepository.UpdateGroup(CreateGroup(_groupId.Value)); + } + else + { + _groupRepository.CreateGroup(CreateGroup(0)); + } + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Group CreateGroup(int id) => + Group.CreateEntity(id, textBoxNameGroup.Text, textBoxGroupNumber.Text, Convert.ToInt32(numericUpDownStudentsCount.Value)); +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormGroup.resx b/ProjectSchedule/ProjectSchedule/Forms/FormGroup.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormGroup.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormGroups.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormGroups.Designer.cs new file mode 100644 index 0000000..ba21fd3 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormGroups.Designer.cs @@ -0,0 +1,127 @@ +namespace ProjectSchedule.Forms +{ + partial class FormGroups + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + panelButtons = new Panel(); + buttonDel = new Button(); + buttonUpd = new Button(); + buttonAdd = new Button(); + dataGridViewData = new DataGridView(); + panelButtons.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + SuspendLayout(); + // + // panelButtons + // + panelButtons.Controls.Add(buttonDel); + panelButtons.Controls.Add(buttonUpd); + panelButtons.Controls.Add(buttonAdd); + panelButtons.Dock = DockStyle.Right; + panelButtons.Location = new Point(660, 0); + panelButtons.Name = "panelButtons"; + panelButtons.Size = new Size(140, 450); + panelButtons.TabIndex = 2; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(24, 194); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(94, 66); + buttonDel.TabIndex = 4; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += ButtonDel_Click; + // + // buttonUpd + // + buttonUpd.BackgroundImage = Properties.Resources.Upd; + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(24, 106); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(94, 66); + buttonUpd.TabIndex = 3; + buttonUpd.UseVisualStyleBackColor = true; + buttonUpd.Click += ButtonUpd_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(24, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(94, 66); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.RowHeadersWidth = 51; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(660, 450); + dataGridViewData.TabIndex = 3; + // + // FormGroupsStudents + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewData); + Controls.Add(panelButtons); + Name = "FormGroupsStudents"; + StartPosition = FormStartPosition.CenterParent; + Text = "Группы студентов"; + Load += FormGroups_Load; + panelButtons.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panelButtons; + private Button buttonDel; + private Button buttonUpd; + private Button buttonAdd; + private DataGridView dataGridViewData; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormGroups.cs b/ProjectSchedule/ProjectSchedule/Forms/FormGroups.cs new file mode 100644 index 0000000..dcb7a1a --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormGroups.cs @@ -0,0 +1,104 @@ +using ProjectSchedule.Repositories; +using Unity; + +namespace ProjectSchedule.Forms +{ + public partial class FormGroups : Form + { + private readonly IUnityContainer _container; + + private readonly IGroupRepository _groupRepository; + + public FormGroups(IUnityContainer container, IGroupRepository groupRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _groupRepository = groupRepository ?? + throw new ArgumentNullException(nameof(groupRepository)); + } + + private void FormGroups_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpd_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _groupRepository.DeleteGroup(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewData.DataSource = _groupRepository.ReadGroups(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormGroups.resx b/ProjectSchedule/ProjectSchedule/Forms/FormGroups.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormGroups.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormSchedule.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormSchedule.Designer.cs new file mode 100644 index 0000000..26f77a2 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormSchedule.Designer.cs @@ -0,0 +1,294 @@ +namespace ProjectSchedule.Forms +{ + partial class FormSchedule + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + labelEducator = new Label(); + labelDiscipline = new Label(); + labelAudience = new Label(); + labelGroupStudents = new Label(); + labelNumberDay = new Label(); + labelTypeWeek = new Label(); + labelNumberPair = new Label(); + labelTypeActivity = new Label(); + comboBoxDiscipline = new ComboBox(); + comboBoxGroup = new ComboBox(); + comboBoxTeacher = new ComboBox(); + comboBoxAudience = new ComboBox(); + comboBoxTypeWeek = new ComboBox(); + comboBoxTypePair = new ComboBox(); + numericUpDownNumberPair = new NumericUpDown(); + numericUpDownNumberDay = new NumericUpDown(); + buttonSave = new Button(); + buttonCancel = new Button(); + labelDateDay = new Label(); + dateTimePickerDateDay = new DateTimePicker(); + ((System.ComponentModel.ISupportInitialize)numericUpDownNumberPair).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownNumberDay).BeginInit(); + SuspendLayout(); + // + // labelEducator + // + labelEducator.AutoSize = true; + labelEducator.Location = new Point(34, 27); + labelEducator.Name = "labelEducator"; + labelEducator.Size = new Size(120, 20); + labelEducator.TabIndex = 0; + labelEducator.Text = "Преподаватель:"; + // + // labelDiscipline + // + labelDiscipline.AutoSize = true; + labelDiscipline.Location = new Point(34, 66); + labelDiscipline.Name = "labelDiscipline"; + labelDiscipline.Size = new Size(99, 20); + labelDiscipline.TabIndex = 1; + labelDiscipline.Text = "Дисциплина:"; + // + // labelAudience + // + labelAudience.AutoSize = true; + labelAudience.Location = new Point(34, 159); + labelAudience.Name = "labelAudience"; + labelAudience.Size = new Size(87, 20); + labelAudience.TabIndex = 2; + labelAudience.Text = "Аудитория:"; + // + // labelGroupStudents + // + labelGroupStudents.AutoSize = true; + labelGroupStudents.Location = new Point(34, 111); + labelGroupStudents.Name = "labelGroupStudents"; + labelGroupStudents.Size = new Size(133, 20); + labelGroupStudents.TabIndex = 3; + labelGroupStudents.Text = "Группа студентов:"; + // + // labelNumberDay + // + labelNumberDay.AutoSize = true; + labelNumberDay.Location = new Point(34, 285); + labelNumberDay.Name = "labelNumberDay"; + labelNumberDay.Size = new Size(89, 20); + labelNumberDay.TabIndex = 4; + labelNumberDay.Text = "Номер дня:"; + // + // labelTypeWeek + // + labelTypeWeek.AutoSize = true; + labelTypeWeek.Location = new Point(34, 207); + labelTypeWeek.Name = "labelTypeWeek"; + labelTypeWeek.Size = new Size(63, 20); + labelTypeWeek.TabIndex = 5; + labelTypeWeek.Text = "Неделя:"; + // + // labelNumberPair + // + labelNumberPair.AutoSize = true; + labelNumberPair.Location = new Point(32, 331); + labelNumberPair.Name = "labelNumberPair"; + labelNumberPair.Size = new Size(101, 20); + labelNumberPair.TabIndex = 6; + labelNumberPair.Text = "Номер пары:"; + // + // labelTypeActivity + // + labelTypeActivity.AutoSize = true; + labelTypeActivity.Location = new Point(34, 375); + labelTypeActivity.Name = "labelTypeActivity"; + labelTypeActivity.Size = new Size(97, 20); + labelTypeActivity.TabIndex = 7; + labelTypeActivity.Text = "Тип занятия:"; + // + // comboBoxDiscipline + // + comboBoxDiscipline.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxDiscipline.FormattingEnabled = true; + comboBoxDiscipline.Location = new Point(245, 66); + comboBoxDiscipline.Name = "comboBoxDiscipline"; + comboBoxDiscipline.Size = new Size(210, 28); + comboBoxDiscipline.TabIndex = 8; + // + // comboBoxGroupStudents + // + comboBoxGroup.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxGroup.FormattingEnabled = true; + comboBoxGroup.Location = new Point(245, 108); + comboBoxGroup.Name = "comboBoxGroupStudents"; + comboBoxGroup.Size = new Size(210, 28); + comboBoxGroup.TabIndex = 9; + // + // comboBoxEducator + // + comboBoxTeacher.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxTeacher.FormattingEnabled = true; + comboBoxTeacher.Location = new Point(245, 24); + comboBoxTeacher.Name = "comboBoxEducator"; + comboBoxTeacher.Size = new Size(210, 28); + comboBoxTeacher.TabIndex = 10; + // + // comboBoxAudience + // + comboBoxAudience.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxAudience.FormattingEnabled = true; + comboBoxAudience.Location = new Point(245, 159); + comboBoxAudience.Name = "comboBoxAudience"; + comboBoxAudience.Size = new Size(210, 28); + comboBoxAudience.TabIndex = 11; + // + // comboBoxTypeWeek + // + comboBoxTypeWeek.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxTypeWeek.FormattingEnabled = true; + comboBoxTypeWeek.Location = new Point(245, 204); + comboBoxTypeWeek.Name = "comboBoxTypeWeek"; + comboBoxTypeWeek.Size = new Size(210, 28); + comboBoxTypeWeek.TabIndex = 12; + // + // comboBoxTypeActivity + // + comboBoxTypePair.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxTypePair.FormattingEnabled = true; + comboBoxTypePair.Location = new Point(245, 372); + comboBoxTypePair.Name = "comboBoxTypeActivity"; + comboBoxTypePair.Size = new Size(210, 28); + comboBoxTypePair.TabIndex = 14; + // + // numericUpDownNumberPair + // + numericUpDownNumberPair.Location = new Point(245, 329); + numericUpDownNumberPair.Maximum = new decimal(new int[] { 8, 0, 0, 0 }); + numericUpDownNumberPair.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + numericUpDownNumberPair.Name = "numericUpDownNumberPair"; + numericUpDownNumberPair.Size = new Size(210, 27); + numericUpDownNumberPair.TabIndex = 15; + numericUpDownNumberPair.Value = new decimal(new int[] { 1, 0, 0, 0 }); + // + // numericUpDownNumberDay + // + numericUpDownNumberDay.Location = new Point(245, 283); + numericUpDownNumberDay.Maximum = new decimal(new int[] { 7, 0, 0, 0 }); + numericUpDownNumberDay.Minimum = new decimal(new int[] { 1, 0, 0, 0 }); + numericUpDownNumberDay.Name = "numericUpDownNumberDay"; + numericUpDownNumberDay.Size = new Size(210, 27); + numericUpDownNumberDay.TabIndex = 16; + numericUpDownNumberDay.Value = new decimal(new int[] { 1, 0, 0, 0 }); + // + // buttonSave + // + buttonSave.Location = new Point(34, 430); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(116, 29); + buttonSave.TabIndex = 17; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(339, 430); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(116, 29); + buttonCancel.TabIndex = 18; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // labelDateDay + // + labelDateDay.AutoSize = true; + labelDateDay.Location = new Point(34, 251); + labelDateDay.Name = "labelDateDay"; + labelDateDay.Size = new Size(73, 20); + labelDateDay.TabIndex = 19; + labelDateDay.Text = "Дата дня:"; + // + // dateTimePickerDateDay + // + dateTimePickerDateDay.Location = new Point(245, 246); + dateTimePickerDateDay.Name = "dateTimePickerDateDay"; + dateTimePickerDateDay.Size = new Size(210, 27); + dateTimePickerDateDay.TabIndex = 20; + // + // FormCompilingSchedule + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(482, 487); + Controls.Add(dateTimePickerDateDay); + Controls.Add(labelDateDay); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(numericUpDownNumberDay); + Controls.Add(numericUpDownNumberPair); + Controls.Add(comboBoxTypePair); + Controls.Add(comboBoxTypeWeek); + Controls.Add(comboBoxAudience); + Controls.Add(comboBoxTeacher); + Controls.Add(comboBoxGroup); + Controls.Add(comboBoxDiscipline); + Controls.Add(labelTypeActivity); + Controls.Add(labelNumberPair); + Controls.Add(labelTypeWeek); + Controls.Add(labelNumberDay); + Controls.Add(labelGroupStudents); + Controls.Add(labelAudience); + Controls.Add(labelDiscipline); + Controls.Add(labelEducator); + Name = "FormCompilingSchedule"; + StartPosition = FormStartPosition.CenterParent; + Text = "Составление расписания"; + ((System.ComponentModel.ISupportInitialize)numericUpDownNumberPair).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownNumberDay).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelEducator; + private Label labelDiscipline; + private Label labelAudience; + private Label labelGroupStudents; + private Label labelNumberDay; + private Label labelTypeWeek; + private Label labelNumberPair; + private Label labelTypeActivity; + private ComboBox comboBoxDiscipline; + private ComboBox comboBoxGroup; + private ComboBox comboBoxTeacher; + private ComboBox comboBoxAudience; + private ComboBox comboBoxTypeWeek; + private ComboBox comboBoxTypePair; + private NumericUpDown numericUpDownNumberPair; + private NumericUpDown numericUpDownNumberDay; + private Button buttonSave; + private Button buttonCancel; + private Label labelDateDay; + private DateTimePicker dateTimePickerDateDay; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormSchedule.cs b/ProjectSchedule/ProjectSchedule/Forms/FormSchedule.cs new file mode 100644 index 0000000..dedb4a2 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormSchedule.cs @@ -0,0 +1,65 @@ +using ProjectSchedule.Entities; +using ProjectSchedule.Entities.Enums; +using ProjectSchedule.Repositories; + +namespace ProjectSchedule.Forms +{ + public partial class FormSchedule : Form + { + private readonly IScheduleRepository _scheduleRepository; + + public FormSchedule(IScheduleRepository scheduleRepository, IDisciplineRepository disciplineRepository, + ITeacherRepository teacherRepository, IGroupRepository groupRepository, IAudienceRepository audienceRepository) + { + InitializeComponent(); + + _scheduleRepository = scheduleRepository ?? + throw new ArgumentNullException(nameof(scheduleRepository)); + + comboBoxTeacher.DataSource = teacherRepository.ReadTeachers(); + comboBoxTeacher.DisplayMember = "Surname"; + comboBoxTeacher.ValueMember = "Id"; + + comboBoxDiscipline.DataSource = disciplineRepository.ReadDisciplines(); + comboBoxDiscipline.DisplayMember = "NameDiscipline"; + comboBoxDiscipline.ValueMember = "Id"; + + comboBoxGroup.DataSource = groupRepository.ReadGroups(); + comboBoxGroup.DisplayMember = "NameGroup"; + comboBoxGroup.ValueMember = "Id"; + + comboBoxAudience.DataSource = audienceRepository.ReadAudiences(); + comboBoxAudience.DisplayMember = "NumberAudience"; + comboBoxAudience.ValueMember = "Id"; + + comboBoxTypeWeek.DataSource = Enum.GetValues(typeof(TypeWeek)); + + comboBoxTypePair.DataSource = Enum.GetValues(typeof(TypePair)); + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (comboBoxTeacher.SelectedIndex < 0 || comboBoxDiscipline.SelectedIndex < 0 || comboBoxGroup.SelectedIndex < 0 || + comboBoxAudience.SelectedIndex < 0 || comboBoxTypeWeek.SelectedIndex < 1 || comboBoxTypePair.SelectedIndex < 1) + { + throw new Exception("Имеются незаполненные поля"); + } + + _scheduleRepository.CreateSchedule(Schedule.CreateOperation(0, (int)comboBoxTeacher.SelectedValue!, + (int)comboBoxDiscipline.SelectedValue!, (int)comboBoxGroup.SelectedValue!, (int)comboBoxAudience.SelectedValue!, + dateTimePickerDateDay.Value, (TypeWeek)comboBoxTypeWeek.SelectedItem!, Convert.ToInt32(numericUpDownNumberDay.Value), + Convert.ToInt32(numericUpDownNumberPair.Value), (TypePair)comboBoxTypePair.SelectedItem!)); + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка сохранения", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormSchedule.resx b/ProjectSchedule/ProjectSchedule/Forms/FormSchedule.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormSchedule.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormSchedules.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormSchedules.Designer.cs new file mode 100644 index 0000000..73b7d05 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormSchedules.Designer.cs @@ -0,0 +1,99 @@ +namespace ProjectSchedule.Forms +{ + partial class FormSchedules + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + panelButtons = new Panel(); + buttonAdd = new Button(); + dataGridViewData = new DataGridView(); + panelButtons.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + SuspendLayout(); + // + // panelButtons + // + panelButtons.Controls.Add(buttonAdd); + panelButtons.Dock = DockStyle.Right; + panelButtons.Location = new Point(1113, 0); + panelButtons.Name = "panelButtons"; + panelButtons.Size = new Size(140, 484); + panelButtons.TabIndex = 3; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(24, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(94, 66); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.RowHeadersWidth = 51; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(1113, 484); + dataGridViewData.TabIndex = 4; + // + // FormCompilingSchedules + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1253, 484); + Controls.Add(dataGridViewData); + Controls.Add(panelButtons); + Name = "FormCompilingSchedules"; + StartPosition = FormStartPosition.CenterParent; + Text = "Cоставление расписаний"; + Load += FormSchedules_Load; + panelButtons.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panelButtons; + private Button buttonAdd; + private DataGridView dataGridViewData; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormSchedules.cs b/ProjectSchedule/ProjectSchedule/Forms/FormSchedules.cs new file mode 100644 index 0000000..0b6dcbc --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormSchedules.cs @@ -0,0 +1,48 @@ +using ProjectSchedule.Repositories; +using Unity; + +namespace ProjectSchedule.Forms +{ + public partial class FormSchedules : Form + { + private readonly IUnityContainer _container; + + private readonly IScheduleRepository _scheduleRepository; + + public FormSchedules(IUnityContainer container, IScheduleRepository scheduleRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _scheduleRepository = scheduleRepository ?? + throw new ArgumentNullException(nameof(scheduleRepository)); + } + + private void FormSchedules_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewData.DataSource = _scheduleRepository.ReadSchedules(); + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormSchedules.resx b/ProjectSchedule/ProjectSchedule/Forms/FormSchedules.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormSchedules.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.Designer.cs new file mode 100644 index 0000000..dedaec2 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.Designer.cs @@ -0,0 +1,225 @@ +namespace ProjectSchedule.Forms +{ + partial class FormStudingPlanSupplement + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + comboBoxGroup = new ComboBox(); + labelGroupStudents = new Label(); + labelNameCurriculum = new Label(); + labelSemester = new Label(); + textBoxNameCurriculum = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + textBoxSemester = new TextBox(); + groupBoxDisciplines = new GroupBox(); + dataGridViewDisciplines = new DataGridView(); + ColumnDiscipline = new DataGridViewComboBoxColumn(); + ColumnQuantityLectures = new DataGridViewTextBoxColumn(); + ColumnQuantityPractices = new DataGridViewTextBoxColumn(); + labelDateAdoptionPlan = new Label(); + dateTimePickerDateAdoptionPlan = new DateTimePicker(); + groupBoxDisciplines.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewDisciplines).BeginInit(); + SuspendLayout(); + // + // comboBoxGroupStudents + // + comboBoxGroup.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxGroup.FormattingEnabled = true; + comboBoxGroup.Location = new Point(252, 6); + comboBoxGroup.Name = "comboBoxGroupStudents"; + comboBoxGroup.Size = new Size(218, 28); + comboBoxGroup.TabIndex = 1; + // + // labelGroupStudents + // + labelGroupStudents.AutoSize = true; + labelGroupStudents.Location = new Point(12, 9); + labelGroupStudents.Name = "labelGroupStudents"; + labelGroupStudents.Size = new Size(133, 20); + labelGroupStudents.TabIndex = 3; + labelGroupStudents.Text = "Группа студентов:"; + // + // labelNameCurriculum + // + labelNameCurriculum.AutoSize = true; + labelNameCurriculum.Location = new Point(12, 46); + labelNameCurriculum.Name = "labelNameCurriculum"; + labelNameCurriculum.Size = new Size(230, 20); + labelNameCurriculum.TabIndex = 4; + labelNameCurriculum.Text = "Название учебной программы:"; + // + // labelSemester + // + labelSemester.AutoSize = true; + labelSemester.Location = new Point(12, 83); + labelSemester.Name = "labelSemester"; + labelSemester.Size = new Size(70, 20); + labelSemester.TabIndex = 7; + labelSemester.Text = "Семестр:"; + // + // textBoxNameCurriculum + // + textBoxNameCurriculum.Location = new Point(252, 43); + textBoxNameCurriculum.Name = "textBoxNameCurriculum"; + textBoxNameCurriculum.Size = new Size(218, 27); + textBoxNameCurriculum.TabIndex = 8; + // + // buttonSave + // + buttonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + buttonSave.Location = new Point(12, 522); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(116, 29); + buttonSave.TabIndex = 12; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonCancel.Location = new Point(354, 522); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(116, 29); + buttonCancel.TabIndex = 13; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // textBoxSemester + // + textBoxSemester.Location = new Point(252, 80); + textBoxSemester.Name = "textBoxSemester"; + textBoxSemester.Size = new Size(218, 27); + textBoxSemester.TabIndex = 15; + // + // groupBoxDisciplines + // + groupBoxDisciplines.Controls.Add(dataGridViewDisciplines); + groupBoxDisciplines.Location = new Point(12, 155); + groupBoxDisciplines.Name = "groupBoxDisciplines"; + groupBoxDisciplines.Size = new Size(458, 343); + groupBoxDisciplines.TabIndex = 16; + groupBoxDisciplines.TabStop = false; + groupBoxDisciplines.Text = "Дисциплины"; + // + // dataGridViewDisciplines + // + dataGridViewDisciplines.AllowUserToResizeColumns = false; + dataGridViewDisciplines.AllowUserToResizeRows = false; + dataGridViewDisciplines.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewDisciplines.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewDisciplines.Columns.AddRange(new DataGridViewColumn[] { ColumnDiscipline, ColumnQuantityLectures, ColumnQuantityPractices }); + dataGridViewDisciplines.Dock = DockStyle.Fill; + dataGridViewDisciplines.Location = new Point(3, 23); + dataGridViewDisciplines.MultiSelect = false; + dataGridViewDisciplines.Name = "dataGridViewDisciplines"; + dataGridViewDisciplines.RowHeadersVisible = false; + dataGridViewDisciplines.RowHeadersWidth = 51; + dataGridViewDisciplines.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewDisciplines.Size = new Size(452, 317); + dataGridViewDisciplines.TabIndex = 0; + // + // ColumnDiscipline + // + ColumnDiscipline.HeaderText = "Дисциплина"; + ColumnDiscipline.MinimumWidth = 6; + ColumnDiscipline.Name = "ColumnDiscipline"; + // + // ColumnQuantityLectures + // + ColumnQuantityLectures.HeaderText = "Количество лекций"; + ColumnQuantityLectures.MinimumWidth = 6; + ColumnQuantityLectures.Name = "ColumnQuantityLectures"; + // + // ColumnQuantityPractices + // + ColumnQuantityPractices.HeaderText = "Количество практик"; + ColumnQuantityPractices.MinimumWidth = 6; + ColumnQuantityPractices.Name = "ColumnQuantityPractices"; + // + // labelDateAdoptionPlan + // + labelDateAdoptionPlan.AutoSize = true; + labelDateAdoptionPlan.Location = new Point(15, 122); + labelDateAdoptionPlan.Name = "labelDateAdoptionPlan"; + labelDateAdoptionPlan.Size = new Size(161, 20); + labelDateAdoptionPlan.TabIndex = 17; + labelDateAdoptionPlan.Text = "Дата принятия плана:"; + // + // dateTimePickerDateAdoptionPlan + // + dateTimePickerDateAdoptionPlan.Location = new Point(252, 117); + dateTimePickerDateAdoptionPlan.Name = "dateTimePickerDateAdoptionPlan"; + dateTimePickerDateAdoptionPlan.Size = new Size(218, 27); + dateTimePickerDateAdoptionPlan.TabIndex = 18; + // + // FormCurriculumSupplement + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(482, 563); + Controls.Add(dateTimePickerDateAdoptionPlan); + Controls.Add(labelDateAdoptionPlan); + Controls.Add(groupBoxDisciplines); + Controls.Add(textBoxSemester); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxNameCurriculum); + Controls.Add(labelSemester); + Controls.Add(labelNameCurriculum); + Controls.Add(labelGroupStudents); + Controls.Add(comboBoxGroup); + Name = "FormCurriculumSupplement"; + StartPosition = FormStartPosition.CenterParent; + Text = "Дополнение учебного плана"; + groupBoxDisciplines.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewDisciplines).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + private ComboBox comboBoxGroup; + private Label labelGroupStudents; + private Label labelNameCurriculum; + private Label labelSemester; + private TextBox textBoxNameCurriculum; + private Button buttonSave; + private Button buttonCancel; + private TextBox textBoxSemester; + private GroupBox groupBoxDisciplines; + private DataGridView dataGridViewDisciplines; + private DataGridViewComboBoxColumn ColumnDiscipline; + private DataGridViewTextBoxColumn ColumnQuantityLectures; + private DataGridViewTextBoxColumn ColumnQuantityPractices; + private Label labelDateAdoptionPlan; + private DateTimePicker dateTimePickerDateAdoptionPlan; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.cs b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.cs new file mode 100644 index 0000000..9092b6f --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.cs @@ -0,0 +1,70 @@ +using ProjectSchedule.Entities; +using ProjectSchedule.Repositories; +using ProjectSchedule.Repositories.Implementations; + +namespace ProjectSchedule.Forms +{ + public partial class FormStudingPlanSupplement : Form + { + private readonly IStudingPlanSupplementRepository _studingPlanSupplementRepository; + + public FormStudingPlanSupplement(IStudingPlanSupplementRepository studingPlanSupplementRepository, + IDisciplineRepository disciplineRepository, IGroupRepository groupRepository) + { + InitializeComponent(); + _studingPlanSupplementRepository = studingPlanSupplementRepository ?? + throw new ArgumentNullException(nameof(studingPlanSupplementRepository)); + + comboBoxGroup.DataSource = groupRepository.ReadGroups(); + comboBoxGroup.DisplayMember = "Name"; + comboBoxGroup.ValueMember = "Id"; + + ColumnDiscipline.DataSource = disciplineRepository.ReadDisciplines(); + ColumnDiscipline.DisplayMember = "Name"; + ColumnDiscipline.ValueMember = "Id"; + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (dataGridViewDisciplines.RowCount < 1 || comboBoxGroup.SelectedIndex < 0 || + string.IsNullOrWhiteSpace(textBoxNameCurriculum.Text) || string.IsNullOrWhiteSpace(textBoxSemester.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + + _studingPlanSupplementRepository.CreateStudingPlanSupplement(StudingPlanSupplement.CreateOperation(0, + (int)comboBoxGroup.SelectedValue!, textBoxNameCurriculum.Text, textBoxSemester.Text, + dateTimePickerDateAdoptionPlan.Value, CreateListDisciplineStudingPlanSupplementsFromDataGrid())); + + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private List CreateListDisciplineStudingPlanSupplementsFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridViewDisciplines.Rows) + { + if (row.Cells["ColumnDiscipline"].Value == null || row.Cells["ColumnQuantityLectures"].Value == null || + row.Cells["ColumnQuantityPractices"].Value == null) + { + continue; + } + + list.Add(DisciplineStudingPlanSupplement.CreateElement(0, Convert.ToInt32(row.Cells["ColumnDiscipline"].Value), + Convert.ToInt32(row.Cells["ColumnQuantityLectures"].Value), + Convert.ToInt32(row.Cells["ColumnQuantityPractices"].Value))); + } + + return list; + } + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.resx b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.resx new file mode 100644 index 0000000..a2a23f6 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplement.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.Designer.cs new file mode 100644 index 0000000..1312cfb --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.Designer.cs @@ -0,0 +1,113 @@ +namespace ProjectSchedule.Forms +{ + partial class FormStudingPlanSupplements + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + panelButtons = new Panel(); + buttonDel = new Button(); + buttonAdd = new Button(); + dataGridViewData = new DataGridView(); + panelButtons.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + SuspendLayout(); + // + // panelButtons + // + panelButtons.Controls.Add(buttonDel); + panelButtons.Controls.Add(buttonAdd); + panelButtons.Dock = DockStyle.Right; + panelButtons.Location = new Point(764, 0); + panelButtons.Name = "panelButtons"; + panelButtons.Size = new Size(140, 453); + panelButtons.TabIndex = 2; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(24, 372); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(94, 66); + buttonDel.TabIndex = 4; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += ButtonDel_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(24, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(94, 66); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.RowHeadersWidth = 51; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(764, 453); + dataGridViewData.TabIndex = 3; + // + // FormCurriculumSupplements + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(904, 453); + Controls.Add(dataGridViewData); + Controls.Add(panelButtons); + Name = "FormCurriculumSupplements"; + StartPosition = FormStartPosition.CenterParent; + Text = "Дополнения учебного плана"; + Load += FormStudingPlanSupplements_Load; + panelButtons.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panelButtons; + private Button buttonDel; + private Button buttonAdd; + private DataGridView dataGridViewData; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.cs b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.cs new file mode 100644 index 0000000..bad41e7 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.cs @@ -0,0 +1,86 @@ +using ProjectSchedule.Repositories; +using Unity; + +namespace ProjectSchedule.Forms +{ + public partial class FormStudingPlanSupplements : Form + { + private readonly IUnityContainer _container; + + private readonly IStudingPlanSupplementRepository _studingPlanSupplementRepository; + + public FormStudingPlanSupplements(IUnityContainer container, IStudingPlanSupplementRepository studingPlanSupplementRepository) + { + InitializeComponent(); + + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _studingPlanSupplementRepository = studingPlanSupplementRepository ?? + throw new ArgumentNullException(nameof(studingPlanSupplementRepository)); + } + + private void FormStudingPlanSupplements_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _studingPlanSupplementRepository.DeleteStudingPlanSupplement(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => + dataGridViewData.DataSource = _studingPlanSupplementRepository.ReadStudingPlanSupplements(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.resx b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormStudingPlanSupplements.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormTeacher.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormTeacher.Designer.cs new file mode 100644 index 0000000..87b0c9d --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormTeacher.Designer.cs @@ -0,0 +1,140 @@ +namespace ProjectSchedule.Forms +{ + partial class FormTeacher + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + labelSurname = new Label(); + labelName = new Label(); + labelPatronymic = new Label(); + textBoxName = new TextBox(); + textBoxSurname = new TextBox(); + textBoxPatronymic = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // labelSurname + // + labelSurname.AutoSize = true; + labelSurname.Location = new Point(21, 30); + labelSurname.Name = "labelSurname"; + labelSurname.Size = new Size(76, 20); + labelSurname.TabIndex = 0; + labelSurname.Text = "Фамилия:"; + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(21, 78); + labelName.Name = "labelName"; + labelName.Size = new Size(42, 20); + labelName.TabIndex = 1; + labelName.Text = "Имя:"; + // + // labelPatronymic + // + labelPatronymic.AutoSize = true; + labelPatronymic.Location = new Point(21, 133); + labelPatronymic.Name = "labelPatronymic"; + labelPatronymic.Size = new Size(75, 20); + labelPatronymic.TabIndex = 2; + labelPatronymic.Text = "Отчество:"; + // + // textBoxName + // + textBoxName.Location = new Point(161, 75); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(232, 27); + textBoxName.TabIndex = 3; + // + // textBoxSurname + // + textBoxSurname.Location = new Point(161, 27); + textBoxSurname.Name = "textBoxSurname"; + textBoxSurname.Size = new Size(232, 27); + textBoxSurname.TabIndex = 4; + // + // textBoxPatronymic + // + textBoxPatronymic.Location = new Point(161, 130); + textBoxPatronymic.Name = "textBoxPatronymic"; + textBoxPatronymic.Size = new Size(232, 27); + textBoxPatronymic.TabIndex = 5; + // + // buttonSave + // + buttonSave.Location = new Point(21, 200); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(116, 29); + buttonSave.TabIndex = 6; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(277, 200); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(116, 29); + buttonCancel.TabIndex = 7; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // FormEducator + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(405, 246); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxPatronymic); + Controls.Add(textBoxSurname); + Controls.Add(textBoxName); + Controls.Add(labelPatronymic); + Controls.Add(labelName); + Controls.Add(labelSurname); + Name = "FormEducator"; + StartPosition = FormStartPosition.CenterParent; + Text = "Преподаватель"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelSurname; + private Label labelName; + private Label labelPatronymic; + private TextBox textBoxName; + private TextBox textBoxSurname; + private TextBox textBoxPatronymic; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormTeacher.cs b/ProjectSchedule/ProjectSchedule/Forms/FormTeacher.cs new file mode 100644 index 0000000..18eb05c --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormTeacher.cs @@ -0,0 +1,71 @@ +using ProjectSchedule.Entities; +using ProjectSchedule.Repositories; + +namespace ProjectSchedule.Forms; + +public partial class FormTeacher : Form +{ + private readonly ITeacherRepository _teacherRepository; + + private int? _teacherId; + + public int Id + { + set + { + try + { + var teacher = _teacherRepository.ReadTeacherById(value); + if (teacher == null) + { + throw new InvalidDataException(nameof(teacher)); + } + + textBoxSurname.Text = teacher.Surname; + textBoxName.Text = teacher.Name; + textBoxPatronymic.Text = teacher.Patronymic; + _teacherId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + public FormTeacher(ITeacherRepository teacherRepository) + { + InitializeComponent(); + _teacherRepository = teacherRepository ?? + throw new ArgumentNullException(nameof(teacherRepository)); + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxSurname.Text) || string.IsNullOrWhiteSpace(textBoxName.Text) || + string.IsNullOrWhiteSpace(textBoxPatronymic.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + + if (_teacherId.HasValue) + { + _teacherRepository.UpdateTeacher(CreateTeacher(_teacherId.Value)); + } + else + { + _teacherRepository.CreateTeacher(CreateTeacher(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + private Teacher CreateTeacher(int id) => + Teacher.CreateEntity(id, textBoxSurname.Text, textBoxName.Text, textBoxPatronymic.Text); +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormTeacher.resx b/ProjectSchedule/ProjectSchedule/Forms/FormTeacher.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormTeacher.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormTeachers.Designer.cs b/ProjectSchedule/ProjectSchedule/Forms/FormTeachers.Designer.cs new file mode 100644 index 0000000..0aba4b8 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormTeachers.Designer.cs @@ -0,0 +1,127 @@ +namespace ProjectSchedule.Forms +{ + partial class FormTeachers + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + panelButtons = new Panel(); + buttonDel = new Button(); + buttonUpd = new Button(); + buttonAdd = new Button(); + dataGridViewData = new DataGridView(); + panelButtons.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + SuspendLayout(); + // + // panelButtons + // + panelButtons.Controls.Add(buttonDel); + panelButtons.Controls.Add(buttonUpd); + panelButtons.Controls.Add(buttonAdd); + panelButtons.Dock = DockStyle.Right; + panelButtons.Location = new Point(642, 0); + panelButtons.Name = "panelButtons"; + panelButtons.Size = new Size(140, 453); + panelButtons.TabIndex = 1; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(24, 194); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(94, 66); + buttonDel.TabIndex = 4; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += ButtonDel_Click; + // + // buttonUpd + // + buttonUpd.BackgroundImage = Properties.Resources.Upd; + buttonUpd.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpd.Location = new Point(24, 106); + buttonUpd.Name = "buttonUpd"; + buttonUpd.Size = new Size(94, 66); + buttonUpd.TabIndex = 3; + buttonUpd.UseVisualStyleBackColor = true; + buttonUpd.Click += ButtonUpd_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(24, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(94, 66); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.RowHeadersWidth = 51; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(642, 453); + dataGridViewData.TabIndex = 2; + // + // FormEducators + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(782, 453); + Controls.Add(dataGridViewData); + Controls.Add(panelButtons); + Name = "FormEducators"; + StartPosition = FormStartPosition.CenterParent; + Text = "Преподаватели"; + Load += FormTeachers_Load; + panelButtons.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panelButtons; + private Button buttonDel; + private Button buttonUpd; + private Button buttonAdd; + private DataGridView dataGridViewData; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormTeachers.cs b/ProjectSchedule/ProjectSchedule/Forms/FormTeachers.cs new file mode 100644 index 0000000..c6c0749 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormTeachers.cs @@ -0,0 +1,104 @@ +using ProjectSchedule.Repositories; +using Unity; + +namespace ProjectSchedule.Forms +{ + public partial class FormTeachers : Form + { + private readonly IUnityContainer _container; + + private readonly ITeacherRepository _teacherRepository; + + public FormTeachers(IUnityContainer container, ITeacherRepository teacherRepository) + { + InitializeComponent(); + _container = container ?? + throw new ArgumentNullException(nameof(container)); + _teacherRepository = teacherRepository ?? + throw new ArgumentNullException(nameof(teacherRepository)); + } + + private void FormTeachers_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonUpd_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + + try + { + _teacherRepository.DeleteTeacher(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridViewData.DataSource = _teacherRepository.ReadTeachers(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Forms/FormTeachers.resx b/ProjectSchedule/ProjectSchedule/Forms/FormTeachers.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Forms/FormTeachers.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Program.cs b/ProjectSchedule/ProjectSchedule/Program.cs index 4b18fc6..acf3d64 100644 --- a/ProjectSchedule/ProjectSchedule/Program.cs +++ b/ProjectSchedule/ProjectSchedule/Program.cs @@ -1,3 +1,8 @@ +using ProjectSchedule.Repositories; +using ProjectSchedule.Repositories.Implementations; +using Unity; +using Unity.Lifetime; + namespace ProjectSchedule { internal static class Program @@ -11,7 +16,19 @@ namespace ProjectSchedule // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new Form1()); + Application.Run(CreateUnityContainer().Resolve()); + } + + private static IUnityContainer CreateUnityContainer() + { + var container = new UnityContainer(); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + container.RegisterType(new TransientLifetimeManager()); + return container; } } } \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/ProjectSchedule.csproj b/ProjectSchedule/ProjectSchedule/ProjectSchedule.csproj index 663fdb8..0a35f75 100644 --- a/ProjectSchedule/ProjectSchedule/ProjectSchedule.csproj +++ b/ProjectSchedule/ProjectSchedule/ProjectSchedule.csproj @@ -8,4 +8,20 @@ enable + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Properties/Resources.Designer.cs b/ProjectSchedule/ProjectSchedule/Properties/Resources.Designer.cs new file mode 100644 index 0000000..bbe4050 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// Этот код создан программой. +// Исполняемая версия:4.0.30319.42000 +// +// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +// повторной генерации кода. +// +//------------------------------------------------------------------------------ + +namespace ProjectSchedule.Properties { + using System; + + + /// + /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + /// + // Этот класс создан автоматически классом StronglyTypedResourceBuilder + // с помощью такого средства, как ResGen или Visual Studio. + // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + // с параметром /str или перестройте свой проект VS. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectSchedule.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Перезаписывает свойство CurrentUICulture текущего потока для всех + /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Add { + get { + object obj = ResourceManager.GetObject("добавить", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Del { + get { + object obj = ResourceManager.GetObject("удалить", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Upd { + get { + object obj = ResourceManager.GetObject("редактировать", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Bg { + get { + object obj = ResourceManager.GetObject("фон", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/ProjectSchedule/ProjectSchedule/Properties/Resources.resx b/ProjectSchedule/ProjectSchedule/Properties/Resources.resx new file mode 100644 index 0000000..ad1f19f --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Properties/Resources.resx @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\добавить.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\редактировать.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\удалить.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\фон.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/IAudienceRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/IAudienceRepository.cs new file mode 100644 index 0000000..0c0b887 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/IAudienceRepository.cs @@ -0,0 +1,17 @@ +using ProjectSchedule.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Repositories; + +public interface IAudienceRepository +{ + IEnumerable ReadAudiences(); + Audience ReadAudienceById(int id); + void CreateAudience(Audience audience); + void UpdateAudience(Audience audience); + void DeleteAudience(int id); +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/IDisciplineRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/IDisciplineRepository.cs new file mode 100644 index 0000000..4170ccd --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/IDisciplineRepository.cs @@ -0,0 +1,17 @@ +using ProjectSchedule.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Repositories; + +public interface IDisciplineRepository +{ + IEnumerable ReadDisciplines(); + Discipline ReadDisciplineById(int id); + void CreateDiscipline(Discipline discipline); + void UpdateDiscipline(Discipline discipline); + void DeleteDiscipline(int id); +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/IGroupRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/IGroupRepository.cs new file mode 100644 index 0000000..d54f076 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/IGroupRepository.cs @@ -0,0 +1,17 @@ +using ProjectSchedule.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Repositories; + +public interface IGroupRepository +{ + IEnumerable ReadGroups(); + Group ReadGroupById(int id); + void CreateGroup(Group group); + void UpdateGroup(Group group); + void DeleteGroup(int id); +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/IScheduleRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/IScheduleRepository.cs new file mode 100644 index 0000000..f4989b6 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/IScheduleRepository.cs @@ -0,0 +1,15 @@ +using ProjectSchedule.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Repositories; + +public interface IScheduleRepository +{ + IEnumerable ReadSchedules(DateTime? dateForm = null, DateTime? dateTo = null, + int? teacherId = null, int? disciplineId = null, int? groupStudentsId = null, int? audienceId = null); + void CreateSchedule(Schedule schedule); +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/IStudingPlanSupplementRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/IStudingPlanSupplementRepository.cs new file mode 100644 index 0000000..634c319 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/IStudingPlanSupplementRepository.cs @@ -0,0 +1,16 @@ +using ProjectSchedule.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Repositories; + +public interface IStudingPlanSupplementRepository +{ + IEnumerable ReadStudingPlanSupplements(DateTime? dateForm = null, DateTime? dateTo = null, + int? disciplineId = null, int? groupStudentsId = null); + void CreateStudingPlanSupplement(StudingPlanSupplement studingPlanSupplement); + void DeleteStudingPlanSupplement(int id); +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/ITeacherRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/ITeacherRepository.cs new file mode 100644 index 0000000..5f83ca3 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/ITeacherRepository.cs @@ -0,0 +1,17 @@ +using ProjectSchedule.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectSchedule.Repositories; + +public interface ITeacherRepository +{ + IEnumerable ReadTeachers(); + Teacher ReadTeacherById(int id); + void CreateTeacher(Teacher teacher); + void UpdateTeacher(Teacher teacher); + void DeleteTeacher(int id); +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/Implementations/AudienceRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/AudienceRepository.cs new file mode 100644 index 0000000..0a341ac --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/AudienceRepository.cs @@ -0,0 +1,29 @@ +using ProjectSchedule.Entities; +using ProjectSchedule.Entities.Enums; + +namespace ProjectSchedule.Repositories.Implementations; + +public class AudienceRepository : IAudienceRepository +{ + public void CreateAudience(Audience audience) + { + } + + public void DeleteAudience(int id) + { + } + + public Audience ReadAudienceById(int id) + { + return Audience.CreateEntity(0, string.Empty, TypeAudience.None, 0); + } + + public IEnumerable ReadAudiences() + { + return []; + } + + public void UpdateAudience(Audience audience) + { + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/Implementations/DisciplineRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/DisciplineRepository.cs new file mode 100644 index 0000000..fed1768 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/DisciplineRepository.cs @@ -0,0 +1,28 @@ +using ProjectSchedule.Entities; + +namespace ProjectSchedule.Repositories.Implementations; + +public class DisciplineRepository : IDisciplineRepository +{ + public void CreateDiscipline(Discipline discipline) + { + } + + public void DeleteDiscipline(int id) + { + } + + public Discipline ReadDisciplineById(int id) + { + return Discipline.CreateEntity(0, string.Empty); + } + + public IEnumerable ReadDisciplines() + { + return []; + } + + public void UpdateDiscipline(Discipline discipline) + { + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/Implementations/GroupRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/GroupRepository.cs new file mode 100644 index 0000000..5a32cf3 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/GroupRepository.cs @@ -0,0 +1,24 @@ +using ProjectSchedule.Entities; + +namespace ProjectSchedule.Repositories.Implementations; + +public class GroupRepository : IGroupRepository +{ + public void CreateGroup(Group group) + { + } + public void DeleteGroup(int id) + { + } + public Group ReadGroupById(int id) + { + return Group.CreateEntity(0, string.Empty, string.Empty, 0); + } + public IEnumerable ReadGroups() + { + return []; + } + public void UpdateGroup(Group group) + { + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/Implementations/ScheduleRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/ScheduleRepository.cs new file mode 100644 index 0000000..172f254 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/ScheduleRepository.cs @@ -0,0 +1,16 @@ +using ProjectSchedule.Entities; + +namespace ProjectSchedule.Repositories.Implementations; + +public class ScheduleRepository : IScheduleRepository +{ + public void CreateSchedule(Schedule schedule) + { + } + + public IEnumerable ReadSchedules(DateTime? dateForm = null, DateTime? dateTo = null, + int? teacherId = null, int? disciplineId = null, int? groupStudentsId = null, int? audienceId = null) + { + return []; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/Implementations/StudingPlanSupplementRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/StudingPlanSupplementRepository.cs new file mode 100644 index 0000000..bea1e88 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/StudingPlanSupplementRepository.cs @@ -0,0 +1,18 @@ +using ProjectSchedule.Entities; + +namespace ProjectSchedule.Repositories.Implementations; + +public class StudingPlanSupplementRepository : IStudingPlanSupplementRepository +{ + public void CreateStudingPlanSupplement(StudingPlanSupplement studingPlanSupplement) + { + } + public void DeleteStudingPlanSupplement(int id) + { + } + public IEnumerable ReadStudingPlanSupplements(DateTime? dateForm = null, DateTime? dateTo = null, + int? disciplineId = null, int? groupStudentsId = null) + { + return []; + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Repositories/Implementations/TeacherRepository.cs b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/TeacherRepository.cs new file mode 100644 index 0000000..8f266e2 --- /dev/null +++ b/ProjectSchedule/ProjectSchedule/Repositories/Implementations/TeacherRepository.cs @@ -0,0 +1,24 @@ +using ProjectSchedule.Entities; + +namespace ProjectSchedule.Repositories.Implementations; + +public class TeacherRepository : ITeacherRepository +{ + public void CreateTeacher(Teacher teacher) + { + } + public void DeleteTeacher(int id) + { + } + public Teacher ReadTeacherById(int id) + { + return Teacher.CreateEntity(0, string.Empty, string.Empty, string.Empty); + } + public IEnumerable ReadTeachers() + { + return []; + } + public void UpdateTeacher(Teacher teacher) + { + } +} \ No newline at end of file diff --git a/ProjectSchedule/ProjectSchedule/Resources/добавить.jpg b/ProjectSchedule/ProjectSchedule/Resources/добавить.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f3f1760eb9f0a20c4bf1701b303a9e12085ce5c7 GIT binary patch literal 8697 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 literal 0 HcmV?d00001 diff --git a/ProjectSchedule/ProjectSchedule/Resources/редактировать.jpg b/ProjectSchedule/ProjectSchedule/Resources/редактировать.jpg new file mode 100644 index 0000000000000000000000000000000000000000..82d2819c76251e589ba9082f4db072566e16c966 GIT binary patch literal 32694 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

I&ZB?dXe@jlnzirq@vS0jjXV!Sq?_P z+_MBs6ONO%$>c;zql@nNYdyR+cu?tYsHMP-)WZdc?X_>^gbqxbFQSRY%(Pe-3Qs@bo0-b|$W)oq2Z5Z5u`JXPx-`)W3?>9i<`!{Ny z17~3GN%7LpG}Ci(9#QwSiaM8Ho};z0UmSmZAt3$bw53=np>3u%(LvpbB5XYxw4qRR zw>q^1O3WfU%v#KNe(4_)czg!VBX94Jy2%8XO6a47QviWF4A6*eR{)yF#z>e<0QS87 z17NxKF)-EFz>0U=--4;^^#zkm;a|<}Lhe(wh(T2o8*-}|0;)sy`&OtEmP-Y0Dj7QI zh=$$oXnX98jHAz-HukXg&0>-6#Rrpi&FFpQ^1ATF5JkEOw7cpXI%MOM3r=w+pUzWfEtziQ0&k{9#$wnob){<& zFN-?7&*tAuP|@CR!1G&$mWZ$B%G&Y!RQ5D9^O?xsS`Vk@zdN6*#O%DHxk3=kvD=<` zVJFk}XDF)&@7pRB-0b^lSlLfUN(|-B9gjzJ7>w&ig26M;R!!f3RAsVE|GErPa~_Xe z2^p)8A2TlgDolSh4B@ap-0YQVGN8UkK&nW`sWD_}elMmT%Tca>kdiB0jh*b(=3m5F zrIw5breD^rfko9Im;-QBq%AcP44?@(Kn88kzfy*%>~~=!L7MxqEt(WCpv|zgW z0s{JY?&09nBcNpA+}JgQ9k%Z#fSripq5CKl!}5wm8Ok2m^%uKiD2@!#+Jb%<~FJg5mBy7~88-)&^xS91rcUr!{@&p{k#P$2e@o?51_P_^M03W>L}cCvx2T?rDS q?YP-$aWU;YWX~;+OO-9Dx#wB#9#Bn<3;8m+MTPy9Df+@Td;S+bxmvvd literal 0 HcmV?d00001 diff --git a/ProjectSchedule/ProjectSchedule/Resources/удалить.jpg b/ProjectSchedule/ProjectSchedule/Resources/удалить.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f879e35b742c7c7f89b2e39ee73d93bbf8452b56 GIT binary patch literal 14589 zcmbVy1y~)+vhKnq$im&-Ex5Y|_aH%oySqcskl?N%!Ciwp1P#I6o!|~{L9(;=x$oTf z&b>YT&2;_MRn=Y7Q!Q&fPCqUKfHD%&5&$qT000bh0UqZ7q5x<}C}=21XlN*C7#L_+ zcpyAH92`745;6i13mqF93mp>^mwT~I0 zEv`Hsh&a+T*Lzs{1TuZexMw}i5F4CR3E?$oZrB25=Vm6@=kQWRx&N~L{JeIYwcB>m zx!`Mjh~XLifw_h~8)QrxR^1&(8mWa~DvGJBGWIiBL9+So5kPnAE9%IPtlT?c^X-ok zu(clk6hzL5_}4q9dZzCzQG~?`lX7TL#FWs*W#qEaBUO!9vG19ad8{7+TY8Hb4=ZaI z&Q>AHzZF1kRIeOvGTRj@PqkaXlV=hC!XZ`ja&cm@=@WDXX)7|fhc&(&&gHtid1fN$ zn0UMIPWivmP^JA)EcHv^=`I~dJ|Jhr8p8X^cup|Kq}#>&w&4YiABY34ry@`2ZFs#a z)0nNQWhexK@S+;b=Qii78Geq|b&4z@zHlt~5s6y?;>g0We#HKk9X;}zV`RH7ZucH> zbRh|ZAFts)XwZ9|Q_8-EQY5v256JpV3m<4X>CmjO+c88{qYDUm0D#?GhEc5gOd^v=F{Ww|fJoYFF+^p{ z115c&&^62RrqnY3Q2W^4yN*mnKYiP=`g+lSYoFVv@L|c9?YraD#p#h~pvLeSGVdtg zkrqo=AL=0*aV&uF!e%zba z*{#f=Uj0f`f}_=I*Qa|Yr!PeS;vdoQv!mVQGPAwieR9Y35NG^PK(9Y%^Qwj++0p4W zt-9uWfVY6TkH7n2=ywqNFD(GTOYMr$I|UXoVsK3gkP|D!?;%bXKjydQ5)>J|j&u-& z^Xe6(V{OYqAqGGk{gj720F2@T$Z^b>l1|Y+q008LAPivlx=jE;Se{90=jyb%n zu?Wrl1cDM|WKm*@1~X=^O-^qNaJ1}|P(dinQuEzu%ii=&bj|xea`>F~*O#;{WHFi` zh=L-l7r(`wY6>CpkP}l{83@8$()3k)ZT4MD|A>ICt=ufihAMK;3IPC+A4sVNccK+a z3CkEA<9ivDtg^^KA*p%Hs%~orS=Q~36q0NDoQ2m0u*47a>1n=WBp*RmpE=vTLGpCb z+6Ymz>!$}J2KiGmooP&8u%PfC{v_w}CDgpOu`>keLP4-$O?{;yYANVSa)Y(y!r{%@ z$!HT<%7H-*;=)*#kK5cc{9H-`5zpzw;~dw1T{3yg4*-DG48)5p(C_tmH@>uUcXTE% zu{cD~%ZR~O%0UTY0}vkp3Oz2~d;Xqw&$6J~mItFmLJ8OMQ)B`Iepq9 zps9yVmBByxer+hyE0HSV{r|GuNsOgXS6T5U@lCIDA2O#MHEgDAZ zbWZjgPFddx7aPF(%}8{bAlDGzmLOeJk98cViWC0Bc#n6|nQI$}cuGi)sq;Hu4}c}b zpa=#j9HK$JKE+edphy~VAVgW26Miy`FP`{5&YYXza=rJY}Ury1@;0c_7U^D@l6w)H`LGPkPI;D zaIK%3y3TmbpbsDIidV?c(=q)tI({c1F?wkhYmQ-pImUzKit=X^-2Og7o+!y=@`O)D zONX^2M9$nwB>yi7kv8)9NZF{p;;qtsx;iIL)87nateQw4@0EMrw2jG)B0_7c>3J=d zd>K^?AZQYJnhD5Blrcz*2Pp{;jwHvc)-KXzN#gwe(h7FG$upTI$dZ|N`gL~x`@v>* z?sm^=e^jvWN0eWeqH3@-ZRhuoBOW&44-ZBKw>;{izvsK(O4vOmSbBE_B~`v(yXfca z(eAFLBZs%(_7;r8AhYfP*QWS^YrE(`b?=u zk8vt7MnCStN+CwQBTWik3+qBfA`g*5X$cDoTlErOkY2PMi1><+9Z`uxDs`GUqt%5I zOF=4|#x3Pg62|uFa#OPcAkqCn^M>a_T34e2qW7cCDWdeE@{Lqej~WvT*Woq$V5!2F z0_UFOQycuev8X{C*PB9@d1RcIx$SW&EDa|6vU@Z$9w(70N=vT&r85({A__h!pX2X4 znB@h?AJN$T966)u&n7U#tbU;lRRTWgZz&YYL5@jx|CPfvvM@cGA@RcU?F8Pt5Z`Q_ zM*ve1@*{w>+qdqW;*BF`la*n?0B>wiUK54xhthrx z=&E}w*);$sMX__a8cZ8d0#Ns(6T--XAB8dl|IYzhH!qZS=9UW-zKE*|fsOP@t9b|m z57efzqqY&pJB-O1`d(9Te$0rur@S zaL#I5I*G5W?{M{7sIM26I`Z#y_T{xSmO7T`>WFw#uT)zz?v%MeEPwt7W*G&~G2thp$`iTFBb784JG-I_#9ReYi@5fKM>k zG;|nfh1e9gifQXGxl8+|t%JhxwsA&h+2CYgiVZEn#SJ}`H>t?P)ep`oHQ7d2-3?pi ztt)QKQ9Ir_a@^5J-pxA%Ou-f={N0~svV~=|^Np5vc3~Up-+1HK+B@=-+%@wmLB>ju z7Mx89iue#H_4^09H`+^(4l;XK`6Ajn^W#g^Y3TQVG8=5__mDFlNGxk4N?)sQ{CMj< ziOcvyVaWf&$`1Nobe(s7+-u3F{&tcdyRW$(o#KZ^tc@;vJvMW5GgKhDLqvz?m1-3X z8G3?R-5OR}H#G2`tIZ+d0flKPHe%2}FqGRPl7o5+28FYH#>6r;FPORyWZ~Ak9LqHK)gIy*)d+A<8I`_{E^lnEKU{U@wQYQnkLJ#)_iE~+^ZLSn zQXo8*nyWXFUpwM8o!aGh_jZPlF_fF(xXbw-wHu?YuO*Q?6K6OY1FdA zFcrgaKRby%E*9C%Xt%~XP>MbFYJYw;94ac3VdhmnoI}=lTG5KlwuoQunK=Fnv=zBX z@Zh)ILy%Cc(CB@lAapYeJZDABSO{B||8BI+Fxx=P2^WAhg<2n05F8-mCKp$}N1suW zAkSKPX)@86*z^fUm;E(kZm5H{E9 zm{HMKl!!@4g&={f!XnDgK_9e56$I;&!td0CwM?>jIpK2?iGeMw)2@jP%jd;m_qC^3 z0rj%iQ@mJ`MTZlozuIGIYdPQc9IQpcu42BfQ<4s&)BfF(9C?NhHMu>?`5TvUrWY3H z9q1X9bFXSstvO~f$kIrPZAdw?eMzkeYVcKku{DuQYYr{-mfyI=`{GN@%0WM{XI`IH zB(U~q4(LY~^P5Cg#7PzxT@B(G(VN7iV?B5gR7YGF2II_#y60M8-A-Djx))jC%ml>n zFc{fZa9{;3LFcmLd>)dpU{gwooG|@EB%VT#;zbPf4EmdceVfz!G<(i5^`*A?Rn4w- znToYXs^!Fg0hPW$^uSZ@nd{ulZH)@l#v@KIi#p@X&)BJO7~rL$E7b8D9khL2$#Tcp z%M28|t(p?pXBdVz{l+%IY2@!7FP?PgxEJug2~Njj2_EnBz~+G6C}CZE_Y@-9!Jy`? z-6*D}cy~7DS^L>mY~n65HlQ^Rykp5?&&UfMxrxE?uwB^3_R@KRAt1R5q2|@}viLZ| zimqVxCTph3mat&%s`!T3sMk(yey>t>S^CS#H<%|*6AU;qsYJw5t2V8U&bO&$^9w$k zdzYO04UP9hQ-{xB@Vl*k)r#`46!CH%7?ij#6<3A%Q9)v`EIiPg{H&RXG>KvUZhhiw zqmKYVC~BWsFspt4hA5$E5=h5LaJLAd48trv0UW?7A{6sI_r0ie=&re-HzmBBuc9~i zeY>z20Ey*!)X|{;z#zb2Ai@8vHo!pu3M3RNItjBf8ZnC!s}N9_lubnRdE|jVjl5Yh z;6ysX3ij0xf>qmNWA%oJd#bpl!NS5%adVy7HQxkx5Lc~FjIn}Dw!|o@KDT~Pu!~sV zecd)FG={=$acd~gQyKn~W%OK09`#P&>s@f+u4ns_)c2;AvXp5iJsR3|}=1ZBXPsonabe&+|d@ zeFf$>d;C^tEt;$1xI1+jA36#_400;0p<1KZHF}Y(%sY_ZYw-|#bxW0)ha|mNrg31c3Pd22SV}=j zGLxQ-k)QP7*Aiw@#ct&cs*iy1X-eKH3^7Qu=eYZhAR6|uS+9A@t6mo3;Sm6>3DrM_ zNmX=N)#RpY&dpezmZ&W+TS7%K`SHV^biZ@ndgHjmzhQ85yC0!;oEt+$Y9{N!gz$Jy z2eg4Njc90Tx)m4msjCyx(II2RhlUSycAFTiR+bm}@FS)R zrbm>wh_<>X1n@#^fQb4p44g-##c|WNwCdSSR$8(MIky*;-7HpOKR8S*ab<21&OAPO z?0vNjOTVBG3|H3(Q=G1~>JBIIo*6_izU8!2osa*@BB}qH(_J0cW^Ukp%a9*)ufAC? zu)dL{CXAkjKseEoBiOzh+F)4G4#E{`sTKegv z@vLX_&DLCxs@hI5fDtd0nmz^R<1^+(tO^bintuN- z!No_GSCAq-^TY5^KYlRTL}nw`qDTiVwl+z}99r9Vb^>V}i7VONUL2__abXCN3F|M} zINCu4RdGyZ-vfqK1j4Z;D6r3Yi`kE;c@ z7F88m%RLC=HXEP=6DY_D2Sltc$@xc!NWO{uY8HOTan(piUUH*=QkS5qYv447cV)~W zt$!AB$a&540@7$pmAEtO;5jU?fi@xF;Lvaokf6Edd4KbC_$h=!!osE$i%QBYEMj2q zpABSHL?b3shBT}QaQM9&fffW$n(`F+G45*e>~j&=J}b6C@lXFKucVkVd5j1@!=5= zwUv{@X10kzZ%4MgIuS21u&Q!qU4^twTqT+9u*=2Agu-YTNPMp%SC-04LWg+35#n?p+_;sR9RvylbygiBF=`kUwBz{`wTPoEy& zFg6KbklCJPr|WLv$mocwE%)mo#Q*Cpp(rpOdPXoGxO>QD-IB_`)s^oV@(o|C;Jfcv z_gO4FS4f>B`?!N`ojveNH@%}53oD*qnOuVpe^#fy&E=7S;hYEB)w#`lZ=;Vt*g-2; z9Da!0p;G{>GdX*0Su(p@oe_R;O;@*Gy7ZyRN9G^JM3#<{wXtP*nSX^3t|>#|k#n82 z*VLE)FPUfYniNT;nj6NNS}XiZO|*}+L&b$(J zsGo@d$Nsa}RG)9tPT$CTmbi?SwtfG}MCLxreo*tJ43ns)JmhA0Zl{YM;W`vy+%>%_ zo8U)G&C#H3;R(iyMz9`+o7#W;P_OErtGK?8?wSyAt`CnXB3aQ}3_;q{?K;!ZDy5&o zw2WZyPFWqYH?6Pw9{`_MF>8_zmXLAp4Fxl1gK((^bq&Pp)oMc?d}0aw=Bk%{ps60B z7x60KW2XC5n=bqD|dG@izs~q!4iQ784gAuRzXXc_2a|h&PI3Q!cyRtqafjw11 zVq`_!QoYB9gMAAF>Cwl${C1Vl0iyV$JgHN>LOUDHbZA`c9_fmIdM+9%&*#8f9IQGN zUc}~ggP47En@WZ))dOreY<{IpuvmjFUf^jgzCSHmll03~%6_rFZda51n`BB8PTcREXmC(Cv5<>_J{efBOjDkkBMu2uu}E*aFjNsjNz zmUwT7>>?M=c|^$ERoFmnMR;rTrPVWO58jc$Y_2X{<>ecW10!piV(UPI^HfXgow^YB zZ(V#Bj{vR7#^F?4_*}oqg(i7Yy*T;VXt3Au5XRcp^GcS5c5`g;%E!nI<(8KA!Z{0D z=H~{t-Cr+ekuDnbcPiU$=61U-Q@O1p&5RUpL+~v4hc-*U7M0QN4K$woCxy?rxe3z} zVeBx~Ms-=!)yYm?UOpcWL*s=ig=#w9tC7}AbcXhfTLdw1Wle?yJ}}tjVdM?0_-10| z-DLZIX3z1XpynV$1>~pBg?5F-b|cKstAY1>bMcgQ+G{hR^CAb2y~&?u;F=xjv`fie zZSJNL!4+)p4iweQ)-VZPsaKcEv;blFL!G%^N?hl?)d9F!9cc+^9i?;OxXA2TxRz zDeS^5O}iDXvjL+FalzP`q^a<(3~?Q+N^12edMf1mjKvOHwsx$fT_K{YNKwGyK)n*o zU19tAXAD*9&<8a|-34{r#eBu z3*lN{miX-Sc2p1Idsyc80|{)f^TZ24e;CWPobnSv7*FH0*{^SkGNcufopny&jVz7> zYAQ$G!w>@|3YgXU(!mS8_6me@lG-I%iIIc?KM(Wgkh4*Dy@puO#>eBCXF@k*=-kg3 zMdOYf3mEcFmm)6I5Vt`-Z=K(l! zB?>g2msyEjqx}#(PN-5@5>nFO4l)rRhy}%cy!2NiK9C9u!x78F_5p(4P%16F?$g-n zc_3?SeV+x0Mu_H(q|_KwlqClv2jIuy?vKBPf)xP<5vRSMmFfWlV|Gwwm19X>k~1r4 zbfLjE?jl86!8Sx+TVFTK$>^VXhxdguoXHw0QYND_ZP z1h!3*aBLiO?-fEM7nq0EU0J#>LGmF4_&`6{FqSJoe>YhvjtXqLw2AL2-rAUXn;}A_ z`6D0<3yC5Fqe}?akPxMXAG3A2jr+BatX2-JVX(n#i1dYjNq~-8FXiyLpV~u;VfNh* z$UZ{Mkict)aFRZ%YyPGPXAFU~3o&Ex17$k&C7-X++>iMC_*16@fKu7>B#PLUXXaF^tDy=zg)FmQ8RK zscndV8%s=p7WAzbcw8jITfjlQj^8$trtaLw(g22&YI8r@>(RWIX+FIc_ifH~zd>yW zl4Z7p?U>Ohd_$ucLq^}s=#*E$aR%vXLpA>*eQ`a6pF!T|#D2il6Iv>FWw;>)MgfXd zpHw=wysA{0r<07-lou#UvTnI$O>Ycu%Il~4S>MbUyOhUs_`XL-%>rxINPm*rn0p~z zd-~`-O_Z-x!P}&T_kD`T!zU2$X=XM#oqF~$@S*tyk!(J|D46CS$AG8J_?6s*coGL- zUl3XkjA$CgDJk4Udoo

7oO#8eT)-fQP^E5xHEcU0Lm+HpZQSDfqfHZ471I;9ees zDIjti1njK|=mHH2+24^`dzgUe^B-{c0xQY#nK<%zjt$5_nWu&ge zZL%u&2LCwJGXYF;zZNBGA;&H zDy;&CYKGMpz8Pir%Dht(>CJ(UL-GHA7^B*KcQ0I~^u5IrJ~Tue>?^Jh=llLw<0|sR z&7Q=t2tWv8YGD>Av1|P{ML|rNcPFiWBqDHrIG|e?b@Q5YGsH1@)@AVI1hp_T1T_Qz zHHmtMCMAJNfFQ^zZb@pqC+X9WKx#_7FeG z3*OjVpgTod4cmeC2uQ*FK-*6bbom4-Te@1*+bLljAt@$WfcXf429MWotLHB-ea2Yi+f9#pYt z?{JL2xZpv=z}uwF~VLRfeBhc38K1 zi%srC&|&kXk>v9})@VD^X5H>_e&_WbV+00gL!z|#@Fr#xIs zL~!7mCbMVzO#T8#__n5DTOF?_9+ps$oqyMSV)X;w{>WBnx!pzoH13b}2>44T6@O6< z3ACO1bMZp+Rt$Olk_`UX{+YNFf%#WXfV@_G#`!l6Wne*ITL3H>1Ojsh-s_snCmU^p zSkYW-(cBAnrzuYbo_z<1Crj;87b7ieAT|5Uoj!J*2z<9&{J>1UlkbcsNA*O1HT-mh z>k+V*@7C*eg5F+4U%vJah5~&8^h>W*iTvB6mb<@u^#}mbrluTMD4=HaYOXyQea;Q! zpyv7cY`+KLol}1+67U1zU@p-fzP~!W^fwD+{OP)v_}=ZoI!IsX`!|aoME1)Zhq1SS z%xV0MlY+<_zw!D@0Z`%SZ~WyG-nl5fEd+X9vVY@nAQB8ON4@9Cy>AYTn9Y0NG@vl#@BI1>x1?{ure*ism{D324>-t>>4| zIt4d6Wbj|J-~A#-_&_T{G8EAF@$`46zyBNshQbW`Ez$reETr@^*1qC-DF|W<0=qs` za~<@!DcVlY4ARk|a=ooZ*-*)tme#%#kg`gJ9@2X`q*Q6cP3c5oq}N`1>Hgi)iQNhq zZ>*v@<%`DmbIRaVm-YpJEBZxnnH$=h&61b-G+ohE#d|!%Zx24@jTJFpLa1zI#WhKPyCEBk;zb{31Sp|7@rC51o1hym z9TDlVjB?_##JD((j6PlLX@JsYMp!wcSai9fmpg@8kTgiNAtkjPQrc(HTt+#rd{B4{ z^k}hq1c*A_bei7`!W<#(T+l@A8*yA^mnUKOL(%ZN%?bPz5jdH_(&QW|VNUTywv;e?;Cv2`UM4!h4|GS9o%%xJRD0~l)|p3=r&f;>)?Cn)9f{+{GU z^elAeiNv35Y$KIJL(Yr_Kz3}QVq@F(cAC_I{nw7Z;Zjm>AVi4~Sone1km4mzmtQH_<#?mU)N*JyvBVckP+0fR+3! z1o>L}--|ioOhusIeq~0zqv8;donEGnr{RCM>52C3f+~4mfh8+j2b@s04{L*)BbFbW z#T^I5PD-QbE>bbNgzC2I5#Sc1SQ-gF74RmK(!r6K>hnx9Z{(deYSt^4Z&Ox7PqzU` za zY*#Kx-+|I_ym$R+!&PE{*e*olOMkCe<^>xghqUg%;T@6?e2>>AM|x2%J6@Gi)BpR1 zT~t((!?Fc*09V)fI$;fEL*jG+mo;m~k%IUs(EQ&QB9*4YqVU9;-OIjw3U!;!LIQ@_ z_iAI9D5Q+Bj~>twnAeQejSo*5ol(@v^lIBWP2?Zpc_S2D-o_|%XWu`(rVOTX+fC}3 zn&3KX=yrJoSjQ?dkD=5}bZ!v_4!G8eD!!uCoZF?~Y$7b5Ox3kYiA&#LDsgS$m=1*n z;M=Pw4k@Y6(C}NjRHDG0e`WF0fDT8$IF znAYELUp5(IH7d`gxp4~VC?3h#Tv57|jLU_RN60JKR#plK#Zg$Y#SK;4u zrs@6rGm_J6#T5w67iymvjwj_8EG{S19A^Fp_C+x`*24yFiA+ZDtg zb$4=}kcw(63bDvDgLly`#+v9_E}`l`$!JNd`b9ZkCZ1NctKTqfXH$|}!<~RS>eirA z*;=|8LBZ^OOhs#kUIjogn$$OX%l(HwnN?SUM!BiSgl5s)_t7}BXnM6Fkoa#czaH?$ z11}X&5yTG;w!cZ6c!n6|ck&K5Hlzx6>b{m}pFrKvKh`oa}NN(^K=PY-l9H+HW+QVzk`hfAyXpO~~p{}5O4K=Bx3}$^WCyH1E z9P)Sb%MPD?@gyBd-b6hP#qwGYrag%jbMX7D{qbuq`M2|3A1;c*i{6MpB7)I%OuT|a zWg#x?`=IwjLcX03$YFQ zDz{;LVhLF~w013QC?QGf@UIwGxyG*n)Km5wrSf*3Q@jy8L<|iR-=^PQ@?IVS&Ghj2a^|$5$V#PRLGzy3 z*}I4#Hnx4|!Pq-0&J90nhGLLC%T5Uz+qPC+O-g{z1PTpe5(Zh6cr;Zphr)zhc1fugWt{RA=w z3kK`w7jY2O0g$j3xTSWtR4Xn2HdC;|i8XP23ZEC_s82@wx%6K$%ES45q$dG-y+{_G zO=if|zs(s9y-kW;?;x|d<>Yvay)rUpgKbjk4|%#}e)PAk8^DqvO4yMcW#AM0r3D1` zlo++Yz>yHZi1%ThUV1yb$opO~=6o3I&neD`R^MDpDdq zw;eAFq0kUiL7jR9`N|og!oHQ4N3c4yU8*?Ux_?<+*K0q?sGc}=E({L+Y4WDaFa#E^ z+RMYQ6bu+)vs`fFlqW^HAX zLIa44#pc#jp|oM;dP@9ektTl)`TS`AbZ#zLdn4KAkHZ*u+63 zg=I0X9bM;hVFUu%fE+GydHn?*i^tj<>Eb zJk`5a^O5Me|*U%dgfCYT( zF*^7%S}?i6t(;+vpx1=}VUGxon+t7pFw1Azn_+61ZGXyKYV##J5Djus)}@4hnu~vW zZ9RDiVg}TC5rjYA%lal-&eaV={@bzBKQT(PhmG8*?EPB`A_s=3m8PmuPy?D6db42e zynJ4+$_KZC`V<{7J&D&!ZLOUc=k@Z5&)z27<$Dy<5iLR}d|G6Ly=|r48+VucY3U0; zI6^(^U%_vnw0)E4wD%C=r14KU#MIH;=Cbxci9wCw6bh+B*_Mq@T-#3QLXsfDo#cT* zjiKbNy)%Hdl*5U>_%g(2MxC7~Lg^)2S`%qhWYdF7xlaOXS;{NZ$Q0F6sP2pJ{LKil z$_Hg1=mh)6EXbB7BPTwC zMAXBIDTvBRrRT=>lKm^}Gtz5TI5Dda4oxZAJ7}%HJM2cNhP6b%iRRqPx~g=f)PN!B(FoSbJIFO66|hEIiwhH0sZj$IyHmgTLc_GEK9 z7_FM12=!8YGdMYa$O!`}kcs7=V#bAehdUR6Nh7+%DZlW-TSEdomtmcs02~+5l*M4P z@Yo7`&4b9JSCjw&N?GNb2d)JogGXrY4!Yu-PAy3te$od%JuJJd)wvT(>}*(` zrr7SH4@8$;)1kONFn72$k%kd4so0KlNZ~ANTFpAXCCM0gMC}`dz(7QkfejeSud-lA zwxUOx-H~pu8Zc7z+qdom6D~U)9EK5{YPzP=`m)*+5!I4Ld*d?--WBRlbJgCZeA3aZ z5H9WE!qbQa8{l4RcHjE!h4+PTIAgp`iuuhpfjqN;ZT$CD`+)Wg{ht%1!4a5>bVSg* z`fO#jd5Ul_N`Q5bU2$eE!M{Bj{vtOh%`s`G(yQuo&;6H$utG<~{ZX z##AvWw~qjlyd3p5CZix7547D8m}-ctup1J+i2HQn07bm75J`5E8^R%P^MY@VS^lng<21r|es?YrI9oWHy9F7k#UGVFpdpN6ae>%+Wp}p8r8T4X+ z{r!ctZvGCQYly@qUZw7bQ3nEdIu|@5fxJjw8kP^Z1-c0uRBxpQ0QvUB*_uWMDe^2*?BxEcTpM^`$^2CT6FN{=`m|; lpJ$hG!KOxRm}ZmOuF9+)xZ!d}+-2My06DoAwEcga`9G;`@h<=X literal 0 HcmV?d00001 diff --git a/ProjectSchedule/ProjectSchedule/Resources/фон.jpg b/ProjectSchedule/ProjectSchedule/Resources/фон.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1435887e304f96e62dd0740ceccda3204f53a62a GIT binary patch literal 39142 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 literal 0 HcmV?d00001 -- 2.25.1