From 71a5fe1e3ae839ace454cb69653c87102452fb81 Mon Sep 17 00:00:00 2001 From: safia Date: Thu, 21 Nov 2024 22:13:47 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=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=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Entities/Enums/DisLectE.cs | 9 + .../StudentProgress/Entities/Enums/Grade.cs | 17 ++ .../Entities/Enums/TypeOfWork.cs | 10 + .../StudentProgress/Entities/Grades.cs | 20 ++ .../StudentProgress/Entities/Group.cs | 17 ++ .../StudentProgress/Entities/Lectures.cs | 35 +++ .../StudentProgress/Entities/Professors.cs | 17 ++ .../StudentProgress/Entities/Student.cs | 21 ++ .../StudentProgress/Entities/StudentGrades.cs | 19 ++ .../StudentProgress/Entities/Subjects.cs | 17 ++ .../StudentProgress/Form1.Designer.cs | 39 ---- StudentProgress/StudentProgress/Form1.cs | 10 - .../FormStudentProgress.Designer.cs | 149 ++++++++++++ .../StudentProgress/FormStudentProgress.cs | 102 ++++++++ .../StudentProgress/FormStudentProgress.resx | 126 ++++++++++ .../Forms/FormGrade.Designer.cs | 219 ++++++++++++++++++ .../StudentProgress/Forms/FormGrade.cs | 124 ++++++++++ .../StudentProgress/Forms/FormGrade.resx | 126 ++++++++++ .../Forms/FormGrades.Designer.cs | 110 +++++++++ .../StudentProgress/Forms/FormGrades.cs | 80 +++++++ .../{Form1.resx => Forms/FormGrades.resx} | 54 ++--- .../Forms/FormGroup.Designer.cs | 108 +++++++++ .../StudentProgress/Forms/FormGroup.cs | 83 +++++++ .../StudentProgress/Forms/FormGroup.resx | 120 ++++++++++ .../Forms/FormGroups.Designer.cs | 122 ++++++++++ .../StudentProgress/Forms/FormGroups.cs | 103 ++++++++ .../StudentProgress/Forms/FormGroups.resx | 120 ++++++++++ .../Forms/FormLecturesCount.Designer.cs | 106 +++++++++ .../Forms/FormLecturesCount.cs | 96 ++++++++ .../Forms/FormLecturesCount.resx | 120 ++++++++++ .../Forms/FormProfesor.Designer.cs | 124 ++++++++++ .../StudentProgress/Forms/FormProfesor.cs | 71 ++++++ .../StudentProgress/Forms/FormProfesor.resx | 120 ++++++++++ .../Forms/FormProfessors.Designer.cs | 110 +++++++++ .../StudentProgress/Forms/FormProfessors.cs | 99 ++++++++ .../StudentProgress/Forms/FormProfessors.resx | 120 ++++++++++ .../Forms/FormRecordLecture.Designer.cs | 129 +++++++++++ .../Forms/FormRecordLecture.cs | 47 ++++ .../Forms/FormRecordLecture.resx | 120 ++++++++++ .../Forms/FormStudent.Designer.cs | 140 +++++++++++ .../StudentProgress/Forms/FormStudent.cs | 52 +++++ .../StudentProgress/Forms/FormStudent.resx | 120 ++++++++++ .../Forms/FormStudents.Designer.cs | 124 ++++++++++ .../StudentProgress/Forms/FormStudents.cs | 99 ++++++++ .../StudentProgress/Forms/FormStudents.resx | 120 ++++++++++ .../Forms/FormSubject.Designer.cs | 136 +++++++++++ .../StudentProgress/Forms/FormSubject.cs | 44 ++++ .../StudentProgress/Forms/FormSubject.resx | 123 ++++++++++ .../Forms/FormSubjects.Designer.cs | 120 ++++++++++ .../StudentProgress/Forms/FormSubjects.cs | 58 +++++ .../StudentProgress/Forms/FormSubjects.resx | 120 ++++++++++ StudentProgress/StudentProgress/Program.cs | 39 +++- .../Properties/Resources.Designer.cs | 103 ++++++++ .../StudentProgress/Properties/Resources.resx | 133 +++++++++++ .../Repositories/IGradesRepository.cs | 10 + .../Repositories/IGroupRepository.cs | 12 + .../Repositories/ILecturesRepository.cs | 12 + .../Repositories/IProfessorsNameRepository.cs | 13 ++ .../Repositories/IStudentsRepository.cs | 13 ++ .../Repositories/ISubjectsRepository.cs | 10 + .../Implementations/GradesRepository.cs | 29 +++ .../Implementations/GroupRepository.cs | 50 ++++ .../Implementations/LecturesRepository.cs | 32 +++ .../ProfessorsNameRepository.cs | 34 +++ .../Implementations/StudentRepository.cs | 56 +++++ .../Implementations/SubjectsRepository.cs | 28 +++ .../StudentProgress/Resources/Add.png | Bin 0 -> 8979 bytes .../StudentProgress/Resources/BackGround.jpg | Bin 0 -> 69534 bytes .../StudentProgress/Resources/Del.png | Bin 0 -> 13693 bytes .../StudentProgress/Resources/Pencil.png | Bin 0 -> 54942 bytes .../StudentProgress/StudentProgress.csproj | 19 ++ 71 files changed, 5004 insertions(+), 84 deletions(-) create mode 100644 StudentProgress/StudentProgress/Entities/Enums/DisLectE.cs create mode 100644 StudentProgress/StudentProgress/Entities/Enums/Grade.cs create mode 100644 StudentProgress/StudentProgress/Entities/Enums/TypeOfWork.cs create mode 100644 StudentProgress/StudentProgress/Entities/Grades.cs create mode 100644 StudentProgress/StudentProgress/Entities/Group.cs create mode 100644 StudentProgress/StudentProgress/Entities/Lectures.cs create mode 100644 StudentProgress/StudentProgress/Entities/Professors.cs create mode 100644 StudentProgress/StudentProgress/Entities/Student.cs create mode 100644 StudentProgress/StudentProgress/Entities/StudentGrades.cs create mode 100644 StudentProgress/StudentProgress/Entities/Subjects.cs delete mode 100644 StudentProgress/StudentProgress/Form1.Designer.cs delete mode 100644 StudentProgress/StudentProgress/Form1.cs create mode 100644 StudentProgress/StudentProgress/FormStudentProgress.Designer.cs create mode 100644 StudentProgress/StudentProgress/FormStudentProgress.cs create mode 100644 StudentProgress/StudentProgress/FormStudentProgress.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormGrade.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormGrade.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormGrade.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormGrades.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormGrades.cs rename StudentProgress/StudentProgress/{Form1.resx => Forms/FormGrades.resx} (92%) create mode 100644 StudentProgress/StudentProgress/Forms/FormGroup.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormGroup.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormGroup.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormGroups.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormGroups.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormGroups.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormLecturesCount.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormLecturesCount.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormLecturesCount.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormProfesor.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormProfesor.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormProfesor.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormProfessors.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormProfessors.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormProfessors.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormRecordLecture.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormRecordLecture.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormRecordLecture.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormStudent.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormStudent.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormStudent.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormStudents.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormStudents.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormStudents.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormSubject.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormSubject.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormSubject.resx create mode 100644 StudentProgress/StudentProgress/Forms/FormSubjects.Designer.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormSubjects.cs create mode 100644 StudentProgress/StudentProgress/Forms/FormSubjects.resx create mode 100644 StudentProgress/StudentProgress/Properties/Resources.Designer.cs create mode 100644 StudentProgress/StudentProgress/Properties/Resources.resx create mode 100644 StudentProgress/StudentProgress/Repositories/IGradesRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/IGroupRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/ILecturesRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/IProfessorsNameRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/IStudentsRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/ISubjectsRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/Implementations/GradesRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/Implementations/GroupRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/Implementations/LecturesRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/Implementations/ProfessorsNameRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/Implementations/StudentRepository.cs create mode 100644 StudentProgress/StudentProgress/Repositories/Implementations/SubjectsRepository.cs create mode 100644 StudentProgress/StudentProgress/Resources/Add.png create mode 100644 StudentProgress/StudentProgress/Resources/BackGround.jpg create mode 100644 StudentProgress/StudentProgress/Resources/Del.png create mode 100644 StudentProgress/StudentProgress/Resources/Pencil.png diff --git a/StudentProgress/StudentProgress/Entities/Enums/DisLectE.cs b/StudentProgress/StudentProgress/Entities/Enums/DisLectE.cs new file mode 100644 index 0000000..952a150 --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/Enums/DisLectE.cs @@ -0,0 +1,9 @@ +namespace StudentProgress.Entities.Enums; + +public enum DisLectE +{ + None = 0, + Praktika = 1, + Lecturer = 2, + Labaratory = 3 +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Entities/Enums/Grade.cs b/StudentProgress/StudentProgress/Entities/Enums/Grade.cs new file mode 100644 index 0000000..cdad9ee --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/Enums/Grade.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StudentProgress.Entities.Enums; + +public enum Grade +{ + None = 0, //пересдача + Two = 1, + Three = 2, + Four = 3, + Five = 4, + Zachet = 5 +} diff --git a/StudentProgress/StudentProgress/Entities/Enums/TypeOfWork.cs b/StudentProgress/StudentProgress/Entities/Enums/TypeOfWork.cs new file mode 100644 index 0000000..ace312a --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/Enums/TypeOfWork.cs @@ -0,0 +1,10 @@ +namespace StudentProgress.Entities.Enums; +[Flags] +public enum TypeOfWork +{ + None = 0, //неизвестная работа + Exam = 1, + Zachet = 2, + Referat = 4, + Laba = 8, +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Entities/Grades.cs b/StudentProgress/StudentProgress/Entities/Grades.cs new file mode 100644 index 0000000..7d77a90 --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/Grades.cs @@ -0,0 +1,20 @@ +namespace StudentProgress.Entities; + +public class Grades +{ + public int Id { get; private set; } + public int SubjectsId { get; private set; } + public int ProfessorsId { get; private set; } + public DateTime Date { get; private set; } + + public static Grades CreateEntity(int id, int subjectsId, int professorsId, DateTime date) + { + return new Grades + { + Id = id, + SubjectsId = subjectsId, + ProfessorsId = professorsId, + Date = date + }; + } +} diff --git a/StudentProgress/StudentProgress/Entities/Group.cs b/StudentProgress/StudentProgress/Entities/Group.cs new file mode 100644 index 0000000..8f88960 --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/Group.cs @@ -0,0 +1,17 @@ +namespace StudentProgress.Entities +{ + public class Group + { + public int Id { get; private set; } + public string NameGroup { get; set; } = string.Empty; + + public static Group CreateEntity(int id, string nameGroup) + { + return new Group + { + Id = id, + NameGroup = nameGroup ?? string.Empty + }; + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Entities/Lectures.cs b/StudentProgress/StudentProgress/Entities/Lectures.cs new file mode 100644 index 0000000..0011c5c --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/Lectures.cs @@ -0,0 +1,35 @@ +namespace StudentProgress.Entities +{ + public class Lectures + { + public int LectureId { get; private set; } + public int ProfessorsId { get; private set; } + public DateTime Date { get; private set; } + public string Auditorium { get; private set; } + + public Lectures() + { + Auditorium = string.Empty; // Инициализация свойства Auditorium + } + + public void SetProfessorsId(int professorsId) + { + ProfessorsId = professorsId; + } + + public void SetDate(DateTime date) + { + Date = date; + } + + public void SetLectureId(int lectureId) + { + LectureId = lectureId; + } + + public void SetAuditorium(string auditorium) + { + Auditorium = auditorium; + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Entities/Professors.cs b/StudentProgress/StudentProgress/Entities/Professors.cs new file mode 100644 index 0000000..44584d4 --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/Professors.cs @@ -0,0 +1,17 @@ +namespace StudentProgress.Entities; + +public class Professors +{ + public int Id { get; set; } + public string FirstNameProfessor { get; set; } = string.Empty; + public string SurnameProfessor { get; set; } = string.Empty; + public static Professors CreateEntity(int id, string firstName, string SurnameProfessor) + { + return new Professors + { + Id = id, + FirstNameProfessor = firstName ?? string.Empty, + SurnameProfessor = SurnameProfessor ?? string.Empty + }; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Entities/Student.cs b/StudentProgress/StudentProgress/Entities/Student.cs new file mode 100644 index 0000000..564c195 --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/Student.cs @@ -0,0 +1,21 @@ +namespace StudentProgress.Entities +{ + public class Student + { + public int Id { get; private set; } + public string Name { get; set; } = string.Empty; + public string Surname { get; set; } = string.Empty; + public int GroupId { get; set; } + + public static Student CreateEntity(int id, string name, string surname, int groupId) + { + return new Student + { + Id = id, + Name = name ?? string.Empty, + Surname = surname ?? string.Empty, + GroupId = groupId + }; + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Entities/StudentGrades.cs b/StudentProgress/StudentProgress/Entities/StudentGrades.cs new file mode 100644 index 0000000..fd5c062 --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/StudentGrades.cs @@ -0,0 +1,19 @@ +using StudentProgress.Entities.Enums; + +namespace StudentProgress.Entities; + +public class StudentGrades +{ + public int Id { get; private set; } + public int StudentID { get; private set; } + public Grade Grade { get; private set; } + public static StudentGrades CreateEntity(int id, int studentID, Grade grade) + { + return new StudentGrades + { + Id = id, + StudentID = studentID, + Grade = grade + }; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Entities/Subjects.cs b/StudentProgress/StudentProgress/Entities/Subjects.cs new file mode 100644 index 0000000..2e68186 --- /dev/null +++ b/StudentProgress/StudentProgress/Entities/Subjects.cs @@ -0,0 +1,17 @@ +namespace StudentProgress.Entities; + +public class Subjects +{ + public int Id { get; private set; } + public string NameSubject { get; private set; } = string.Empty; + + public static Subjects CreateEntity_(int id, string nameSubject) + { + return new Subjects + { + Id = id, + NameSubject = nameSubject ?? string.Empty, + + }; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Form1.Designer.cs b/StudentProgress/StudentProgress/Form1.Designer.cs deleted file mode 100644 index fa0784d..0000000 --- a/StudentProgress/StudentProgress/Form1.Designer.cs +++ /dev/null @@ -1,39 +0,0 @@ -namespace StudentProgress -{ - 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/StudentProgress/StudentProgress/Form1.cs b/StudentProgress/StudentProgress/Form1.cs deleted file mode 100644 index 62ad3ac..0000000 --- a/StudentProgress/StudentProgress/Form1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace StudentProgress -{ - public partial class Form1 : Form - { - public Form1() - { - InitializeComponent(); - } - } -} diff --git a/StudentProgress/StudentProgress/FormStudentProgress.Designer.cs b/StudentProgress/StudentProgress/FormStudentProgress.Designer.cs new file mode 100644 index 0000000..1b1d01a --- /dev/null +++ b/StudentProgress/StudentProgress/FormStudentProgress.Designer.cs @@ -0,0 +1,149 @@ +namespace StudentProgress +{ + partial class FormStudentProgress + { + /// + /// 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() + { + menuStrip1 = new MenuStrip(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + группыToolStripMenuItem = new ToolStripMenuItem(); + студентыToolStripMenuItem = new ToolStripMenuItem(); + преподавателиToolStripMenuItem = new ToolStripMenuItem(); + предметыToolStripMenuItem = new ToolStripMenuItem(); + операцииToolStripMenuItem = new ToolStripMenuItem(); + оценкиToolStripMenuItem = new ToolStripMenuItem(); + учетЛекцийToolStripMenuItem = new ToolStripMenuItem(); + отчетыToolStripMenuItem = new ToolStripMenuItem(); + menuStrip1.SuspendLayout(); + SuspendLayout(); + // + // menuStrip1 + // + menuStrip1.ImageScalingSize = new Size(32, 32); + menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчетыToolStripMenuItem }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Padding = new Padding(13, 5, 0, 5); + menuStrip1.Size = new Size(915, 46); + menuStrip1.TabIndex = 0; + menuStrip1.Text = "menuStrip1"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { группыToolStripMenuItem, студентыToolStripMenuItem, преподавателиToolStripMenuItem, предметыToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(184, 36); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // группыToolStripMenuItem + // + группыToolStripMenuItem.Name = "группыToolStripMenuItem"; + группыToolStripMenuItem.Size = new Size(319, 44); + группыToolStripMenuItem.Text = "Группы"; + группыToolStripMenuItem.Click += GroupToolStripMenuItem_Click; + // + // студентыToolStripMenuItem + // + студентыToolStripMenuItem.Name = "студентыToolStripMenuItem"; + студентыToolStripMenuItem.Size = new Size(319, 44); + студентыToolStripMenuItem.Text = "Студенты"; + студентыToolStripMenuItem.Click += StudentToolStripMenuItem_Click; + // + // преподавателиToolStripMenuItem + // + преподавателиToolStripMenuItem.Name = "преподавателиToolStripMenuItem"; + преподавателиToolStripMenuItem.Size = new Size(319, 44); + преподавателиToolStripMenuItem.Text = "Преподаватели"; + преподавателиToolStripMenuItem.Click += ProfessorToolStripMenuItem_Click; + // + // предметыToolStripMenuItem + // + предметыToolStripMenuItem.Name = "предметыToolStripMenuItem"; + предметыToolStripMenuItem.Size = new Size(319, 44); + предметыToolStripMenuItem.Text = "Предметы"; + предметыToolStripMenuItem.Click += SubjectToolStripMenuItem_Click; + // + // операцииToolStripMenuItem + // + операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { оценкиToolStripMenuItem, учетЛекцийToolStripMenuItem }); + операцииToolStripMenuItem.Name = "операцииToolStripMenuItem"; + операцииToolStripMenuItem.Size = new Size(147, 36); + операцииToolStripMenuItem.Text = "Операции"; + // + // оценкиToolStripMenuItem + // + оценкиToolStripMenuItem.Name = "оценкиToolStripMenuItem"; + оценкиToolStripMenuItem.Size = new Size(285, 44); + оценкиToolStripMenuItem.Text = "Оценки"; + оценкиToolStripMenuItem.Click += GradeToolStripMenuItem_Click; + // + // учетЛекцийToolStripMenuItem + // + учетЛекцийToolStripMenuItem.Name = "учетЛекцийToolStripMenuItem"; + учетЛекцийToolStripMenuItem.Size = new Size(285, 44); + учетЛекцийToolStripMenuItem.Text = "Учет лекций"; + учетЛекцийToolStripMenuItem.Click += LecturesCountToolStripMenuItem_Click; + // + // отчетыToolStripMenuItem + // + отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; + отчетыToolStripMenuItem.Size = new Size(116, 36); + отчетыToolStripMenuItem.Text = "Отчеты"; + // + // FormStudentProgress + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + BackgroundImage = Properties.Resources.BackGround; + BackgroundImageLayout = ImageLayout.Stretch; + ClientSize = new Size(915, 559); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; + Margin = new Padding(6, 7, 6, 7); + Name = "FormStudentProgress"; + StartPosition = FormStartPosition.CenterScreen; + Text = "Учет успеваемости студентов"; + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem справочникиToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem группыToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem студентыToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem преподавателиToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem предметыToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem операцииToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem оценкиToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem учетЛекцийToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem отчетыToolStripMenuItem; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/FormStudentProgress.cs b/StudentProgress/StudentProgress/FormStudentProgress.cs new file mode 100644 index 0000000..27b7e61 --- /dev/null +++ b/StudentProgress/StudentProgress/FormStudentProgress.cs @@ -0,0 +1,102 @@ +using StudentProgress.Forms; +using Unity; +using System; +using System.Windows.Forms; + +namespace StudentProgress +{ + public partial class FormStudentProgress : Form + { + private readonly IUnityContainer _container; + + public FormStudentProgress(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + private void GroupToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void StudentToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void SubjectToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void GradeToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ProfessorToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void RecordLectureToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LecturesCountToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} + \ No newline at end of file diff --git a/StudentProgress/StudentProgress/FormStudentProgress.resx b/StudentProgress/StudentProgress/FormStudentProgress.resx new file mode 100644 index 0000000..66777ad --- /dev/null +++ b/StudentProgress/StudentProgress/FormStudentProgress.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + 25 + + \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormGrade.Designer.cs b/StudentProgress/StudentProgress/Forms/FormGrade.Designer.cs new file mode 100644 index 0000000..ba4e515 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormGrade.Designer.cs @@ -0,0 +1,219 @@ +namespace StudentProgress.Forms +{ + partial class FormGrade + { + /// + /// 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() + { + label1 = new Label(); + label2 = new Label(); + label3 = new Label(); + label4 = new Label(); + buttonSave = new Button(); + buttonCancel = new Button(); + dateTimePicker1 = new DateTimePicker(); + comboBoxSubject = new ComboBox(); + comboBoxProfessor = new ComboBox(); + checkedListBoxType = new CheckedListBox(); + groupBox1 = new GroupBox(); + groupBox2 = new GroupBox(); + dataGridView1 = new DataGridView(); + ColumnStudent = new DataGridViewComboBoxColumn(); + groupBox2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(62, 49); + label1.Name = "label1"; + label1.Size = new Size(94, 32); + label1.TabIndex = 0; + label1.Text = "Работа:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(62, 272); + label2.Name = "label2"; + label2.Size = new Size(116, 32); + label2.TabIndex = 1; + label2.Text = "Предмет:"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(62, 370); + label3.Name = "label3"; + label3.Size = new Size(191, 32); + label3.TabIndex = 2; + label3.Text = "Преподователь:"; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(62, 481); + label4.Name = "label4"; + label4.Size = new Size(70, 32); + label4.TabIndex = 3; + label4.Text = "Дата:"; + // + // buttonSave + // + buttonSave.Location = new Point(62, 625); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(150, 46); + buttonSave.TabIndex = 4; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(357, 625); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(150, 46); + buttonCancel.TabIndex = 5; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // dateTimePicker1 + // + dateTimePicker1.Location = new Point(178, 481); + dateTimePicker1.Name = "dateTimePicker1"; + dateTimePicker1.Size = new Size(400, 39); + dateTimePicker1.TabIndex = 6; + // + // comboBoxSubject + // + comboBoxSubject.FormattingEnabled = true; + comboBoxSubject.Location = new Point(267, 272); + comboBoxSubject.Name = "comboBoxSubject"; + comboBoxSubject.Size = new Size(242, 40); + comboBoxSubject.TabIndex = 8; + // + // comboBoxProfessor + // + comboBoxProfessor.FormattingEnabled = true; + comboBoxProfessor.Location = new Point(267, 370); + comboBoxProfessor.Name = "comboBoxProfessor"; + comboBoxProfessor.Size = new Size(242, 40); + comboBoxProfessor.TabIndex = 9; + // + // checkedListBoxType + // + checkedListBoxType.FormattingEnabled = true; + checkedListBoxType.Location = new Point(267, 49); + checkedListBoxType.Name = "checkedListBoxType"; + checkedListBoxType.Size = new Size(240, 184); + checkedListBoxType.TabIndex = 10; + // + // groupBox1 + // + groupBox1.Location = new Point(680, 158); + groupBox1.Name = "groupBox1"; + groupBox1.Size = new Size(400, 200); + groupBox1.TabIndex = 11; + groupBox1.TabStop = false; + groupBox1.Text = "groupBox1"; + // + // groupBox2 + // + groupBox2.Controls.Add(dataGridView1); + groupBox2.Location = new Point(627, 49); + groupBox2.Margin = new Padding(6); + groupBox2.Name = "groupBox2"; + groupBox2.Padding = new Padding(6); + groupBox2.Size = new Size(519, 622); + groupBox2.TabIndex = 12; + groupBox2.TabStop = false; + groupBox2.Text = "Оценка"; + // + // dataGridView1 + // + dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView1.Columns.AddRange(new DataGridViewColumn[] { ColumnStudent }); + dataGridView1.Dock = DockStyle.Fill; + dataGridView1.Location = new Point(6, 38); + dataGridView1.Margin = new Padding(6); + dataGridView1.Name = "dataGridView1"; + dataGridView1.RowHeadersWidth = 82; + dataGridView1.Size = new Size(507, 578); + dataGridView1.TabIndex = 0; + // + // ColumnStudent + // + ColumnStudent.HeaderText = "Студент"; + ColumnStudent.MinimumWidth = 10; + ColumnStudent.Name = "ColumnStudent"; + // + // FormGrade + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1161, 779); + Controls.Add(groupBox2); + Controls.Add(groupBox1); + Controls.Add(checkedListBoxType); + Controls.Add(comboBoxProfessor); + Controls.Add(comboBoxSubject); + Controls.Add(dateTimePicker1); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(label4); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Name = "FormGrade"; + Text = "Оценка"; + Load += FormGrade_Load; + groupBox2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private Label label2; + private Label label3; + private Label label4; + private Button buttonSave; + private Button buttonCancel; + private DateTimePicker dateTimePicker1; + private ComboBox comboBoxSubject; + private ComboBox comboBoxProfessor; + private CheckedListBox checkedListBoxType; + private GroupBox groupBox1; + private GroupBox groupBox2; + private DataGridView dataGridView1; + private DataGridViewComboBoxColumn ColumnStudent; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormGrade.cs b/StudentProgress/StudentProgress/Forms/FormGrade.cs new file mode 100644 index 0000000..3f43ae9 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormGrade.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using StudentProgress.Entities; +using StudentProgress.Entities.Enums; +using StudentProgress.Repositories; + +namespace StudentProgress.Forms +{ + public partial class FormGrade : Form + { + private readonly IGradesRepository _gradesRepository; + private readonly ISubjectsRepository _subjectsRepository; + private readonly IProfessorsNameRepository _professorsRepository; + private readonly IStudentRepository _studentRepository; + + public FormGrade(IGradesRepository gradesRepository, ISubjectsRepository subjectsRepository, + IProfessorsNameRepository professorsRepository, IStudentRepository studentRepository) + { + InitializeComponent(); + _gradesRepository = gradesRepository ?? throw new ArgumentNullException(nameof(gradesRepository)); + _subjectsRepository = subjectsRepository ?? throw new ArgumentNullException(nameof(subjectsRepository)); + _professorsRepository = professorsRepository ?? throw new ArgumentNullException(nameof(professorsRepository)); + _studentRepository = studentRepository ?? throw new ArgumentNullException(nameof(studentRepository)); + + LoadWorkTypes(); + LoadSubjects(); + LoadProfessors(); + LoadStudents(); + } + + private void LoadWorkTypes() + { + foreach (var elem in Enum.GetValues(typeof(TypeOfWork))) + { + checkedListBoxType.Items.Add(elem); + } + } + + private void LoadSubjects() + { + var subjects = _subjectsRepository.ReadSubjects(); + comboBoxSubject.DataSource = subjects; + comboBoxSubject.DisplayMember = "NameSubject"; + comboBoxSubject.ValueMember = "Id"; + } + + private void LoadProfessors() + { + var professors = _professorsRepository.ReadProfessorsName(); + comboBoxProfessor.DataSource = professors; + comboBoxProfessor.DisplayMember = "FirstNameProfessor"; + comboBoxProfessor.ValueMember = "Id"; + } + + private void LoadStudents() + { + var students = _studentRepository.ReadStudents(); + ColumnStudent.DataSource = students; + ColumnStudent.DisplayMember = "Name"; + ColumnStudent.ValueMember = "Id"; + } + + private void buttonSave_Click(object sender, EventArgs e) + { + try + { + if (comboBoxSubject.SelectedIndex < 0 || checkedListBoxType.CheckedItems.Count == 0) + { + throw new Exception("Имеются незаполненные поля"); + } + CreateGrade(0); + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) => Close(); + + private Grades CreateGrade(int id) + { + TypeOfWork typeOfWork = TypeOfWork.None; + foreach (var elem in checkedListBoxType.CheckedItems) + { + typeOfWork |= (TypeOfWork)elem; + } + return Grades.CreateEntity(id, (int)comboBoxSubject.SelectedValue, (int)comboBoxProfessor.SelectedValue, dateTimePicker1.Value); + } + + private void FormGrade_Load(object sender, EventArgs e) + { + var columnGrade = new DataGridViewComboBoxColumn + { + Name = "ColumnGrade", + HeaderText = "Оценка", + DataSource = Enum.GetValues(typeof(Grade)) + }; + + if (dataGridView1.Columns["ColumnGrade"] != null) + { + dataGridView1.Columns.Remove("ColumnGrade"); + } + + dataGridView1.Columns.Add(columnGrade); + } + + private List CreateListFeedFeedReplenishmentsFromDataGrid() + { + var list = new List(); + foreach (DataGridViewRow row in dataGridView1.Rows) + { + if (row.Cells["ColumnStudent"].Value == null || row.Cells["ColumnGrade"].Value == null) + { + continue; + } + list.Add(StudentGrades.CreateEntity(0, Convert.ToInt32(row.Cells["ColumnStudent"].Value), (Grade)(row.Cells["ColumnGrade"].Value))); + } + return list; + } + } +} diff --git a/StudentProgress/StudentProgress/Forms/FormGrade.resx b/StudentProgress/StudentProgress/Forms/FormGrade.resx new file mode 100644 index 0000000..831d2a4 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormGrade.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormGrades.Designer.cs b/StudentProgress/StudentProgress/Forms/FormGrades.Designer.cs new file mode 100644 index 0000000..971a6ae --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormGrades.Designer.cs @@ -0,0 +1,110 @@ +namespace StudentProgress.Forms +{ + partial class FormGrades + { + /// + /// 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() + { + panel1 = new Panel(); + buttonDel = new Button(); + buttonAdd = new Button(); + dataGridView = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(548, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(75, 271); + panel1.TabIndex = 0; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(7, 93); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(56, 53); + buttonDel.TabIndex = 1; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += buttonDel_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(7, 34); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(56, 53); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.Size = new Size(548, 271); + dataGridView.TabIndex = 1; + // + // FormGrades + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(623, 271); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormGrades"; + Text = "Оценки"; + Load += FormGrades_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private DataGridView dataGridView; + private Button buttonDel; + private Button buttonAdd; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormGrades.cs b/StudentProgress/StudentProgress/Forms/FormGrades.cs new file mode 100644 index 0000000..a1a42ba --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormGrades.cs @@ -0,0 +1,80 @@ +using System; +using System.Windows.Forms; +using Unity; +using StudentProgress.Repositories; + +namespace StudentProgress.Forms +{ + public partial class FormGrades : Form + { + private readonly IUnityContainer _container; + private readonly IGradesRepository _gradesRepository; + + public FormGrades(IUnityContainer container, IGradesRepository gradesRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _gradesRepository = gradesRepository ?? throw new ArgumentNullException(nameof(gradesRepository)); + } + + 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 FormGrades_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridView.DataSource = _gradesRepository.ReadGrades(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + + private void buttonDel_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) + { + return; + } + try + { + _gradesRepository.DeleteGrade(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Form1.resx b/StudentProgress/StudentProgress/Forms/FormGrades.resx similarity index 92% rename from StudentProgress/StudentProgress/Form1.resx rename to StudentProgress/StudentProgress/Forms/FormGrades.resx index 1af7de1..8b2ff64 100644 --- a/StudentProgress/StudentProgress/Form1.resx +++ b/StudentProgress/StudentProgress/Forms/FormGrades.resx @@ -1,17 +1,17 @@  - diff --git a/StudentProgress/StudentProgress/Forms/FormGroup.Designer.cs b/StudentProgress/StudentProgress/Forms/FormGroup.Designer.cs new file mode 100644 index 0000000..a8e7978 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormGroup.Designer.cs @@ -0,0 +1,108 @@ +using static System.Net.Mime.MediaTypeNames; +using System.Drawing.Printing; +using System.Windows.Forms; +using System.Xml.Linq; + +namespace StudentProgress.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() + { + label1 = new Label(); + textBoxNameGroup = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(76, 68); + label1.Margin = new Padding(6, 0, 6, 0); + label1.Name = "label1"; + label1.Size = new Size(212, 32); + label1.TabIndex = 0; + label1.Text = "Название группы:"; + // + // textBoxNameGroup + // + textBoxNameGroup.Location = new Point(338, 61); + textBoxNameGroup.Margin = new Padding(6); + textBoxNameGroup.Name = "textBoxNameGroup"; + textBoxNameGroup.Size = new Size(232, 39); + textBoxNameGroup.TabIndex = 5; + // + // buttonSave + // + buttonSave.Location = new Point(74, 373); + buttonSave.Margin = new Padding(6); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(189, 62); + buttonSave.TabIndex = 6; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(338, 373); + buttonCancel.Margin = new Padding(6); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(189, 62); + buttonCancel.TabIndex = 7; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + + // + // FormGroup + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(644, 461); + + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxNameGroup); + Controls.Add(label1); + Margin = new Padding(6); + Name = "FormGroup"; + StartPosition = FormStartPosition.CenterParent; + Text = "Группа"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label1; + private TextBox textBoxNameGroup; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormGroup.cs b/StudentProgress/StudentProgress/Forms/FormGroup.cs new file mode 100644 index 0000000..bcc2fbd --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormGroup.cs @@ -0,0 +1,83 @@ +using StudentProgress.Entities; +using StudentProgress.Entities.Enums; +using StudentProgress.Repositories; +using StudentProgress.Repositories.Implementations; + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace StudentProgress.Forms +{ + public partial class FormGroup : Form + { + private readonly IGroupRepository _groupRepository; + private int? _groupId; + + public FormGroup(IGroupRepository groupRepository) + { + InitializeComponent(); + _groupRepository = groupRepository ?? throw new ArgumentNullException(nameof(groupRepository)); + + } + + public int Id + { + set + { + try + { + var group = _groupRepository.ReadGroupById(value); + if (group == null) + { + throw new + InvalidDataException(nameof(group)); + } + textBoxNameGroup.Text = group.NameGroup; + _groupId = value; + + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + + private void buttonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxNameGroup.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); + } +} diff --git a/StudentProgress/StudentProgress/Forms/FormGroup.resx b/StudentProgress/StudentProgress/Forms/FormGroup.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/StudentProgress/StudentProgress/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/StudentProgress/StudentProgress/Forms/FormGroups.Designer.cs b/StudentProgress/StudentProgress/Forms/FormGroups.Designer.cs new file mode 100644 index 0000000..39004b1 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormGroups.Designer.cs @@ -0,0 +1,122 @@ +using System.Windows.Forms; + +namespace StudentProgress.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() + { + dataGridView = new DataGridView(); + buttonAdd = new Button(); + buttonPencil = new Button(); + buttonDel = new Button(); + panel1 = new Panel(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(26, 30); + dataGridView.Margin = new Padding(6, 7, 6, 7); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 82; + dataGridView.Size = new Size(635, 569); + dataGridView.TabIndex = 0; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(28, 37); + buttonAdd.Margin = new Padding(6, 7, 6, 7); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(162, 115); + buttonAdd.TabIndex = 1; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // buttonPencil + // + buttonPencil.BackgroundImage = Properties.Resources.Pencil; + buttonPencil.BackgroundImageLayout = ImageLayout.Stretch; + buttonPencil.Location = new Point(28, 224); + buttonPencil.Margin = new Padding(6, 7, 6, 7); + buttonPencil.Name = "buttonPencil"; + buttonPencil.Size = new Size(162, 127); + buttonPencil.TabIndex = 2; + buttonPencil.UseVisualStyleBackColor = true; + buttonPencil.Click += buttonPencil_Click; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(28, 390); + buttonDel.Margin = new Padding(6, 7, 6, 7); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(162, 127); + buttonDel.TabIndex = 3; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += buttonDel_Click; + // + // panel1 + // + panel1.Controls.Add(buttonAdd); + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonPencil); + panel1.Location = new Point(693, 30); + panel1.Name = "panel1"; + panel1.Size = new Size(214, 569); + panel1.TabIndex = 4; + // + // FormGroups + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(919, 628); + Controls.Add(panel1); + Controls.Add(dataGridView); + Margin = new Padding(6, 7, 6, 7); + Name = "FormGroups"; + Text = "Группы"; + Load += FormGroups_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView; + private System.Windows.Forms.Button buttonAdd; + private System.Windows.Forms.Button buttonPencil; + private System.Windows.Forms.Button buttonDel; + private Panel panel1; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormGroups.cs b/StudentProgress/StudentProgress/Forms/FormGroups.cs new file mode 100644 index 0000000..4eb8d99 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormGroups.cs @@ -0,0 +1,103 @@ +using StudentProgress.Forms; +using StudentProgress.Repositories; +using Unity; + +namespace StudentProgress.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 buttonPencil_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + try + { + var form = _container.Resolve(); + form.ShowDialog(); + form.Id = findId; + 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() => dataGridView.DataSource = _groupRepository.ReadGroup(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormGroups.resx b/StudentProgress/StudentProgress/Forms/FormGroups.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/StudentProgress/StudentProgress/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/StudentProgress/StudentProgress/Forms/FormLecturesCount.Designer.cs b/StudentProgress/StudentProgress/Forms/FormLecturesCount.Designer.cs new file mode 100644 index 0000000..349cc40 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormLecturesCount.Designer.cs @@ -0,0 +1,106 @@ +namespace StudentProgress.Forms +{ + partial class FormLecturesCount + { + /// + /// 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() + { + LecturesDataGridView = new DataGridView(); + buttonAdd = new Button(); + buttonDel = new Button(); + panel1 = new Panel(); + ((System.ComponentModel.ISupportInitialize)LecturesDataGridView).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // LecturesDataGridView + // + LecturesDataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + LecturesDataGridView.Location = new Point(15, 16); + LecturesDataGridView.Margin = new Padding(6, 7, 6, 7); + LecturesDataGridView.Name = "LecturesDataGridView"; + LecturesDataGridView.RowHeadersWidth = 82; + LecturesDataGridView.Size = new Size(841, 459); + LecturesDataGridView.TabIndex = 0; + LecturesDataGridView.CellContentClick += LecturesDataGridView_CellContentClick; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(28, 36); + buttonAdd.Margin = new Padding(13, 17, 13, 17); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(155, 128); + buttonAdd.TabIndex = 1; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(25, 281); + buttonDel.Margin = new Padding(13, 17, 13, 17); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(158, 138); + buttonDel.TabIndex = 2; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += buttonDel_Click; + // + // panel1 + // + panel1.Controls.Add(buttonAdd); + panel1.Controls.Add(buttonDel); + panel1.Location = new Point(885, 16); + panel1.Name = "panel1"; + panel1.Size = new Size(216, 452); + panel1.TabIndex = 3; + // + // FormLecturesCount + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1112, 493); + Controls.Add(panel1); + Controls.Add(LecturesDataGridView); + Margin = new Padding(6, 7, 6, 7); + Name = "FormLecturesCount"; + Text = "Учет лекций"; + Load += FormLecturesCount_Load; + ((System.ComponentModel.ISupportInitialize)LecturesDataGridView).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.DataGridView LecturesDataGridView; + private System.Windows.Forms.Button buttonAdd; + private System.Windows.Forms.Button buttonDel; + private Panel panel1; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormLecturesCount.cs b/StudentProgress/StudentProgress/Forms/FormLecturesCount.cs new file mode 100644 index 0000000..c9fe297 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormLecturesCount.cs @@ -0,0 +1,96 @@ +using StudentProgress.Entities; +using StudentProgress.Repositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace StudentProgress.Forms +{ + public partial class FormLecturesCount : Form + { + private readonly IProfessorsNameRepository _professorsRepository; + private readonly ILecturesRepository _lecturesRepository; + + public FormLecturesCount(IProfessorsNameRepository professorsRepository, ILecturesRepository lecturesRepository) + { + InitializeComponent(); + _professorsRepository = professorsRepository; + _lecturesRepository = lecturesRepository; + } + + private void FormLecturesCount_Load(object sender, EventArgs e) + { + LoadLectures(); + } + + private void LoadLectures() + { + var lectures = _lecturesRepository.ReadLectures(); + var lectureViewModels = new List(); + + foreach (var lecture in lectures) + { + var professor = _professorsRepository.ReadProfessorsNameById(lecture.ProfessorsId); + lectureViewModels.Add(new LectureViewModel + { + LectureId = lecture.LectureId, + ProfessorName = $"{professor.FirstNameProfessor} {professor.SurnameProfessor}", + Auditorium = lecture.Auditorium, + Date = lecture.Date + }); + } + + LecturesDataGridView.DataSource = lectureViewModels; + } + private void buttonAdd_Click(object sender, EventArgs e) + { + using (var formRecordLecture = new FormRecordLecture(_professorsRepository, _lecturesRepository)) + { + formRecordLecture.ShowDialog(); + LoadLectures(); // Обновляем данные после закрытия формы + } + } + + private void buttonDel_Click(object sender, EventArgs e) + { + if (LecturesDataGridView.SelectedRows.Count > 0) + { + var selectedRow = LecturesDataGridView.SelectedRows[0]; + var lectureViewModel = selectedRow.DataBoundItem as LectureViewModel; + + if (lectureViewModel != null) + { + // Логика удаления лекции + _lecturesRepository.DeleteLecture(lectureViewModel.LectureId); + + MessageBox.Show("Лекция успешно удалена!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); + LoadLectures(); // Обновляем данные после удаления + } + } + else + { + MessageBox.Show("Выберите лекцию для удаления.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void LecturesDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) + { + + } + } + + public class LectureViewModel + { + public int LectureId { get; set; } + public string ProfessorName { get; set; } + public string Auditorium { get; set; } + public DateTime Date { get; set; } + + public LectureViewModel() + { + ProfessorName = string.Empty; // Инициализация свойства ProfessorName + Auditorium = string.Empty; // Инициализация свойства Auditorium + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormLecturesCount.resx b/StudentProgress/StudentProgress/Forms/FormLecturesCount.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormLecturesCount.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/StudentProgress/StudentProgress/Forms/FormProfesor.Designer.cs b/StudentProgress/StudentProgress/Forms/FormProfesor.Designer.cs new file mode 100644 index 0000000..e7785f5 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormProfesor.Designer.cs @@ -0,0 +1,124 @@ +using System.Windows.Forms; + +namespace StudentProgress.Forms +{ + partial class FormProfessor + { + /// + /// 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() + { + textBoxFirstName = new TextBox(); + textBoxSurname = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + label1 = new Label(); + label2 = new Label(); + SuspendLayout(); + // + // textBoxFirstName + // + textBoxFirstName.Location = new Point(235, 28); + textBoxFirstName.Margin = new Padding(6, 7, 6, 7); + textBoxFirstName.Name = "textBoxFirstName"; + textBoxFirstName.Size = new Size(252, 39); + textBoxFirstName.TabIndex = 0; + // + // textBoxSurname + // + textBoxSurname.Location = new Point(235, 105); + textBoxSurname.Margin = new Padding(6, 7, 6, 7); + textBoxSurname.Name = "textBoxSurname"; + textBoxSurname.Size = new Size(306, 39); + textBoxSurname.TabIndex = 1; + // + // buttonSave + // + buttonSave.Location = new Point(53, 233); + buttonSave.Margin = new Padding(6, 7, 6, 7); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(162, 57); + buttonSave.TabIndex = 2; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(286, 233); + buttonCancel.Margin = new Padding(6, 7, 6, 7); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(162, 57); + buttonCancel.TabIndex = 3; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(53, 31); + label1.Name = "label1"; + label1.Size = new Size(66, 32); + label1.TabIndex = 4; + label1.Text = "Имя:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(53, 105); + label2.Name = "label2"; + label2.Size = new Size(113, 32); + label2.TabIndex = 5; + label2.Text = "Фамилия"; + // + // FormProfessor + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(695, 354); + Controls.Add(label2); + Controls.Add(label1); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxSurname); + Controls.Add(textBoxFirstName); + Margin = new Padding(6, 7, 6, 7); + Name = "FormProfessor"; + Text = "Преподаватель"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TextBox textBoxFirstName; + private System.Windows.Forms.TextBox textBoxSurname; + private System.Windows.Forms.Button buttonSave; + private System.Windows.Forms.Button buttonCancel; + private Label label1; + private Label label2; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormProfesor.cs b/StudentProgress/StudentProgress/Forms/FormProfesor.cs new file mode 100644 index 0000000..51b5532 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormProfesor.cs @@ -0,0 +1,71 @@ +using StudentProgress.Entities; +using StudentProgress.Repositories; +using System; +using System.IO; +using System.Windows.Forms; + +namespace StudentProgress.Forms +{ + public partial class FormProfessor : Form + { + private readonly IProfessorsNameRepository _professorsRepository; + private int? _professorId; + + public int Id + { + set + { + try + { + var professor = _professorsRepository.ReadProfessorsNameById(value); + if (professor == null) + { + throw new InvalidDataException(nameof(professor)); + } + textBoxFirstName.Text = professor.FirstNameProfessor; + textBoxSurname.Text = professor.SurnameProfessor; + _professorId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormProfessor(IProfessorsNameRepository professorsRepository) + { + InitializeComponent(); + _professorsRepository = professorsRepository ?? throw new ArgumentNullException(nameof(professorsRepository)); + } + + private void buttonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxFirstName.Text) || string.IsNullOrWhiteSpace(textBoxSurname.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_professorId.HasValue) + { + _professorsRepository.UpdateProfessorsName(CreateProfessor(_professorId.Value)); + } + else + { + _professorsRepository.CreateProfessorsName(CreateProfessor(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) => Close(); + + private Professors CreateProfessor(int id) => Professors.CreateEntity(id, textBoxFirstName.Text, textBoxSurname.Text); + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormProfesor.resx b/StudentProgress/StudentProgress/Forms/FormProfesor.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormProfesor.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/StudentProgress/StudentProgress/Forms/FormProfessors.Designer.cs b/StudentProgress/StudentProgress/Forms/FormProfessors.Designer.cs new file mode 100644 index 0000000..474138e --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormProfessors.Designer.cs @@ -0,0 +1,110 @@ +using System.Windows.Forms; + +namespace StudentProgress.Forms +{ + partial class FormProfessors + { + /// + /// 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() + { + dataGridView = new DataGridView(); + buttonAdd = new Button(); + buttonPencil = new Button(); + buttonDel = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(26, 30); + dataGridView.Margin = new Padding(6, 7, 6, 7); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 82; + dataGridView.Size = new Size(867, 492); + dataGridView.TabIndex = 0; + // + // buttonAdd + // + buttonAdd.BackgroundImage = StudentProgress.Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(935, 30); + buttonAdd.Margin = new Padding(6, 7, 6, 7); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(162, 118); + buttonAdd.TabIndex = 1; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // buttonPencil + // + buttonPencil.BackgroundImage = StudentProgress.Properties.Resources.Pencil; + buttonPencil.BackgroundImageLayout = ImageLayout.Stretch; + buttonPencil.Location = new Point(935, 224); + buttonPencil.Margin = new Padding(6, 7, 6, 7); + buttonPencil.Name = "buttonPencil"; + buttonPencil.Size = new Size(162, 118); + buttonPencil.TabIndex = 2; + buttonPencil.UseVisualStyleBackColor = true; + buttonPencil.Click += buttonPencil_Click; + // + // buttonDel + // + buttonDel.BackgroundImage = StudentProgress.Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(935, 396); + buttonDel.Margin = new Padding(6, 7, 6, 7); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(162, 126); + buttonDel.TabIndex = 3; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += buttonDel_Click; + // + // FormProfessors + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1148, 628); + Controls.Add(buttonDel); + Controls.Add(buttonPencil); + Controls.Add(buttonAdd); + Controls.Add(dataGridView); + Margin = new Padding(6, 7, 6, 7); + Name = "FormProfessors"; + Text = "Преподаватели"; + Load += FormProfessors_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private System.Windows.Forms.DataGridView dataGridView; + private System.Windows.Forms.Button buttonAdd; + private System.Windows.Forms.Button buttonPencil; + private System.Windows.Forms.Button buttonDel; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormProfessors.cs b/StudentProgress/StudentProgress/Forms/FormProfessors.cs new file mode 100644 index 0000000..caa8a76 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormProfessors.cs @@ -0,0 +1,99 @@ +using StudentProgress.Repositories; +using Unity; +using System; +using System.Windows.Forms; + +namespace StudentProgress.Forms +{ + public partial class FormProfessors : Form + { + private readonly IUnityContainer _container; + private readonly IProfessorsNameRepository _professorsRepository; + + public FormProfessors(IUnityContainer container, IProfessorsNameRepository professorsRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _professorsRepository = professorsRepository ?? throw new ArgumentNullException(nameof(professorsRepository)); + } + + 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 buttonPencil_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 + { + _professorsRepository.DeleteProfessorsName(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void FormProfessors_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridView.DataSource = _professorsRepository.ReadProfessorsName(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormProfessors.resx b/StudentProgress/StudentProgress/Forms/FormProfessors.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormProfessors.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/StudentProgress/StudentProgress/Forms/FormRecordLecture.Designer.cs b/StudentProgress/StudentProgress/Forms/FormRecordLecture.Designer.cs new file mode 100644 index 0000000..adacbb6 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormRecordLecture.Designer.cs @@ -0,0 +1,129 @@ +namespace StudentProgress.Forms +{ + partial class FormRecordLecture + { + /// + /// 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.label1 = new System.Windows.Forms.Label(); + this.ProfessorsComboBox = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.DatePicker = new System.Windows.Forms.DateTimePicker(); + this.RecordLectureButton = new System.Windows.Forms.Button(); + this.label3 = new System.Windows.Forms.Label(); + this.AuditoriumTextBox = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 20); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(78, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Преподаватель:"; + // + // ProfessorsComboBox + // + this.ProfessorsComboBox.FormattingEnabled = true; + this.ProfessorsComboBox.Location = new System.Drawing.Point(96, 17); + this.ProfessorsComboBox.Name = "ProfessorsComboBox"; + this.ProfessorsComboBox.Size = new System.Drawing.Size(200, 21); + this.ProfessorsComboBox.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 50); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(36, 13); + this.label2.TabIndex = 2; + this.label2.Text = "Дата:"; + // + // DatePicker + // + this.DatePicker.Location = new System.Drawing.Point(96, 47); + this.DatePicker.Name = "DatePicker"; + this.DatePicker.Size = new System.Drawing.Size(200, 20); + this.DatePicker.TabIndex = 3; + // + // RecordLectureButton + // + this.RecordLectureButton.Location = new System.Drawing.Point(96, 110); + this.RecordLectureButton.Name = "RecordLectureButton"; + this.RecordLectureButton.Size = new System.Drawing.Size(200, 23); + this.RecordLectureButton.TabIndex = 4; + this.RecordLectureButton.Text = "Записать лекцию"; + this.RecordLectureButton.UseVisualStyleBackColor = true; + this.RecordLectureButton.Click += new System.EventHandler(this.RecordLectureButton_Click); + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 80); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(64, 13); + this.label3.TabIndex = 5; + this.label3.Text = "Аудитория:"; + // + // AuditoriumTextBox + // + this.AuditoriumTextBox.Location = new System.Drawing.Point(96, 77); + this.AuditoriumTextBox.Name = "AuditoriumTextBox"; + this.AuditoriumTextBox.Size = new System.Drawing.Size(200, 20); + this.AuditoriumTextBox.TabIndex = 6; + // + // FormRecordLecture + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(314, 151); + this.Controls.Add(this.AuditoriumTextBox); + this.Controls.Add(this.label3); + this.Controls.Add(this.RecordLectureButton); + this.Controls.Add(this.DatePicker); + this.Controls.Add(this.label2); + this.Controls.Add(this.ProfessorsComboBox); + this.Controls.Add(this.label1); + this.Name = "FormRecordLecture"; + this.Text = "Запись лекции"; + this.Load += new System.EventHandler(this.FormRecordLecture_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox ProfessorsComboBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.DateTimePicker DatePicker; + private System.Windows.Forms.Button RecordLectureButton; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox AuditoriumTextBox; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormRecordLecture.cs b/StudentProgress/StudentProgress/Forms/FormRecordLecture.cs new file mode 100644 index 0000000..cfe2fad --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormRecordLecture.cs @@ -0,0 +1,47 @@ +using StudentProgress.Entities; +using StudentProgress.Repositories; +using System; +using System.Windows.Forms; + +namespace StudentProgress.Forms +{ + public partial class FormRecordLecture : Form + { + private readonly IProfessorsNameRepository _professorsRepository; + private readonly ILecturesRepository _lecturesRepository; + + public FormRecordLecture(IProfessorsNameRepository professorsRepository, ILecturesRepository lecturesRepository) + { + InitializeComponent(); + _professorsRepository = professorsRepository; + _lecturesRepository = lecturesRepository; + } + + private void FormRecordLecture_Load(object sender, EventArgs e) + { + LoadProfessors(); + } + + private void LoadProfessors() + { + var professors = _professorsRepository.ReadProfessorsName(); + ProfessorsComboBox.DataSource = professors; + ProfessorsComboBox.DisplayMember = "FirstNameProfessor"; + ProfessorsComboBox.ValueMember = "Id"; + } + + private void RecordLectureButton_Click(object sender, EventArgs e) + { + if (ProfessorsComboBox.SelectedItem is Professors selectedProfessor) + { + var lecture = new Lectures(); + lecture.SetProfessorsId(selectedProfessor.Id); + lecture.SetDate(DatePicker.Value); + lecture.SetAuditorium(AuditoriumTextBox.Text); // Устанавливаем аудиторию + + _lecturesRepository.CreateLecture(lecture); + MessageBox.Show("Лекция успешно записана!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormRecordLecture.resx b/StudentProgress/StudentProgress/Forms/FormRecordLecture.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormRecordLecture.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/StudentProgress/StudentProgress/Forms/FormStudent.Designer.cs b/StudentProgress/StudentProgress/Forms/FormStudent.Designer.cs new file mode 100644 index 0000000..c3e1261 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormStudent.Designer.cs @@ -0,0 +1,140 @@ +namespace StudentProgress.Forms +{ + partial class FormStudent + { + /// + /// 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() + { + labelName = new Label(); + labelSurname = new Label(); + labelGroup = new Label(); + textBoxName = new TextBox(); + textBoxSurname = new TextBox(); + comboBoxGroup = new ComboBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(12, 19); + labelName.Name = "labelName"; + labelName.Size = new Size(49, 20); + labelName.TabIndex = 0; + labelName.Text = "Имя:"; + // + // labelSurname + // + labelSurname.AutoSize = true; + labelSurname.Location = new Point(12, 69); + labelSurname.Name = "labelSurname"; + labelSurname.Size = new Size(81, 20); + labelSurname.TabIndex = 1; + labelSurname.Text = "Фамилия:"; + // + // labelGroup + // + labelGroup.AutoSize = true; + labelGroup.Location = new Point(12, 119); + labelGroup.Name = "labelGroup"; + labelGroup.Size = new Size(61, 20); + labelGroup.TabIndex = 2; + labelGroup.Text = "Группа:"; + // + // textBoxName + // + textBoxName.Location = new Point(100, 16); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(200, 27); + textBoxName.TabIndex = 3; + // + // textBoxSurname + // + textBoxSurname.Location = new Point(100, 66); + textBoxSurname.Name = "textBoxSurname"; + textBoxSurname.Size = new Size(200, 27); + textBoxSurname.TabIndex = 4; + // + // comboBoxGroup + // + comboBoxGroup.FormattingEnabled = true; + comboBoxGroup.Location = new Point(100, 116); + comboBoxGroup.Name = "comboBoxGroup"; + comboBoxGroup.Size = new Size(200, 28); + comboBoxGroup.TabIndex = 5; + // + // buttonSave + // + buttonSave.Location = new Point(12, 169); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(94, 29); + buttonSave.TabIndex = 6; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(206, 169); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(94, 29); + buttonCancel.TabIndex = 7; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // FormStudent + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(312, 210); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(comboBoxGroup); + Controls.Add(textBoxSurname); + Controls.Add(textBoxName); + Controls.Add(labelGroup); + Controls.Add(labelSurname); + Controls.Add(labelName); + Name = "FormStudent"; + Text = "Студент"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelName; + private Label labelSurname; + private Label labelGroup; + private TextBox textBoxName; + private TextBox textBoxSurname; + private ComboBox comboBoxGroup; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormStudent.cs b/StudentProgress/StudentProgress/Forms/FormStudent.cs new file mode 100644 index 0000000..bb96eb9 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormStudent.cs @@ -0,0 +1,52 @@ +using System; +using System.Windows.Forms; +using StudentProgress.Repositories; +using StudentProgress.Entities; + +namespace StudentProgress.Forms +{ + public partial class FormStudent : Form + { + private readonly IStudentRepository _studentRepository; + private readonly IGroupRepository _groupRepository; + + public FormStudent(IStudentRepository studentRepository, IGroupRepository groupRepository) + { + InitializeComponent(); + _studentRepository = studentRepository ?? throw new ArgumentNullException(nameof(studentRepository)); + _groupRepository = groupRepository ?? throw new ArgumentNullException(nameof(groupRepository)); + + LoadGroups(); + } + + private void LoadGroups() + { + var groups = _groupRepository.ReadGroup(); + comboBoxGroup.DataSource = groups; + comboBoxGroup.DisplayMember = "NameGroup"; + comboBoxGroup.ValueMember = "Id"; + } + + private void buttonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxName.Text) || string.IsNullOrWhiteSpace(textBoxSurname.Text) || comboBoxGroup.SelectedIndex < 0) + { + throw new Exception("Имеются незаполненные поля"); + } + + var student = Student.CreateEntity(0, textBoxName.Text, textBoxSurname.Text, (int)comboBoxGroup.SelectedValue); + _studentRepository.CreateStudent(student); + MessageBox.Show("Студент успешно добавлен", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); + 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/StudentProgress/StudentProgress/Forms/FormStudent.resx b/StudentProgress/StudentProgress/Forms/FormStudent.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormStudent.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/StudentProgress/StudentProgress/Forms/FormStudents.Designer.cs b/StudentProgress/StudentProgress/Forms/FormStudents.Designer.cs new file mode 100644 index 0000000..fa130c6 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormStudents.Designer.cs @@ -0,0 +1,124 @@ +namespace StudentProgress.Forms +{ + partial class FormStudents + { + /// + /// 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() + { + panel1 = new Panel(); + buttonDel = new Button(); + buttonPencil = new Button(); + buttonAdd = new Button(); + dataGridView = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonPencil); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(548, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(75, 271); + panel1.TabIndex = 0; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(7, 172); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(56, 53); + buttonDel.TabIndex = 2; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += buttonDel_Click; + // + // buttonPencil + // + buttonPencil.BackgroundImage = Properties.Resources.Pencil; + buttonPencil.BackgroundImageLayout = ImageLayout.Stretch; + buttonPencil.Location = new Point(7, 93); + buttonPencil.Name = "buttonPencil"; + buttonPencil.Size = new Size(56, 53); + buttonPencil.TabIndex = 1; + buttonPencil.UseVisualStyleBackColor = true; + buttonPencil.Click += buttonPencil_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(7, 34); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(56, 53); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.Size = new Size(548, 271); + dataGridView.TabIndex = 1; + // + // FormStudents + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(623, 271); + Controls.Add(dataGridView); + Controls.Add(panel1); + Name = "FormStudents"; + Text = "Студенты"; + Load += FormStudents_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private DataGridView dataGridView; + private Button buttonDel; + private Button buttonPencil; + private Button buttonAdd; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormStudents.cs b/StudentProgress/StudentProgress/Forms/FormStudents.cs new file mode 100644 index 0000000..9b1fe2d --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormStudents.cs @@ -0,0 +1,99 @@ +using System; +using System.Windows.Forms; +using Unity; +using StudentProgress.Repositories; + +namespace StudentProgress.Forms +{ + public partial class FormStudents : Form + { + private readonly IUnityContainer _container; + private readonly IStudentRepository _studentRepository; + + public FormStudents(IUnityContainer container, IStudentRepository studentRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _studentRepository = studentRepository ?? throw new ArgumentNullException(nameof(studentRepository)); + } + + private void FormStudents_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 buttonPencil_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) + { + return; + } + try + { + var form = _container.Resolve(); + // Здесь нужно добавить логику для загрузки данных в форму редактирования + 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 + { + _studentRepository.DeleteStudent(findId); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void LoadList() => dataGridView.DataSource = _studentRepository.ReadStudents(); + + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridView.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormStudents.resx b/StudentProgress/StudentProgress/Forms/FormStudents.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormStudents.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/StudentProgress/StudentProgress/Forms/FormSubject.Designer.cs b/StudentProgress/StudentProgress/Forms/FormSubject.Designer.cs new file mode 100644 index 0000000..4ac615a --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormSubject.Designer.cs @@ -0,0 +1,136 @@ + +namespace StudentPerformance.Forms +{ + partial class FormSubject + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + textBoxName = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + labelName = new Label(); + groupBox = new GroupBox(); + dataGridView = new DataGridView(); + ColumnLast = new DataGridViewComboBoxColumn(); + groupBox.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // textBoxName + // + textBoxName.Location = new Point(183, 47); + textBoxName.Margin = new Padding(6, 7, 6, 7); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(343, 39); + textBoxName.TabIndex = 0; + // + // buttonSave + // + buttonSave.Location = new Point(32, 579); + buttonSave.Margin = new Padding(6, 7, 6, 7); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(162, 57); + buttonSave.TabIndex = 1; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(370, 597); + buttonCancel.Margin = new Padding(6, 7, 6, 7); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(162, 57); + buttonCancel.TabIndex = 2; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(32, 47); + labelName.Margin = new Padding(6, 0, 6, 0); + labelName.Name = "labelName"; + labelName.Size = new Size(111, 32); + labelName.TabIndex = 3; + labelName.Text = "Предмет"; + // + // groupBox + // + groupBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + groupBox.Controls.Add(dataGridView); + groupBox.Location = new Point(32, 111); + groupBox.Margin = new Padding(6); + groupBox.Name = "groupBox"; + groupBox.Padding = new Padding(6); + groupBox.Size = new Size(494, 435); + groupBox.TabIndex = 3; + groupBox.TabStop = false; + groupBox.Text = "Преподаватели"; + // + // dataGridView + // + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Columns.AddRange(new DataGridViewColumn[] { ColumnLast }); + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(6, 38); + dataGridView.Margin = new Padding(6); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 82; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(482, 391); + dataGridView.TabIndex = 0; + // + // ColumnLast + // + ColumnLast.HeaderText = "Фамилия преподавателя"; + ColumnLast.MinimumWidth = 10; + ColumnLast.Name = "ColumnLast"; + ColumnLast.Width = 200; + // + // FormSubject + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(590, 719); + Controls.Add(groupBox); + Controls.Add(labelName); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxName); + Margin = new Padding(6, 7, 6, 7); + Name = "FormSubject"; + Text = "Предметы"; + Load += FormSubject_Load; + groupBox.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + private System.Windows.Forms.TextBox textBoxName; + private System.Windows.Forms.Button buttonSave; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Label labelName; + private GroupBox groupBox; + private DataGridView dataGridView; + private DataGridViewComboBoxColumn ColumnLast; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormSubject.cs b/StudentProgress/StudentProgress/Forms/FormSubject.cs new file mode 100644 index 0000000..bcea12a --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormSubject.cs @@ -0,0 +1,44 @@ +using StudentProgress.Entities; +using StudentProgress.Repositories; +using System; +using System.Windows.Forms; + +namespace StudentPerformance.Forms +{ + public partial class FormSubject : Form + { + private readonly ISubjectsRepository _subjectsRepository; + + public FormSubject(ISubjectsRepository subjectsRepository) + { + InitializeComponent(); + _subjectsRepository = subjectsRepository ?? throw new ArgumentNullException(nameof(subjectsRepository)); + } + + private void buttonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxName.Text)) + { + throw new Exception("Имя предмета не может быть пустым"); + } + + var subject = Subjects.CreateEntity_(0, textBoxName.Text); + _subjectsRepository.CreateSubjects_(subject); + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) => Close(); + + private void FormSubject_Load(object sender, EventArgs e) + { + // Инициализация формы, если необходимо + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormSubject.resx b/StudentProgress/StudentProgress/Forms/FormSubject.resx new file mode 100644 index 0000000..e9e4f13 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormSubject.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormSubjects.Designer.cs b/StudentProgress/StudentProgress/Forms/FormSubjects.Designer.cs new file mode 100644 index 0000000..8836a53 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormSubjects.Designer.cs @@ -0,0 +1,120 @@ +using static System.Net.Mime.MediaTypeNames; +using System.Windows.Forms; +using System.Xml.Linq; + +namespace StudentProgress.Forms +{ + partial class FormSubjects + { + /// + /// 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() + { + panel1 = new Panel(); + buttonDel = new Button(); + buttonAdd = new Button(); + dataGridView = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(buttonDel); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(1018, 0); + panel1.Margin = new Padding(6, 6, 6, 6); + panel1.Name = "panel1"; + panel1.Size = new Size(139, 578); + panel1.TabIndex = 0; + // + // buttonDel + // + buttonDel.BackgroundImage = Properties.Resources.Del; + buttonDel.BackgroundImageLayout = ImageLayout.Stretch; + buttonDel.Location = new Point(13, 367); + buttonDel.Margin = new Padding(6, 6, 6, 6); + buttonDel.Name = "buttonDel"; + buttonDel.Size = new Size(104, 113); + buttonDel.TabIndex = 1; + buttonDel.UseVisualStyleBackColor = true; + buttonDel.Click += buttonDel_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(13, 73); + buttonAdd.Margin = new Padding(6, 6, 6, 6); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(104, 113); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += buttonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToDeleteRows = false; + dataGridView.AllowUserToResizeColumns = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Fill; + dataGridView.Location = new Point(0, 0); + dataGridView.Margin = new Padding(6, 6, 6, 6); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 82; + dataGridView.Size = new Size(1018, 578); + dataGridView.TabIndex = 1; + // + // FormSubjects + // + AutoScaleDimensions = new SizeF(13F, 32F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1157, 578); + Controls.Add(dataGridView); + Controls.Add(panel1); + Margin = new Padding(6, 6, 6, 6); + Name = "FormSubjects"; + Text = "Предметы"; + Load += FormSubjects__Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private DataGridView dataGridView; + private Button buttonDel; + private Button buttonAdd; + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormSubjects.cs b/StudentProgress/StudentProgress/Forms/FormSubjects.cs new file mode 100644 index 0000000..c53ec9c --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormSubjects.cs @@ -0,0 +1,58 @@ +using System; +using System.Windows.Forms; +using StudentPerformance.Forms; +using StudentProgress.Repositories; +using StudentProgress.Repositories.Implementations; + +namespace StudentProgress.Forms +{ + public partial class FormSubjects : Form + { + private readonly ISubjectsRepository _subjectsRepository; + + public FormSubjects(ISubjectsRepository subjectsRepository) + { + InitializeComponent(); + _subjectsRepository = subjectsRepository ?? throw new ArgumentNullException(nameof(subjectsRepository)); + } + + private void FormSubjects__Load(object sender, EventArgs e) + { + // Загрузка данных в DataGridView + LoadData(); + } + + private void LoadData() + { + // Пример загрузки данных из репозитория + var subjects = _subjectsRepository.ReadSubjects(); + dataGridView.DataSource = subjects; + } + + private void buttonAdd_Click(object sender, EventArgs e) + { + // Логика добавления нового предмета + using (var form = new FormSubject(new SubjectsRepository())) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void buttonDel_Click(object sender, EventArgs e) + { + // Логика удаления выбранного предмета + if (dataGridView.SelectedRows.Count > 0) + { + var selectedSubject = dataGridView.SelectedRows[0].DataBoundItem as Entities.Subjects; + if (selectedSubject != null) + { + _subjectsRepository.DeleteSubjects(selectedSubject.Id); + LoadData(); + } + } + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Forms/FormSubjects.resx b/StudentProgress/StudentProgress/Forms/FormSubjects.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/StudentProgress/StudentProgress/Forms/FormSubjects.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/StudentProgress/StudentProgress/Program.cs b/StudentProgress/StudentProgress/Program.cs index f8a0af0..a264a2b 100644 --- a/StudentProgress/StudentProgress/Program.cs +++ b/StudentProgress/StudentProgress/Program.cs @@ -1,17 +1,40 @@ +using StudentProgress.Forms; +using StudentProgress.Repositories; +using StudentProgress.Repositories.Implementations; +using Unity; +using System; +using System.Windows.Forms; + namespace StudentProgress { - internal static class Program + static class Program { - /// - /// The main entry point for the application. - /// [STAThread] static void Main() { - // 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.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + var container = new UnityContainer(); + + // + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + + // + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + container.RegisterType(); + + Application.Run(container.Resolve()); } } } \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Properties/Resources.Designer.cs b/StudentProgress/StudentProgress/Properties/Resources.Designer.cs new file mode 100644 index 0000000..95bee35 --- /dev/null +++ b/StudentProgress/StudentProgress/Properties/Resources.Designer.cs @@ -0,0 +1,103 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace StudentProgress.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [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() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [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("StudentProgress.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Add { + get { + object obj = ResourceManager.GetObject("Add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap BackGround { + get { + object obj = ResourceManager.GetObject("BackGround", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Del { + get { + object obj = ResourceManager.GetObject("Del", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Pencil { + get { + object obj = ResourceManager.GetObject("Pencil", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/StudentProgress/StudentProgress/Properties/Resources.resx b/StudentProgress/StudentProgress/Properties/Resources.resx new file mode 100644 index 0000000..f7da744 --- /dev/null +++ b/StudentProgress/StudentProgress/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\Del.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\BackGround.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Pencil.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/IGradesRepository.cs b/StudentProgress/StudentProgress/Repositories/IGradesRepository.cs new file mode 100644 index 0000000..5163c43 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/IGradesRepository.cs @@ -0,0 +1,10 @@ +using StudentProgress.Entities; + +namespace StudentProgress.Repositories; + +public interface IGradesRepository +{ + IEnumerable ReadGrades(DateTime? dateFrom = null, DateTime? dateTo = null, int? subjectsId = null, int? professorsId = null); + void CreateGrade(Grades grade); + void DeleteGrade(int id); +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/IGroupRepository.cs b/StudentProgress/StudentProgress/Repositories/IGroupRepository.cs new file mode 100644 index 0000000..0d4c062 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/IGroupRepository.cs @@ -0,0 +1,12 @@ +using StudentProgress.Entities; + +namespace StudentProgress.Repositories; + +public interface IGroupRepository +{ + IEnumerable ReadGroup(); + 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/StudentProgress/StudentProgress/Repositories/ILecturesRepository.cs b/StudentProgress/StudentProgress/Repositories/ILecturesRepository.cs new file mode 100644 index 0000000..25c2dd2 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/ILecturesRepository.cs @@ -0,0 +1,12 @@ +using StudentProgress.Entities; +using System.Collections.Generic; + +namespace StudentProgress.Repositories +{ + public interface ILecturesRepository + { + IEnumerable ReadLectures(); + void CreateLecture(Lectures lecture); + void DeleteLecture(int lectureId); + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/IProfessorsNameRepository.cs b/StudentProgress/StudentProgress/Repositories/IProfessorsNameRepository.cs new file mode 100644 index 0000000..672d629 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/IProfessorsNameRepository.cs @@ -0,0 +1,13 @@ +using StudentProgress.Entities; +using System.Collections.Generic; + +namespace StudentProgress.Repositories; + +public interface IProfessorsNameRepository +{ + IEnumerable ReadProfessorsName(); + Professors ReadProfessorsNameById(int id); + void CreateProfessorsName(Professors professorsName); + void UpdateProfessorsName(Professors professorsName); + void DeleteProfessorsName(int id); +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/IStudentsRepository.cs b/StudentProgress/StudentProgress/Repositories/IStudentsRepository.cs new file mode 100644 index 0000000..abe4453 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/IStudentsRepository.cs @@ -0,0 +1,13 @@ +using StudentProgress.Entities; +using System.Collections.Generic; + +namespace StudentProgress.Repositories; + +public interface IStudentRepository +{ + IEnumerable ReadStudents(int? groupID = null); + Student ReadStudentById(int id); + void CreateStudent(Student student); + void UpdateStudent(Student student); + void DeleteStudent(int id); +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/ISubjectsRepository.cs b/StudentProgress/StudentProgress/Repositories/ISubjectsRepository.cs new file mode 100644 index 0000000..d0c8d98 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/ISubjectsRepository.cs @@ -0,0 +1,10 @@ +using StudentProgress.Entities; + +namespace StudentProgress.Repositories; + +public interface ISubjectsRepository +{ + IEnumerable ReadSubjects(int? professorsNameId = null); + void CreateSubjects_(Subjects subject); + void DeleteSubjects(int id); +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/Implementations/GradesRepository.cs b/StudentProgress/StudentProgress/Repositories/Implementations/GradesRepository.cs new file mode 100644 index 0000000..3cb0a6e --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/Implementations/GradesRepository.cs @@ -0,0 +1,29 @@ +using StudentProgress.Entities; +using System; +using System.Collections.Generic; + +namespace StudentProgress.Repositories.Implementations; + +public class GradesRepository : IGradesRepository +{ + public void CreateGrade(Grades grade) + { + // Логика создания оценки + } + + public void DeleteGrade(int id) + { + // Логика удаления оценки по идентификатору + } + + public IEnumerable ReadGrades(DateTime? dateFrom = null, DateTime? dateTo = null, int? subjectsId = null, int? professorsId = null) + { + // Логика чтения оценок с возможностью фильтрации по дате, идентификатору предмета и идентификатору преподавателя + return new List(); + } + + public void UpdateGrade(Grades grade) + { + // Логика обновления оценки + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/Implementations/GroupRepository.cs b/StudentProgress/StudentProgress/Repositories/Implementations/GroupRepository.cs new file mode 100644 index 0000000..0d147a2 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/Implementations/GroupRepository.cs @@ -0,0 +1,50 @@ +using StudentProgress.Entities; +using System.Collections.Generic; + +namespace StudentProgress.Repositories.Implementations +{ + public class GroupRepository : IGroupRepository + { + private readonly List _groups; + + public GroupRepository() + { + // Инициализация тестовых данных + _groups = new List(); + } + + public void CreateGroup(Group group) + { + // Логика создания группы + _groups.Add(group); + } + + public void DeleteGroup(int id) + { + // Логика удаления группы по идентификатору + _groups.RemoveAll(g => g.Id == id); + } + + public IEnumerable ReadGroup() + { + // Логика чтения всех групп + return _groups; + } + + public Group ReadGroupById(int id) + { + // Логика чтения группы по идентификатору + return _groups.Find(g => g.Id == id); + } + + public void UpdateGroup(Group group) + { + // Логика обновления группы + var existingGroup = _groups.Find(g => g.Id == group.Id); + if (existingGroup != null) + { + existingGroup.NameGroup = group.NameGroup; + } + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/Implementations/LecturesRepository.cs b/StudentProgress/StudentProgress/Repositories/Implementations/LecturesRepository.cs new file mode 100644 index 0000000..c7d973f --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/Implementations/LecturesRepository.cs @@ -0,0 +1,32 @@ +using StudentProgress.Entities; +using System.Collections.Generic; +using System.Linq; + +namespace StudentProgress.Repositories.Implementations +{ + public class LecturesRepository : ILecturesRepository + { + private readonly List _lectures = new List(); + + public IEnumerable ReadLectures() + { + return _lectures; + } + + public void CreateLecture(Lectures lecture) + { + int newLectureId = _lectures.Count > 0 ? _lectures.Max(l => l.LectureId) + 1 : 1; + lecture.SetLectureId(newLectureId); + _lectures.Add(lecture); + } + + public void DeleteLecture(int lectureId) + { + var lectureToRemove = _lectures.FirstOrDefault(l => l.LectureId == lectureId); + if (lectureToRemove != null) + { + _lectures.Remove(lectureToRemove); + } + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/Implementations/ProfessorsNameRepository.cs b/StudentProgress/StudentProgress/Repositories/Implementations/ProfessorsNameRepository.cs new file mode 100644 index 0000000..1b5cbf4 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/Implementations/ProfessorsNameRepository.cs @@ -0,0 +1,34 @@ +using StudentProgress.Entities; +using System.Collections.Generic; + +namespace StudentProgress.Repositories.Implementations; + +public class ProfessorsNameRepository : IProfessorsNameRepository +{ + public void CreateProfessorsName(Professors professorsName) + { + // Логика создания преподавателя + } + + public void DeleteProfessorsName(int id) + { + // Логика удаления преподавателя по идентификатору + } + + public IEnumerable ReadProfessorsName() + { + // Логика чтения всех преподавателей + return new List(); + } + + public Professors ReadProfessorsNameById(int id) + { + // Логика чтения преподавателя по идентификатору + return Professors.CreateEntity(id, "Unknown", "Unknown"); + } + + public void UpdateProfessorsName(Professors professorsName) + { + // Логика обновления преподавателя + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/Implementations/StudentRepository.cs b/StudentProgress/StudentProgress/Repositories/Implementations/StudentRepository.cs new file mode 100644 index 0000000..826e429 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/Implementations/StudentRepository.cs @@ -0,0 +1,56 @@ +using StudentProgress.Entities; +using System.Collections.Generic; + +namespace StudentProgress.Repositories.Implementations +{ + public class StudentRepository : IStudentRepository + { + private readonly List _students; + + public StudentRepository() + { + // Инициализация пустого списка студентов + _students = new List(); + } + + public void CreateStudent(Student student) + { + // Логика создания студента + _students.Add(student); + } + + public void DeleteStudent(int id) + { + // Логика удаления студента по идентификатору + _students.RemoveAll(s => s.Id == id); + } + + public Student ReadStudentById(int id) + { + // Логика чтения студента по идентификатору + return _students.Find(s => s.Id == id); + } + + public IEnumerable ReadStudents(int? groupID = null) + { + // Логика чтения всех студентов с возможностью фильтрации по идентификатору группы + if (groupID.HasValue) + { + return _students.FindAll(s => s.GroupId == groupID.Value); + } + return _students; + } + + public void UpdateStudent(Student student) + { + // Логика обновления студента + var existingStudent = _students.Find(s => s.Id == student.Id); + if (existingStudent != null) + { + existingStudent.Name = student.Name; + existingStudent.Surname = student.Surname; + existingStudent.GroupId = student.GroupId; + } + } + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Repositories/Implementations/SubjectsRepository.cs b/StudentProgress/StudentProgress/Repositories/Implementations/SubjectsRepository.cs new file mode 100644 index 0000000..bb88b56 --- /dev/null +++ b/StudentProgress/StudentProgress/Repositories/Implementations/SubjectsRepository.cs @@ -0,0 +1,28 @@ +using StudentProgress.Entities; +using System.Collections.Generic; + +namespace StudentProgress.Repositories.Implementations; + +public class SubjectsRepository : ISubjectsRepository +{ + public void CreateSubjects(Subjects subject) + { + // Логика создания предмета + } + + public void CreateSubjects_(Subjects subject) + { + throw new NotImplementedException(); + } + + public void DeleteSubjects(int id) + { + // Логика удаления предмета по идентификатору + } + + public IEnumerable ReadSubjects(int? lecturerNameId = null) + { + // Логика чтения предметов с возможностью фильтрации по идентификатору преподавателя + return new List(); + } +} \ No newline at end of file diff --git a/StudentProgress/StudentProgress/Resources/Add.png b/StudentProgress/StudentProgress/Resources/Add.png new file mode 100644 index 0000000000000000000000000000000000000000..fb970a62459b73569b315f5e695745ec044be347 GIT binary patch literal 8979 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 literal 0 HcmV?d00001 diff --git a/StudentProgress/StudentProgress/Resources/BackGround.jpg b/StudentProgress/StudentProgress/Resources/BackGround.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6472ee1ee7565fe1beaa723e06f4ff862ce5d4bd GIT binary patch literal 69534 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 z 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 b?Lq$s^wPe^pqK6~00000NkvXXu0mjf*@wCT literal 0 HcmV?d00001 diff --git a/StudentProgress/StudentProgress/Resources/Pencil.png b/StudentProgress/StudentProgress/Resources/Pencil.png new file mode 100644 index 0000000000000000000000000000000000000000..ea2236b824e7855e9a6aa64d308d1d12fe986ffe GIT binary patch literal 54942 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 Uz8O6WCIy!3wiugNR({F<0g3mHB>(^b literal 0 HcmV?d00001 diff --git a/StudentProgress/StudentProgress/StudentProgress.csproj b/StudentProgress/StudentProgress/StudentProgress.csproj index 663fdb8..accbdf0 100644 --- a/StudentProgress/StudentProgress/StudentProgress.csproj +++ b/StudentProgress/StudentProgress/StudentProgress.csproj @@ -8,4 +8,23 @@ enable + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file