Compare commits

..

8 Commits

Author SHA1 Message Date
artur-kalimullin
56b707d9d4 Удаление лишнего 2024-11-20 18:22:56 +04:00
artur-kalimullin
09d4234288 Лабораторная работа №2 2024-11-20 18:06:32 +04:00
artur-kalimullin
3f98e2cf2a Ещё одна правка 2024-11-15 12:52:00 +04:00
artur-kalimullin
464378bb9a Правка разделения 2024-11-12 18:55:33 +04:00
artur-kalimullin
122330c98d Финальный коммит после пары 2024-11-07 14:45:49 +04:00
artur-kalimullin
a87a6002fd Удаление лишнего 2024-11-04 22:51:35 +04:00
artur-kalimullin
91af80d9ea Добавление связи "многие ко многим" и разделения 2024-11-04 22:01:55 +04:00
artur-kalimullin
a902a2d7bb Лабораторная работа №1 2024-11-03 23:15:05 +04:00
74 changed files with 5722 additions and 75 deletions

View File

@ -0,0 +1,25 @@
using ProjectSchedule.Entities.Enums;
namespace ProjectSchedule.Entities;
public class Audience
{
public int Id { get; private set; }
public string NumberAudience { get; private set; } = string.Empty;
public TypeAudience TypeAudience { get; private set; }
public int QuantitySeats { get; private set; }
public static Audience CreateEntity(int id, string numberAudience, TypeAudience typeAudience, int quantitySeats)
{
return new Audience
{
Id = id,
NumberAudience = numberAudience ?? string.Empty,
TypeAudience = typeAudience,
QuantitySeats = quantitySeats
};
}
}

View File

@ -0,0 +1,41 @@
using ProjectSchedule.Entities.Enums;
namespace ProjectSchedule.Entities;
public class CompilingSchedule
{
public int Id { get; private set; }
public int EducatorId { get; private set; }
public int DisciplineId { get; private set; }
public int GroupStudentsId { get; private set; }
public int AudienceId { get; private set; }
public TypeWeek TypeWeek { get; private set; }
public int NumberDay { get; private set; }
public int NumberPair { get; private set; }
public TypeActivity TypeActivity { get; private set; }
public static CompilingSchedule CreateOperation(int id, int educatorId, int disciplineId, int groupStudentsId, int audienceId, TypeWeek typeWeek,
int numberDay, int numberPair, TypeActivity typeActivity)
{
return new CompilingSchedule
{
Id = id,
EducatorId = educatorId,
DisciplineId = disciplineId,
GroupStudentsId = groupStudentsId,
AudienceId = audienceId,
TypeWeek = typeWeek,
NumberDay = numberDay,
NumberPair = numberPair,
TypeActivity = typeActivity
};
}
}

View File

@ -0,0 +1,30 @@
namespace ProjectSchedule.Entities;
public class CurriculumSupplement
{
public int Id { get; private set; }
public int GroupStudentsId { get; private set; }
public string NameCurriculum { get; private set; } = string.Empty;
public string Semester { get; private set; } = string.Empty;
public DateTime DateAdoptionPlan { get; private set; }
public IEnumerable<DisciplineCurriculumSupplement> DisciplineCurriculumSupplements { get; private set; } = [];
public static CurriculumSupplement CreateOperation(int id, int groupStudentsId, string nameCurriculum,
string semester, DateTime dateAdoptionPlan, IEnumerable<DisciplineCurriculumSupplement> disciplineCurriculumSupplements)
{
return new CurriculumSupplement
{
Id = id,
GroupStudentsId = groupStudentsId,
NameCurriculum = nameCurriculum ?? string.Empty,
Semester = semester ?? string.Empty,
DateAdoptionPlan = dateAdoptionPlan,
DisciplineCurriculumSupplements = disciplineCurriculumSupplements
};
}
}

View File

@ -0,0 +1,17 @@
namespace ProjectSchedule.Entities;
public class Discipline
{
public int Id { get; private set; }
public string NameDiscipline { get; private set; } = string.Empty;
public static Discipline CreateEntity(int id, string nameDiscipline)
{
return new Discipline
{
Id = id,
NameDiscipline = nameDiscipline ?? string.Empty,
};
}
}

View File

@ -0,0 +1,23 @@
namespace ProjectSchedule.Entities;
public class DisciplineCurriculumSupplement
{
public int Id { get; private set; }
public int DisciplineId { get; private set; }
public int QuantityLectures { get; private set; }
public int QuantityPractices { get; private set; }
public static DisciplineCurriculumSupplement CreateElement(int id, int disciplineId, int quantityLectures, int quantityPractices)
{
return new DisciplineCurriculumSupplement
{
Id = id,
DisciplineId = disciplineId,
QuantityLectures = quantityLectures,
QuantityPractices = quantityPractices
};
}
}

View File

@ -0,0 +1,23 @@
namespace ProjectSchedule.Entities;
public class Educator
{
public int Id { get; private set; }
public string Surname { get; private set; } = string.Empty;
public string Name { get; private set; } = string.Empty;
public string Patronymic { get; private set; } = string.Empty;
public static Educator CreateEntity(int id, string surname, string name, string patronymic)
{
return new Educator
{
Id = id,
Surname = surname ?? string.Empty,
Name = name ?? string.Empty,
Patronymic = patronymic ?? string.Empty
};
}
}

View File

@ -0,0 +1,10 @@
namespace ProjectSchedule.Entities.Enums;
public enum TypeActivity
{
None = 0,
Practice = 1,
Lecture = 2
}

View File

@ -0,0 +1,11 @@
namespace ProjectSchedule.Entities.Enums;
[Flags]
public enum TypeAudience
{
None = 0,
СomputerСlass = 1,
LectureAudience = 2
}

View File

@ -0,0 +1,10 @@
namespace ProjectSchedule.Entities.Enums;
public enum TypeWeek
{
None = 0,
OddWeek = 1,
EvenWeek = 2
}

View File

@ -0,0 +1,23 @@
namespace ProjectSchedule.Entities;
public class GroupStudents
{
public int Id { get; private set; }
public string AbbreviationGroup { get; private set; } = string.Empty;
public string GroupNumber { get; private set; } = string.Empty;
public int QuantityStudents { get; private set; }
public static GroupStudents CreateEntity(int id, string abbreviationGroup, string groupNumber, int quantityStudents)
{
return new GroupStudents
{
Id = id,
AbbreviationGroup = abbreviationGroup ?? string.Empty,
GroupNumber = groupNumber ?? string.Empty,
QuantityStudents = quantityStudents
};
}
}

View File

@ -1,39 +0,0 @@
namespace ProjectSchedule
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
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
}
}

View File

@ -1,10 +0,0 @@
namespace ProjectSchedule
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}

View File

@ -0,0 +1,147 @@
namespace ProjectSchedule
{
partial class FormSchedule
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
menuStrip = new MenuStrip();
справочникиToolStripMenuItem = new ToolStripMenuItem();
AudiencesToolStripMenuItem = new ToolStripMenuItem();
DisciplinesToolStripMenuItem = new ToolStripMenuItem();
EducatorsToolStripMenuItem = new ToolStripMenuItem();
GroupsStudentsToolStripMenuItem = new ToolStripMenuItem();
операцииToolStripMenuItem = new ToolStripMenuItem();
CompilingScheduleToolStripMenuItem = new ToolStripMenuItem();
CurriculumSupplementToolStripMenuItem = new ToolStripMenuItem();
отчётыToolStripMenuItem = new ToolStripMenuItem();
menuStrip.SuspendLayout();
SuspendLayout();
//
// menuStrip
//
menuStrip.ImageScalingSize = new Size(20, 20);
menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчётыToolStripMenuItem });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(782, 28);
menuStrip.TabIndex = 0;
menuStrip.Text = "menuStrip";
//
// справочникиToolStripMenuItem
//
справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { AudiencesToolStripMenuItem, DisciplinesToolStripMenuItem, EducatorsToolStripMenuItem, GroupsStudentsToolStripMenuItem });
справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
справочникиToolStripMenuItem.Size = new Size(117, 24);
справочникиToolStripMenuItem.Text = "Справочники";
//
// AudiencesToolStripMenuItem
//
AudiencesToolStripMenuItem.Name = "AudiencesToolStripMenuItem";
AudiencesToolStripMenuItem.Size = new Size(224, 26);
AudiencesToolStripMenuItem.Text = "Аудитории";
AudiencesToolStripMenuItem.Click += AudiencesToolStripMenuItem_Click;
//
// DisciplinesToolStripMenuItem
//
DisciplinesToolStripMenuItem.Name = "DisciplinesToolStripMenuItem";
DisciplinesToolStripMenuItem.Size = new Size(224, 26);
DisciplinesToolStripMenuItem.Text = "Дисциплины";
DisciplinesToolStripMenuItem.Click += DisciplinesToolStripMenuItem_Click;
//
// EducatorsToolStripMenuItem
//
EducatorsToolStripMenuItem.Name = "EducatorsToolStripMenuItem";
EducatorsToolStripMenuItem.Size = new Size(224, 26);
EducatorsToolStripMenuItem.Text = "Преподаватели";
EducatorsToolStripMenuItem.Click += EducatorsToolStripMenuItem_Click;
//
// GroupsStudentsToolStripMenuItem
//
GroupsStudentsToolStripMenuItem.Name = "GroupsStudentsToolStripMenuItem";
GroupsStudentsToolStripMenuItem.Size = new Size(224, 26);
GroupsStudentsToolStripMenuItem.Text = "Группы студентов";
GroupsStudentsToolStripMenuItem.Click += GroupsStudentsToolStripMenuItem_Click;
//
// операцииToolStripMenuItem
//
операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { CompilingScheduleToolStripMenuItem, CurriculumSupplementToolStripMenuItem });
операцииToolStripMenuItem.Name = "операцииToolStripMenuItem";
операцииToolStripMenuItem.Size = new Size(95, 24);
операцииToolStripMenuItem.Text = "Операции";
//
// CompilingScheduleToolStripMenuItem
//
CompilingScheduleToolStripMenuItem.Name = "CompilingScheduleToolStripMenuItem";
CompilingScheduleToolStripMenuItem.Size = new Size(295, 26);
CompilingScheduleToolStripMenuItem.Text = "Составление расписания";
CompilingScheduleToolStripMenuItem.Click += CompilingScheduleToolStripMenuItem_Click;
//
// CurriculumSupplementToolStripMenuItem
//
CurriculumSupplementToolStripMenuItem.Name = "CurriculumSupplementToolStripMenuItem";
CurriculumSupplementToolStripMenuItem.Size = new Size(295, 26);
CurriculumSupplementToolStripMenuItem.Text = "Дополнение учебного плана";
CurriculumSupplementToolStripMenuItem.Click += CurriculumSupplementToolStripMenuItem_Click;
//
// отчётыToolStripMenuItem
//
отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem";
отчётыToolStripMenuItem.Size = new Size(73, 24);
отчётыToolStripMenuItem.Text = "Отчёты";
//
// FormSchedule
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackgroundImage = Properties.Resources.Расписаниеаон;
BackgroundImageLayout = ImageLayout.Stretch;
ClientSize = new Size(782, 403);
Controls.Add(menuStrip);
MainMenuStrip = menuStrip;
Name = "FormSchedule";
StartPosition = FormStartPosition.CenterScreen;
Text = "Расписание";
menuStrip.ResumeLayout(false);
menuStrip.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private MenuStrip menuStrip;
private ToolStripMenuItem справочникиToolStripMenuItem;
private ToolStripMenuItem AudiencesToolStripMenuItem;
private ToolStripMenuItem DisciplinesToolStripMenuItem;
private ToolStripMenuItem EducatorsToolStripMenuItem;
private ToolStripMenuItem GroupsStudentsToolStripMenuItem;
private ToolStripMenuItem операцииToolStripMenuItem;
private ToolStripMenuItem CompilingScheduleToolStripMenuItem;
private ToolStripMenuItem отчётыToolStripMenuItem;
private ToolStripMenuItem CurriculumSupplementToolStripMenuItem;
}
}

View File

@ -0,0 +1,89 @@
using ProjectSchedule.Forms;
using Unity;
namespace ProjectSchedule
{
public partial class FormSchedule : Form
{
private readonly IUnityContainer _container;
public FormSchedule(IUnityContainer container)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
}
private void AudiencesToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormAudiences>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void DisciplinesToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormDisciplines>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void EducatorsToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormEducators>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void GroupsStudentsToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormGroupsStudents>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void CompilingScheduleToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormCompilingSchedules>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void CurriculumSupplementToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormCurriculumSupplements>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Îøèáêà ïðè çàãðóçêå", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

View File

@ -0,0 +1,144 @@
namespace ProjectSchedule.Forms
{
partial class FormAudience
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
labelNumberAudience = new Label();
labelQuantitySeats = new Label();
labelTypeAudience = new Label();
buttonSave = new Button();
buttonCancel = new Button();
textBoxNumberAudience = new TextBox();
numericUpDownQuantitySeats = new NumericUpDown();
checkedListBoxTypeAudience = new CheckedListBox();
((System.ComponentModel.ISupportInitialize)numericUpDownQuantitySeats).BeginInit();
SuspendLayout();
//
// labelNumberAudience
//
labelNumberAudience.AutoSize = true;
labelNumberAudience.Location = new Point(21, 32);
labelNumberAudience.Name = "labelNumberAudience";
labelNumberAudience.Size = new Size(138, 20);
labelNumberAudience.TabIndex = 0;
labelNumberAudience.Text = "Номер аудитории:";
//
// labelQuantitySeats
//
labelQuantitySeats.AutoSize = true;
labelQuantitySeats.Location = new Point(21, 77);
labelQuantitySeats.Name = "labelQuantitySeats";
labelQuantitySeats.Size = new Size(129, 20);
labelQuantitySeats.TabIndex = 1;
labelQuantitySeats.Text = "Количество мест:";
//
// labelTypeAudience
//
labelTypeAudience.AutoSize = true;
labelTypeAudience.Location = new Point(21, 127);
labelTypeAudience.Name = "labelTypeAudience";
labelTypeAudience.Size = new Size(116, 20);
labelTypeAudience.TabIndex = 2;
labelTypeAudience.Text = "Тип аудитории:";
//
// buttonSave
//
buttonSave.Location = new Point(21, 300);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(116, 29);
buttonSave.TabIndex = 3;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += ButtonSave_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(282, 300);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(116, 29);
buttonCancel.TabIndex = 4;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += ButtonCancel_Click;
//
// textBoxNumberAudience
//
textBoxNumberAudience.Location = new Point(176, 29);
textBoxNumberAudience.Name = "textBoxNumberAudience";
textBoxNumberAudience.Size = new Size(222, 27);
textBoxNumberAudience.TabIndex = 5;
//
// numericUpDownQuantitySeats
//
numericUpDownQuantitySeats.Location = new Point(176, 77);
numericUpDownQuantitySeats.Maximum = new decimal(new int[] { 500, 0, 0, 0 });
numericUpDownQuantitySeats.Name = "numericUpDownQuantitySeats";
numericUpDownQuantitySeats.Size = new Size(222, 27);
numericUpDownQuantitySeats.TabIndex = 6;
//
// checkedListBoxTypeAudience
//
checkedListBoxTypeAudience.FormattingEnabled = true;
checkedListBoxTypeAudience.Location = new Point(176, 127);
checkedListBoxTypeAudience.Name = "checkedListBoxTypeAudience";
checkedListBoxTypeAudience.Size = new Size(222, 136);
checkedListBoxTypeAudience.TabIndex = 7;
//
// FormAudience
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(412, 353);
Controls.Add(checkedListBoxTypeAudience);
Controls.Add(numericUpDownQuantitySeats);
Controls.Add(textBoxNumberAudience);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(labelTypeAudience);
Controls.Add(labelQuantitySeats);
Controls.Add(labelNumberAudience);
Name = "FormAudience";
StartPosition = FormStartPosition.CenterParent;
Text = "Аудитория";
((System.ComponentModel.ISupportInitialize)numericUpDownQuantitySeats).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label labelNumberAudience;
private Label labelQuantitySeats;
private Label labelTypeAudience;
private Button buttonSave;
private Button buttonCancel;
private TextBox textBoxNumberAudience;
private NumericUpDown numericUpDownQuantitySeats;
private CheckedListBox checkedListBoxTypeAudience;
}
}

View File

@ -0,0 +1,95 @@
using ProjectSchedule.Entities.Enums;
using ProjectSchedule.Entities;
using ProjectSchedule.Repositories;
namespace ProjectSchedule.Forms;
public partial class FormAudience : Form
{
private readonly IAudienceRepository _audienceRepository;
private int? _audienceId;
public int Id
{
set
{
try
{
var audience = _audienceRepository.ReadAudienceById(value);
if (audience == null)
{
throw new InvalidDataException(nameof(audience));
}
foreach (TypeAudience elem in Enum.GetValues(typeof(TypeAudience)))
{
if ((elem & audience.TypeAudience) != 0)
{
checkedListBoxTypeAudience.SetItemChecked(checkedListBoxTypeAudience.Items.IndexOf(elem), true);
}
}
textBoxNumberAudience.Text = audience.NumberAudience;
numericUpDownQuantitySeats.Value = audience.QuantitySeats;
_audienceId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormAudience(IAudienceRepository audienceRepository)
{
InitializeComponent();
_audienceRepository = audienceRepository ??
throw new ArgumentNullException(nameof(audienceRepository));
foreach (var elem in Enum.GetValues(typeof(TypeAudience)))
{
checkedListBoxTypeAudience.Items.Add(elem);
}
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxNumberAudience.Text) || checkedListBoxTypeAudience.CheckedItems.Count == 0)
{
throw new Exception("Имеются незаполненные поля");
}
if (_audienceId.HasValue)
{
_audienceRepository.UpdateAudience(CreateAudience(_audienceId.Value));
}
else
{
_audienceRepository.CreateAudience(CreateAudience(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCancel_Click(object sender, EventArgs e) => Close();
private Audience CreateAudience(int id)
{
TypeAudience typeAudience = TypeAudience.None;
foreach (var elem in checkedListBoxTypeAudience.CheckedItems)
{
typeAudience |= (TypeAudience)elem;
}
return Audience.CreateEntity(id, textBoxNumberAudience.Text, typeAudience, Convert.ToInt32(numericUpDownQuantitySeats.Value));
}
}

View File

@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
@ -26,36 +26,36 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->

View File

@ -0,0 +1,127 @@
namespace ProjectSchedule.Forms
{
partial class FormAudiences
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
panelButtons = new Panel();
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
dataGridViewData = new DataGridView();
panelButtons.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit();
SuspendLayout();
//
// panelButtons
//
panelButtons.Controls.Add(buttonDel);
panelButtons.Controls.Add(buttonUpd);
panelButtons.Controls.Add(buttonAdd);
panelButtons.Dock = DockStyle.Right;
panelButtons.Location = new Point(672, 0);
panelButtons.Name = "panelButtons";
panelButtons.Size = new Size(140, 483);
panelButtons.TabIndex = 0;
//
// buttonDel
//
buttonDel.BackgroundImage = Properties.Resources.Del;
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(24, 194);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(94, 66);
buttonDel.TabIndex = 4;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += ButtonDel_Click;
//
// buttonUpd
//
buttonUpd.BackgroundImage = Properties.Resources.Upd;
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(24, 106);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(94, 66);
buttonUpd.TabIndex = 3;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += ButtonUpd_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.Add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(24, 12);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(94, 66);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// dataGridViewData
//
dataGridViewData.AllowUserToAddRows = false;
dataGridViewData.AllowUserToDeleteRows = false;
dataGridViewData.AllowUserToResizeColumns = false;
dataGridViewData.AllowUserToResizeRows = false;
dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewData.Dock = DockStyle.Fill;
dataGridViewData.Location = new Point(0, 0);
dataGridViewData.MultiSelect = false;
dataGridViewData.Name = "dataGridViewData";
dataGridViewData.ReadOnly = true;
dataGridViewData.RowHeadersVisible = false;
dataGridViewData.RowHeadersWidth = 51;
dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewData.Size = new Size(672, 483);
dataGridViewData.TabIndex = 1;
//
// FormAudiences
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(812, 483);
Controls.Add(dataGridViewData);
Controls.Add(panelButtons);
Name = "FormAudiences";
StartPosition = FormStartPosition.CenterParent;
Text = "Аудитории";
Load += FormAudiences_Load;
panelButtons.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panelButtons;
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
private DataGridView dataGridViewData;
}
}

View File

@ -0,0 +1,104 @@
using ProjectSchedule.Repositories;
using Unity;
namespace ProjectSchedule.Forms
{
public partial class FormAudiences : Form
{
private readonly IUnityContainer _container;
private readonly IAudienceRepository _audienceRepository;
public FormAudiences(IUnityContainer container, IAudienceRepository audienceRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_audienceRepository = audienceRepository ??
throw new ArgumentNullException(nameof(audienceRepository));
}
private void FormAudiences_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormAudience>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonUpd_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<FormAudience>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_audienceRepository.DeleteAudience(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewData.DataSource = _audienceRepository.ReadAudiences();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewData.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value);
return true;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,272 @@
namespace ProjectSchedule.Forms
{
partial class FormCompilingSchedule
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
labelEducator = new Label();
labelDiscipline = new Label();
labelAudience = new Label();
labelGroupStudents = new Label();
labelNumberDay = new Label();
labelTypeWeek = new Label();
labelNumberPair = new Label();
labelTypeActivity = new Label();
comboBoxDiscipline = new ComboBox();
comboBoxGroupStudents = new ComboBox();
comboBoxEducator = new ComboBox();
comboBoxAudience = new ComboBox();
comboBoxTypeWeek = new ComboBox();
comboBoxTypeActivity = new ComboBox();
numericUpDownNumberPair = new NumericUpDown();
numericUpDownNumberDay = new NumericUpDown();
buttonSave = new Button();
buttonCancel = new Button();
((System.ComponentModel.ISupportInitialize)numericUpDownNumberPair).BeginInit();
((System.ComponentModel.ISupportInitialize)numericUpDownNumberDay).BeginInit();
SuspendLayout();
//
// labelEducator
//
labelEducator.AutoSize = true;
labelEducator.Location = new Point(34, 27);
labelEducator.Name = "labelEducator";
labelEducator.Size = new Size(120, 20);
labelEducator.TabIndex = 0;
labelEducator.Text = "Преподаватель:";
//
// labelDiscipline
//
labelDiscipline.AutoSize = true;
labelDiscipline.Location = new Point(34, 66);
labelDiscipline.Name = "labelDiscipline";
labelDiscipline.Size = new Size(99, 20);
labelDiscipline.TabIndex = 1;
labelDiscipline.Text = "Дисциплина:";
//
// labelAudience
//
labelAudience.AutoSize = true;
labelAudience.Location = new Point(34, 159);
labelAudience.Name = "labelAudience";
labelAudience.Size = new Size(87, 20);
labelAudience.TabIndex = 2;
labelAudience.Text = "Аудитория:";
//
// labelGroupStudents
//
labelGroupStudents.AutoSize = true;
labelGroupStudents.Location = new Point(34, 111);
labelGroupStudents.Name = "labelGroupStudents";
labelGroupStudents.Size = new Size(133, 20);
labelGroupStudents.TabIndex = 3;
labelGroupStudents.Text = "Группа студентов:";
//
// labelNumberDay
//
labelNumberDay.AutoSize = true;
labelNumberDay.Location = new Point(34, 264);
labelNumberDay.Name = "labelNumberDay";
labelNumberDay.Size = new Size(89, 20);
labelNumberDay.TabIndex = 4;
labelNumberDay.Text = "Номер дня:";
//
// labelTypeWeek
//
labelTypeWeek.AutoSize = true;
labelTypeWeek.Location = new Point(34, 212);
labelTypeWeek.Name = "labelTypeWeek";
labelTypeWeek.Size = new Size(63, 20);
labelTypeWeek.TabIndex = 5;
labelTypeWeek.Text = "Неделя:";
//
// labelNumberPair
//
labelNumberPair.AutoSize = true;
labelNumberPair.Location = new Point(34, 302);
labelNumberPair.Name = "labelNumberPair";
labelNumberPair.Size = new Size(101, 20);
labelNumberPair.TabIndex = 6;
labelNumberPair.Text = "Номер пары:";
//
// labelTypeActivity
//
labelTypeActivity.AutoSize = true;
labelTypeActivity.Location = new Point(34, 355);
labelTypeActivity.Name = "labelTypeActivity";
labelTypeActivity.Size = new Size(97, 20);
labelTypeActivity.TabIndex = 7;
labelTypeActivity.Text = "Тип занятия:";
//
// comboBoxDiscipline
//
comboBoxDiscipline.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxDiscipline.FormattingEnabled = true;
comboBoxDiscipline.Location = new Point(245, 66);
comboBoxDiscipline.Name = "comboBoxDiscipline";
comboBoxDiscipline.Size = new Size(210, 28);
comboBoxDiscipline.TabIndex = 8;
//
// comboBoxGroupStudents
//
comboBoxGroupStudents.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxGroupStudents.FormattingEnabled = true;
comboBoxGroupStudents.Location = new Point(245, 108);
comboBoxGroupStudents.Name = "comboBoxGroupStudents";
comboBoxGroupStudents.Size = new Size(210, 28);
comboBoxGroupStudents.TabIndex = 9;
//
// comboBoxEducator
//
comboBoxEducator.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxEducator.FormattingEnabled = true;
comboBoxEducator.Location = new Point(245, 24);
comboBoxEducator.Name = "comboBoxEducator";
comboBoxEducator.Size = new Size(210, 28);
comboBoxEducator.TabIndex = 10;
//
// comboBoxAudience
//
comboBoxAudience.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxAudience.FormattingEnabled = true;
comboBoxAudience.Location = new Point(245, 159);
comboBoxAudience.Name = "comboBoxAudience";
comboBoxAudience.Size = new Size(210, 28);
comboBoxAudience.TabIndex = 11;
//
// comboBoxTypeWeek
//
comboBoxTypeWeek.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxTypeWeek.FormattingEnabled = true;
comboBoxTypeWeek.Location = new Point(245, 209);
comboBoxTypeWeek.Name = "comboBoxTypeWeek";
comboBoxTypeWeek.Size = new Size(210, 28);
comboBoxTypeWeek.TabIndex = 12;
//
// comboBoxTypeActivity
//
comboBoxTypeActivity.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxTypeActivity.FormattingEnabled = true;
comboBoxTypeActivity.Location = new Point(245, 347);
comboBoxTypeActivity.Name = "comboBoxTypeActivity";
comboBoxTypeActivity.Size = new Size(210, 28);
comboBoxTypeActivity.TabIndex = 14;
//
// numericUpDownNumberPair
//
numericUpDownNumberPair.Location = new Point(245, 302);
numericUpDownNumberPair.Maximum = new decimal(new int[] { 8, 0, 0, 0 });
numericUpDownNumberPair.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDownNumberPair.Name = "numericUpDownNumberPair";
numericUpDownNumberPair.Size = new Size(210, 27);
numericUpDownNumberPair.TabIndex = 15;
numericUpDownNumberPair.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// numericUpDownNumberDay
//
numericUpDownNumberDay.Location = new Point(245, 257);
numericUpDownNumberDay.Maximum = new decimal(new int[] { 7, 0, 0, 0 });
numericUpDownNumberDay.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
numericUpDownNumberDay.Name = "numericUpDownNumberDay";
numericUpDownNumberDay.Size = new Size(210, 27);
numericUpDownNumberDay.TabIndex = 16;
numericUpDownNumberDay.Value = new decimal(new int[] { 1, 0, 0, 0 });
//
// buttonSave
//
buttonSave.Location = new Point(34, 409);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(116, 29);
buttonSave.TabIndex = 17;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += ButtonSave_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(339, 409);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(116, 29);
buttonCancel.TabIndex = 18;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += ButtonCancel_Click;
//
// FormCompilingSchedule
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(482, 453);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(numericUpDownNumberDay);
Controls.Add(numericUpDownNumberPair);
Controls.Add(comboBoxTypeActivity);
Controls.Add(comboBoxTypeWeek);
Controls.Add(comboBoxAudience);
Controls.Add(comboBoxEducator);
Controls.Add(comboBoxGroupStudents);
Controls.Add(comboBoxDiscipline);
Controls.Add(labelTypeActivity);
Controls.Add(labelNumberPair);
Controls.Add(labelTypeWeek);
Controls.Add(labelNumberDay);
Controls.Add(labelGroupStudents);
Controls.Add(labelAudience);
Controls.Add(labelDiscipline);
Controls.Add(labelEducator);
Name = "FormCompilingSchedule";
StartPosition = FormStartPosition.CenterParent;
Text = "Составление расписания";
((System.ComponentModel.ISupportInitialize)numericUpDownNumberPair).EndInit();
((System.ComponentModel.ISupportInitialize)numericUpDownNumberDay).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label labelEducator;
private Label labelDiscipline;
private Label labelAudience;
private Label labelGroupStudents;
private Label labelNumberDay;
private Label labelTypeWeek;
private Label labelNumberPair;
private Label labelTypeActivity;
private ComboBox comboBoxDiscipline;
private ComboBox comboBoxGroupStudents;
private ComboBox comboBoxEducator;
private ComboBox comboBoxAudience;
private ComboBox comboBoxTypeWeek;
private ComboBox comboBoxTypeActivity;
private NumericUpDown numericUpDownNumberPair;
private NumericUpDown numericUpDownNumberDay;
private Button buttonSave;
private Button buttonCancel;
}
}

View File

@ -0,0 +1,66 @@
using ProjectSchedule.Entities;
using ProjectSchedule.Entities.Enums;
using ProjectSchedule.Repositories;
namespace ProjectSchedule.Forms
{
public partial class FormCompilingSchedule : Form
{
private readonly ICompilingScheduleRepository _сompilingScheduleRepository;
public FormCompilingSchedule(ICompilingScheduleRepository сompilingScheduleRepository, IDisciplineRepository disciplineRepository,
IEducatorRepository educatorRepository, IGroupStudentsRepository groupStudentsRepository, IAudienceRepository audienceRepository)
{
InitializeComponent();
_сompilingScheduleRepository = сompilingScheduleRepository ??
throw new ArgumentNullException(nameof(сompilingScheduleRepository));
comboBoxEducator.DataSource = educatorRepository.ReadEducators();
comboBoxEducator.DisplayMember = "Surname";
comboBoxEducator.ValueMember = "Id";
comboBoxDiscipline.DataSource = disciplineRepository.ReadDisciplines();
comboBoxDiscipline.DisplayMember = "NameDiscipline";
comboBoxDiscipline.ValueMember = "Id";
comboBoxGroupStudents.DataSource = groupStudentsRepository.ReadGroupsStudents();
comboBoxGroupStudents.DisplayMember = "AbbreviationGroup";
comboBoxGroupStudents.ValueMember = "Id";
comboBoxAudience.DataSource = audienceRepository.ReadAudiences();
comboBoxAudience.DisplayMember = "NumberAudience";
comboBoxAudience.ValueMember = "Id";
comboBoxTypeWeek.DataSource = Enum.GetValues(typeof(TypeWeek));
comboBoxTypeActivity.DataSource = Enum.GetValues(typeof(TypeActivity));
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (comboBoxEducator.SelectedIndex < 0 || comboBoxDiscipline.SelectedIndex < 0 || comboBoxGroupStudents.SelectedIndex < 0 ||
comboBoxAudience.SelectedIndex < 0 || comboBoxTypeWeek.SelectedIndex < 1 || comboBoxTypeActivity.SelectedIndex < 1)
{
throw new Exception("Имеются незаполненные поля");
}
_сompilingScheduleRepository.CreateCompilingSchedule(CompilingSchedule.CreateOperation(0,
(int)comboBoxEducator.SelectedValue!, (int)comboBoxDiscipline.SelectedValue!,
(int)comboBoxGroupStudents.SelectedValue!, (int)comboBoxAudience.SelectedValue!,
(TypeWeek)comboBoxTypeWeek.SelectedItem!, Convert.ToInt32(numericUpDownNumberDay.Value),
Convert.ToInt32(numericUpDownNumberPair.Value), (TypeActivity)comboBoxTypeActivity.SelectedItem!));
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка сохранения", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCancel_Click(object sender, EventArgs e) => Close();
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,99 @@
namespace ProjectSchedule.Forms
{
partial class FormCompilingSchedules
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
panelButtons = new Panel();
buttonAdd = new Button();
dataGridViewData = new DataGridView();
panelButtons.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit();
SuspendLayout();
//
// panelButtons
//
panelButtons.Controls.Add(buttonAdd);
panelButtons.Dock = DockStyle.Right;
panelButtons.Location = new Point(1113, 0);
panelButtons.Name = "panelButtons";
panelButtons.Size = new Size(140, 484);
panelButtons.TabIndex = 3;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.Add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(24, 12);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(94, 66);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// dataGridViewData
//
dataGridViewData.AllowUserToAddRows = false;
dataGridViewData.AllowUserToDeleteRows = false;
dataGridViewData.AllowUserToResizeColumns = false;
dataGridViewData.AllowUserToResizeRows = false;
dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewData.Dock = DockStyle.Fill;
dataGridViewData.Location = new Point(0, 0);
dataGridViewData.MultiSelect = false;
dataGridViewData.Name = "dataGridViewData";
dataGridViewData.ReadOnly = true;
dataGridViewData.RowHeadersVisible = false;
dataGridViewData.RowHeadersWidth = 51;
dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewData.Size = new Size(1113, 484);
dataGridViewData.TabIndex = 4;
//
// FormCompilingSchedules
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1253, 484);
Controls.Add(dataGridViewData);
Controls.Add(panelButtons);
Name = "FormCompilingSchedules";
StartPosition = FormStartPosition.CenterParent;
Text = "Cоставление расписаний";
Load += FormCompilingSchedules_Load;
panelButtons.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panelButtons;
private Button buttonAdd;
private DataGridView dataGridViewData;
}
}

View File

@ -0,0 +1,48 @@
using ProjectSchedule.Repositories;
using Unity;
namespace ProjectSchedule.Forms
{
public partial class FormCompilingSchedules : Form
{
private readonly IUnityContainer _container;
private readonly ICompilingScheduleRepository _сompilingScheduleRepository;
public FormCompilingSchedules(IUnityContainer container, ICompilingScheduleRepository сompilingScheduleRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_сompilingScheduleRepository = сompilingScheduleRepository ??
throw new ArgumentNullException(nameof(сompilingScheduleRepository));
}
private void FormCompilingSchedules_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<FormCompilingSchedule>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewData.DataSource = _сompilingScheduleRepository.ReadCompilingSchedules();
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,225 @@
namespace ProjectSchedule.Forms
{
partial class FormCurriculumSupplement
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
comboBoxGroupStudents = new ComboBox();
labelGroupStudents = new Label();
labelNameCurriculum = new Label();
labelSemester = new Label();
textBoxNameCurriculum = new TextBox();
buttonSave = new Button();
buttonCancel = new Button();
textBoxSemester = new TextBox();
groupBoxDisciplines = new GroupBox();
dataGridViewDisciplines = new DataGridView();
ColumnDiscipline = new DataGridViewComboBoxColumn();
ColumnQuantityLectures = new DataGridViewTextBoxColumn();
ColumnQuantityPractices = new DataGridViewTextBoxColumn();
labelDateAdoptionPlan = new Label();
dateTimePickerDateAdoptionPlan = new DateTimePicker();
groupBoxDisciplines.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewDisciplines).BeginInit();
SuspendLayout();
//
// comboBoxGroupStudents
//
comboBoxGroupStudents.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxGroupStudents.FormattingEnabled = true;
comboBoxGroupStudents.Location = new Point(252, 6);
comboBoxGroupStudents.Name = "comboBoxGroupStudents";
comboBoxGroupStudents.Size = new Size(218, 28);
comboBoxGroupStudents.TabIndex = 1;
//
// labelGroupStudents
//
labelGroupStudents.AutoSize = true;
labelGroupStudents.Location = new Point(12, 9);
labelGroupStudents.Name = "labelGroupStudents";
labelGroupStudents.Size = new Size(133, 20);
labelGroupStudents.TabIndex = 3;
labelGroupStudents.Text = "Группа студентов:";
//
// labelNameCurriculum
//
labelNameCurriculum.AutoSize = true;
labelNameCurriculum.Location = new Point(12, 46);
labelNameCurriculum.Name = "labelNameCurriculum";
labelNameCurriculum.Size = new Size(230, 20);
labelNameCurriculum.TabIndex = 4;
labelNameCurriculum.Text = "Название учебной программы:";
//
// labelSemester
//
labelSemester.AutoSize = true;
labelSemester.Location = new Point(12, 83);
labelSemester.Name = "labelSemester";
labelSemester.Size = new Size(70, 20);
labelSemester.TabIndex = 7;
labelSemester.Text = "Семестр:";
//
// textBoxNameCurriculum
//
textBoxNameCurriculum.Location = new Point(252, 43);
textBoxNameCurriculum.Name = "textBoxNameCurriculum";
textBoxNameCurriculum.Size = new Size(218, 27);
textBoxNameCurriculum.TabIndex = 8;
//
// buttonSave
//
buttonSave.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonSave.Location = new Point(12, 522);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(116, 29);
buttonSave.TabIndex = 12;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += ButtonSave_Click;
//
// buttonCancel
//
buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonCancel.Location = new Point(354, 522);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(116, 29);
buttonCancel.TabIndex = 13;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += ButtonCancel_Click;
//
// textBoxSemester
//
textBoxSemester.Location = new Point(252, 80);
textBoxSemester.Name = "textBoxSemester";
textBoxSemester.Size = new Size(218, 27);
textBoxSemester.TabIndex = 15;
//
// groupBoxDisciplines
//
groupBoxDisciplines.Controls.Add(dataGridViewDisciplines);
groupBoxDisciplines.Location = new Point(12, 155);
groupBoxDisciplines.Name = "groupBoxDisciplines";
groupBoxDisciplines.Size = new Size(458, 343);
groupBoxDisciplines.TabIndex = 16;
groupBoxDisciplines.TabStop = false;
groupBoxDisciplines.Text = "Дисциплины";
//
// dataGridViewDisciplines
//
dataGridViewDisciplines.AllowUserToResizeColumns = false;
dataGridViewDisciplines.AllowUserToResizeRows = false;
dataGridViewDisciplines.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewDisciplines.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewDisciplines.Columns.AddRange(new DataGridViewColumn[] { ColumnDiscipline, ColumnQuantityLectures, ColumnQuantityPractices });
dataGridViewDisciplines.Dock = DockStyle.Fill;
dataGridViewDisciplines.Location = new Point(3, 23);
dataGridViewDisciplines.MultiSelect = false;
dataGridViewDisciplines.Name = "dataGridViewDisciplines";
dataGridViewDisciplines.RowHeadersVisible = false;
dataGridViewDisciplines.RowHeadersWidth = 51;
dataGridViewDisciplines.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewDisciplines.Size = new Size(452, 317);
dataGridViewDisciplines.TabIndex = 0;
//
// ColumnDiscipline
//
ColumnDiscipline.HeaderText = "Дисциплина";
ColumnDiscipline.MinimumWidth = 6;
ColumnDiscipline.Name = "ColumnDiscipline";
//
// ColumnQuantityLectures
//
ColumnQuantityLectures.HeaderText = "Количество лекций";
ColumnQuantityLectures.MinimumWidth = 6;
ColumnQuantityLectures.Name = "ColumnQuantityLectures";
//
// ColumnQuantityPractices
//
ColumnQuantityPractices.HeaderText = "Количество практик";
ColumnQuantityPractices.MinimumWidth = 6;
ColumnQuantityPractices.Name = "ColumnQuantityPractices";
//
// labelDateAdoptionPlan
//
labelDateAdoptionPlan.AutoSize = true;
labelDateAdoptionPlan.Location = new Point(15, 122);
labelDateAdoptionPlan.Name = "labelDateAdoptionPlan";
labelDateAdoptionPlan.Size = new Size(161, 20);
labelDateAdoptionPlan.TabIndex = 17;
labelDateAdoptionPlan.Text = "Дата принятия плана:";
//
// dateTimePickerDateAdoptionPlan
//
dateTimePickerDateAdoptionPlan.Location = new Point(252, 117);
dateTimePickerDateAdoptionPlan.Name = "dateTimePickerDateAdoptionPlan";
dateTimePickerDateAdoptionPlan.Size = new Size(218, 27);
dateTimePickerDateAdoptionPlan.TabIndex = 18;
//
// FormCurriculumSupplement
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(482, 563);
Controls.Add(dateTimePickerDateAdoptionPlan);
Controls.Add(labelDateAdoptionPlan);
Controls.Add(groupBoxDisciplines);
Controls.Add(textBoxSemester);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(textBoxNameCurriculum);
Controls.Add(labelSemester);
Controls.Add(labelNameCurriculum);
Controls.Add(labelGroupStudents);
Controls.Add(comboBoxGroupStudents);
Name = "FormCurriculumSupplement";
StartPosition = FormStartPosition.CenterParent;
Text = "Дополнение учебного плана";
groupBoxDisciplines.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewDisciplines).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private ComboBox comboBoxGroupStudents;
private Label labelGroupStudents;
private Label labelNameCurriculum;
private Label labelSemester;
private TextBox textBoxNameCurriculum;
private Button buttonSave;
private Button buttonCancel;
private TextBox textBoxSemester;
private GroupBox groupBoxDisciplines;
private DataGridView dataGridViewDisciplines;
private DataGridViewComboBoxColumn ColumnDiscipline;
private DataGridViewTextBoxColumn ColumnQuantityLectures;
private DataGridViewTextBoxColumn ColumnQuantityPractices;
private Label labelDateAdoptionPlan;
private DateTimePicker dateTimePickerDateAdoptionPlan;
}
}

View File

@ -0,0 +1,68 @@
using ProjectSchedule.Entities;
using ProjectSchedule.Repositories;
namespace ProjectSchedule.Forms
{
public partial class FormCurriculumSupplement : Form
{
private readonly ICurriculumSupplementRepository _curriculumSupplementRepository;
public FormCurriculumSupplement(ICurriculumSupplementRepository curriculumSupplementRepository,
IDisciplineRepository disciplineRepository, IGroupStudentsRepository groupStudentsRepository)
{
InitializeComponent();
_curriculumSupplementRepository = curriculumSupplementRepository ??
throw new ArgumentNullException(nameof(curriculumSupplementRepository));
comboBoxGroupStudents.DataSource = groupStudentsRepository.ReadGroupsStudents();
comboBoxGroupStudents.DisplayMember = "AbbreviationGroup";
comboBoxGroupStudents.ValueMember = "Id";
ColumnDiscipline.DataSource = disciplineRepository.ReadDisciplines();
ColumnDiscipline.DisplayMember = "NameDiscipline";
ColumnDiscipline.ValueMember = "Id";
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (dataGridViewDisciplines.RowCount < 1 || comboBoxGroupStudents.SelectedIndex < 0)
{
throw new Exception("Имеются незаполненные поля");
}
_curriculumSupplementRepository.CreateCurriculumSupplement(CurriculumSupplement.CreateOperation(0,
(int)comboBoxGroupStudents.SelectedValue!, textBoxNameCurriculum.Text, textBoxSemester.Text,
dateTimePickerDateAdoptionPlan.Value, CreateListDisciplineCurriculumSupplementsFromDataGrid()));
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCancel_Click(object sender, EventArgs e) => Close();
private List<DisciplineCurriculumSupplement> CreateListDisciplineCurriculumSupplementsFromDataGrid()
{
var list = new List<DisciplineCurriculumSupplement>();
foreach (DataGridViewRow row in dataGridViewDisciplines.Rows)
{
if (row.Cells["ColumnDiscipline"].Value == null || row.Cells["ColumnQuantityLectures"].Value == null ||
row.Cells["ColumnQuantityPractices"].Value == null)
{
continue;
}
list.Add(DisciplineCurriculumSupplement.CreateElement(0, Convert.ToInt32(row.Cells["ColumnDiscipline"].Value),
Convert.ToInt32(row.Cells["ColumnQuantityLectures"].Value),
Convert.ToInt32(row.Cells["ColumnQuantityPractices"].Value)));
}
return list;
}
}
}

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="ColumnDiscipline.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnQuantityLectures.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnQuantityPractices.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -0,0 +1,113 @@
namespace ProjectSchedule.Forms
{
partial class FormCurriculumSupplements
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
panelButtons = new Panel();
buttonDel = new Button();
buttonAdd = new Button();
dataGridViewData = new DataGridView();
panelButtons.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit();
SuspendLayout();
//
// panelButtons
//
panelButtons.Controls.Add(buttonDel);
panelButtons.Controls.Add(buttonAdd);
panelButtons.Dock = DockStyle.Right;
panelButtons.Location = new Point(764, 0);
panelButtons.Name = "panelButtons";
panelButtons.Size = new Size(140, 453);
panelButtons.TabIndex = 2;
//
// buttonDel
//
buttonDel.BackgroundImage = Properties.Resources.Del;
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(24, 372);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(94, 66);
buttonDel.TabIndex = 4;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += ButtonDel_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.Add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(24, 12);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(94, 66);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// dataGridViewData
//
dataGridViewData.AllowUserToAddRows = false;
dataGridViewData.AllowUserToDeleteRows = false;
dataGridViewData.AllowUserToResizeColumns = false;
dataGridViewData.AllowUserToResizeRows = false;
dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewData.Dock = DockStyle.Fill;
dataGridViewData.Location = new Point(0, 0);
dataGridViewData.MultiSelect = false;
dataGridViewData.Name = "dataGridViewData";
dataGridViewData.ReadOnly = true;
dataGridViewData.RowHeadersVisible = false;
dataGridViewData.RowHeadersWidth = 51;
dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewData.Size = new Size(764, 453);
dataGridViewData.TabIndex = 3;
//
// FormCurriculumSupplements
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(904, 453);
Controls.Add(dataGridViewData);
Controls.Add(panelButtons);
Name = "FormCurriculumSupplements";
StartPosition = FormStartPosition.CenterParent;
Text = "Дополнения учебного плана";
Load += FormCurriculumSupplements_Load;
panelButtons.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panelButtons;
private Button buttonDel;
private Button buttonAdd;
private DataGridView dataGridViewData;
}
}

View File

@ -0,0 +1,86 @@
using ProjectSchedule.Repositories;
using Unity;
namespace ProjectSchedule.Forms
{
public partial class FormCurriculumSupplements : Form
{
private readonly IUnityContainer _container;
private readonly ICurriculumSupplementRepository _curriculumSupplementRepository;
public FormCurriculumSupplements(IUnityContainer container, ICurriculumSupplementRepository curriculumSupplementRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_curriculumSupplementRepository = curriculumSupplementRepository ??
throw new ArgumentNullException(nameof(curriculumSupplementRepository));
}
private void FormCurriculumSupplements_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<FormCurriculumSupplement>().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
{
_curriculumSupplementRepository.DeleteCurriculumSupplement(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() =>
dataGridViewData.DataSource = _curriculumSupplementRepository.ReadCurriculumSupplements();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewData.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value);
return true;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,96 @@
namespace ProjectSchedule.Forms
{
partial class FormDiscipline
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
textBoxNameDiscipline = new TextBox();
labelNameDiscipline = new Label();
buttonSave = new Button();
buttonCancel = new Button();
SuspendLayout();
//
// textBoxNameDiscipline
//
textBoxNameDiscipline.Location = new Point(228, 42);
textBoxNameDiscipline.Name = "textBoxNameDiscipline";
textBoxNameDiscipline.Size = new Size(214, 27);
textBoxNameDiscipline.TabIndex = 0;
//
// labelNameDiscipline
//
labelNameDiscipline.AutoSize = true;
labelNameDiscipline.Location = new Point(25, 45);
labelNameDiscipline.Name = "labelNameDiscipline";
labelNameDiscipline.Size = new Size(172, 20);
labelNameDiscipline.TabIndex = 1;
labelNameDiscipline.Text = "Название дисциплины:";
//
// buttonSave
//
buttonSave.Location = new Point(25, 131);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(116, 29);
buttonSave.TabIndex = 4;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += ButtonSave_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(326, 131);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(116, 29);
buttonCancel.TabIndex = 5;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += ButtonCancel_Click;
//
// FormDiscipline
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(468, 184);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(labelNameDiscipline);
Controls.Add(textBoxNameDiscipline);
Name = "FormDiscipline";
StartPosition = FormStartPosition.CenterParent;
Text = "Дисциплина";
ResumeLayout(false);
PerformLayout();
}
#endregion
private TextBox textBoxNameDiscipline;
private Label labelNameDiscipline;
private Button buttonSave;
private Button buttonCancel;
}
}

View File

@ -0,0 +1,72 @@
using ProjectSchedule.Entities;
using ProjectSchedule.Repositories;
namespace ProjectSchedule.Forms;
public partial class FormDiscipline : Form
{
private readonly IDisciplineRepository _disciplineRepository;
private int? _disciplineId;
public int Id
{
set
{
try
{
var discipline = _disciplineRepository.ReadDisciplineById(value);
if (discipline == null)
{
throw new InvalidDataException(nameof(discipline));
}
textBoxNameDiscipline.Text = discipline.NameDiscipline;
_disciplineId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormDiscipline(IDisciplineRepository disciplineRepository)
{
InitializeComponent();
_disciplineRepository = disciplineRepository ??
throw new ArgumentNullException(nameof(disciplineRepository));
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxNameDiscipline.Text))
{
throw new Exception("Поле 'Название дисциплины' должно быть заполнено.");
}
if (_disciplineId.HasValue)
{
_disciplineRepository.UpdateDiscipline(CreateDiscipline(_disciplineId.Value));
}
else
{
_disciplineRepository.CreateDiscipline(CreateDiscipline(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCancel_Click(object sender, EventArgs e) => Close();
private Discipline CreateDiscipline(int id) =>
Discipline.CreateEntity(id, textBoxNameDiscipline.Text);
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,127 @@
namespace ProjectSchedule.Forms
{
partial class FormDisciplines
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
panelButtons = new Panel();
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
dataGridViewData = new DataGridView();
panelButtons.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit();
SuspendLayout();
//
// panelButtons
//
panelButtons.Controls.Add(buttonDel);
panelButtons.Controls.Add(buttonUpd);
panelButtons.Controls.Add(buttonAdd);
panelButtons.Dock = DockStyle.Right;
panelButtons.Location = new Point(660, 0);
panelButtons.Name = "panelButtons";
panelButtons.Size = new Size(140, 450);
panelButtons.TabIndex = 1;
//
// buttonDel
//
buttonDel.BackgroundImage = Properties.Resources.Del;
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(24, 194);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(94, 66);
buttonDel.TabIndex = 4;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += ButtonDel_Click;
//
// buttonUpd
//
buttonUpd.BackgroundImage = Properties.Resources.Upd;
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(24, 106);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(94, 66);
buttonUpd.TabIndex = 3;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += ButtonUpd_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.Add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(24, 12);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(94, 66);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// dataGridViewData
//
dataGridViewData.AllowUserToAddRows = false;
dataGridViewData.AllowUserToDeleteRows = false;
dataGridViewData.AllowUserToResizeColumns = false;
dataGridViewData.AllowUserToResizeRows = false;
dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewData.Dock = DockStyle.Fill;
dataGridViewData.Location = new Point(0, 0);
dataGridViewData.MultiSelect = false;
dataGridViewData.Name = "dataGridViewData";
dataGridViewData.ReadOnly = true;
dataGridViewData.RowHeadersVisible = false;
dataGridViewData.RowHeadersWidth = 51;
dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewData.Size = new Size(660, 450);
dataGridViewData.TabIndex = 2;
//
// FormDisciplines
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridViewData);
Controls.Add(panelButtons);
Name = "FormDisciplines";
StartPosition = FormStartPosition.CenterParent;
Text = "Дисциплины";
Load += FormDisciplines_Load;
panelButtons.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panelButtons;
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
private DataGridView dataGridViewData;
}
}

View File

@ -0,0 +1,104 @@
using ProjectSchedule.Repositories;
using Unity;
namespace ProjectSchedule.Forms
{
public partial class FormDisciplines : Form
{
private readonly IUnityContainer _container;
private readonly IDisciplineRepository _disciplineRepository;
public FormDisciplines(IUnityContainer container, IDisciplineRepository disciplineRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_disciplineRepository = disciplineRepository ??
throw new ArgumentNullException(nameof(disciplineRepository));
}
private void FormDisciplines_Load(object sender, EventArgs e)
{
try
{
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormDiscipline>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonUpd_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<FormDiscipline>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonDel_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes)
{
return;
}
try
{
_disciplineRepository.DeleteDiscipline(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewData.DataSource = _disciplineRepository.ReadDisciplines();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewData.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value);
return true;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,140 @@
namespace ProjectSchedule.Forms
{
partial class FormEducator
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
labelSurname = new Label();
labelName = new Label();
labelPatronymic = new Label();
textBoxName = new TextBox();
textBoxSurname = new TextBox();
textBoxPatronymic = new TextBox();
buttonSave = new Button();
buttonCancel = new Button();
SuspendLayout();
//
// labelSurname
//
labelSurname.AutoSize = true;
labelSurname.Location = new Point(21, 30);
labelSurname.Name = "labelSurname";
labelSurname.Size = new Size(76, 20);
labelSurname.TabIndex = 0;
labelSurname.Text = "Фамилия:";
//
// labelName
//
labelName.AutoSize = true;
labelName.Location = new Point(21, 78);
labelName.Name = "labelName";
labelName.Size = new Size(42, 20);
labelName.TabIndex = 1;
labelName.Text = "Имя:";
//
// labelPatronymic
//
labelPatronymic.AutoSize = true;
labelPatronymic.Location = new Point(21, 133);
labelPatronymic.Name = "labelPatronymic";
labelPatronymic.Size = new Size(75, 20);
labelPatronymic.TabIndex = 2;
labelPatronymic.Text = "Отчество:";
//
// textBoxName
//
textBoxName.Location = new Point(161, 75);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(232, 27);
textBoxName.TabIndex = 3;
//
// textBoxSurname
//
textBoxSurname.Location = new Point(161, 27);
textBoxSurname.Name = "textBoxSurname";
textBoxSurname.Size = new Size(232, 27);
textBoxSurname.TabIndex = 4;
//
// textBoxPatronymic
//
textBoxPatronymic.Location = new Point(161, 130);
textBoxPatronymic.Name = "textBoxPatronymic";
textBoxPatronymic.Size = new Size(232, 27);
textBoxPatronymic.TabIndex = 5;
//
// buttonSave
//
buttonSave.Location = new Point(21, 200);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(116, 29);
buttonSave.TabIndex = 6;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += ButtonSave_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(277, 200);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(116, 29);
buttonCancel.TabIndex = 7;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += ButtonCancel_Click;
//
// FormEducator
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(405, 246);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(textBoxPatronymic);
Controls.Add(textBoxSurname);
Controls.Add(textBoxName);
Controls.Add(labelPatronymic);
Controls.Add(labelName);
Controls.Add(labelSurname);
Name = "FormEducator";
StartPosition = FormStartPosition.CenterParent;
Text = "Преподаватель";
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label labelSurname;
private Label labelName;
private Label labelPatronymic;
private TextBox textBoxName;
private TextBox textBoxSurname;
private TextBox textBoxPatronymic;
private Button buttonSave;
private Button buttonCancel;
}
}

View File

@ -0,0 +1,74 @@
using ProjectSchedule.Entities;
using ProjectSchedule.Repositories;
namespace ProjectSchedule.Forms;
public partial class FormEducator : Form
{
private readonly IEducatorRepository _educatorRepository;
private int? _educatorId;
public int Id
{
set
{
try
{
var educator = _educatorRepository.ReadEducatorById(value);
if (educator == null)
{
throw new InvalidDataException(nameof(educator));
}
textBoxSurname.Text = educator.Surname;
textBoxName.Text = educator.Name;
textBoxPatronymic.Text = educator.Patronymic;
_educatorId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormEducator(IEducatorRepository educatorRepository)
{
InitializeComponent();
_educatorRepository = educatorRepository ??
throw new ArgumentNullException(nameof(educatorRepository));
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxSurname.Text) || string.IsNullOrWhiteSpace(textBoxName.Text) ||
string.IsNullOrWhiteSpace(textBoxPatronymic.Text))
{
throw new Exception("Имеются незаполненные поля");
}
if (_educatorId.HasValue)
{
_educatorRepository.UpdateEducator(CreateEducator(_educatorId.Value));
}
else
{
_educatorRepository.CreateEducator(CreateEducator(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCancel_Click(object sender, EventArgs e) => Close();
private Educator CreateEducator(int id) =>
Educator.CreateEntity(id, textBoxSurname.Text, textBoxName.Text, textBoxPatronymic.Text);
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,127 @@
namespace ProjectSchedule.Forms
{
partial class FormEducators
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
panelButtons = new Panel();
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
dataGridViewData = new DataGridView();
panelButtons.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit();
SuspendLayout();
//
// panelButtons
//
panelButtons.Controls.Add(buttonDel);
panelButtons.Controls.Add(buttonUpd);
panelButtons.Controls.Add(buttonAdd);
panelButtons.Dock = DockStyle.Right;
panelButtons.Location = new Point(642, 0);
panelButtons.Name = "panelButtons";
panelButtons.Size = new Size(140, 453);
panelButtons.TabIndex = 1;
//
// buttonDel
//
buttonDel.BackgroundImage = Properties.Resources.Del;
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(24, 194);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(94, 66);
buttonDel.TabIndex = 4;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += ButtonDel_Click;
//
// buttonUpd
//
buttonUpd.BackgroundImage = Properties.Resources.Upd;
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(24, 106);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(94, 66);
buttonUpd.TabIndex = 3;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += ButtonUpd_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.Add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(24, 12);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(94, 66);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// dataGridViewData
//
dataGridViewData.AllowUserToAddRows = false;
dataGridViewData.AllowUserToDeleteRows = false;
dataGridViewData.AllowUserToResizeColumns = false;
dataGridViewData.AllowUserToResizeRows = false;
dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewData.Dock = DockStyle.Fill;
dataGridViewData.Location = new Point(0, 0);
dataGridViewData.MultiSelect = false;
dataGridViewData.Name = "dataGridViewData";
dataGridViewData.ReadOnly = true;
dataGridViewData.RowHeadersVisible = false;
dataGridViewData.RowHeadersWidth = 51;
dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewData.Size = new Size(642, 453);
dataGridViewData.TabIndex = 2;
//
// FormEducators
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(782, 453);
Controls.Add(dataGridViewData);
Controls.Add(panelButtons);
Name = "FormEducators";
StartPosition = FormStartPosition.CenterParent;
Text = "Преподаватели";
Load += FormEducators_Load;
panelButtons.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panelButtons;
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
private DataGridView dataGridViewData;
}
}

View File

@ -0,0 +1,104 @@
using ProjectSchedule.Repositories;
using Unity;
namespace ProjectSchedule.Forms
{
public partial class FormEducators : Form
{
private readonly IUnityContainer _container;
private readonly IEducatorRepository _educatorRepository;
public FormEducators(IUnityContainer container, IEducatorRepository educatorRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_educatorRepository = educatorRepository ??
throw new ArgumentNullException(nameof(educatorRepository));
}
private void FormEducators_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<FormEducator>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonUpd_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<FormEducator>();
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
{
_educatorRepository.DeleteEducator(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewData.DataSource = _educatorRepository.ReadEducators();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewData.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value);
return true;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,145 @@
namespace ProjectSchedule.Forms
{
partial class FormGroupStudents
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
labelAbbreviationGroup = new Label();
labelGroupNumber = new Label();
labelQuantityStudents = new Label();
numericUpDownQuantityStudents = new NumericUpDown();
textBoxAbbreviationGroup = new TextBox();
textBoxGroupNumber = new TextBox();
buttonSave = new Button();
buttonCancel = new Button();
((System.ComponentModel.ISupportInitialize)numericUpDownQuantityStudents).BeginInit();
SuspendLayout();
//
// labelAbbreviationGroup
//
labelAbbreviationGroup.AutoSize = true;
labelAbbreviationGroup.Location = new Point(12, 28);
labelAbbreviationGroup.Name = "labelAbbreviationGroup";
labelAbbreviationGroup.Size = new Size(167, 20);
labelAbbreviationGroup.TabIndex = 0;
labelAbbreviationGroup.Text = "Аббревиатура группы:";
//
// labelGroupNumber
//
labelGroupNumber.AutoSize = true;
labelGroupNumber.Location = new Point(12, 74);
labelGroupNumber.Name = "labelGroupNumber";
labelGroupNumber.Size = new Size(115, 20);
labelGroupNumber.TabIndex = 1;
labelGroupNumber.Text = "Номер группы:";
//
// labelQuantityStudents
//
labelQuantityStudents.AutoSize = true;
labelQuantityStudents.Location = new Point(12, 123);
labelQuantityStudents.Name = "labelQuantityStudents";
labelQuantityStudents.Size = new Size(165, 20);
labelQuantityStudents.TabIndex = 2;
labelQuantityStudents.Text = "Количество студентов:";
//
// numericUpDownQuantityStudents
//
numericUpDownQuantityStudents.Location = new Point(213, 121);
numericUpDownQuantityStudents.Maximum = new decimal(new int[] { 66, 0, 0, 0 });
numericUpDownQuantityStudents.Minimum = new decimal(new int[] { 2, 0, 0, 0 });
numericUpDownQuantityStudents.Name = "numericUpDownQuantityStudents";
numericUpDownQuantityStudents.Size = new Size(176, 27);
numericUpDownQuantityStudents.TabIndex = 3;
numericUpDownQuantityStudents.Value = new decimal(new int[] { 2, 0, 0, 0 });
//
// textBoxAbbreviationGroup
//
textBoxAbbreviationGroup.Location = new Point(213, 25);
textBoxAbbreviationGroup.Name = "textBoxAbbreviationGroup";
textBoxAbbreviationGroup.Size = new Size(176, 27);
textBoxAbbreviationGroup.TabIndex = 4;
//
// textBoxGroupNumber
//
textBoxGroupNumber.Location = new Point(213, 71);
textBoxGroupNumber.Name = "textBoxGroupNumber";
textBoxGroupNumber.Size = new Size(176, 27);
textBoxGroupNumber.TabIndex = 5;
//
// buttonSave
//
buttonSave.Location = new Point(12, 189);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(116, 29);
buttonSave.TabIndex = 7;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += ButtonSave_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(273, 189);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(116, 29);
buttonCancel.TabIndex = 8;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += ButtonCancel_Click;
//
// FormGroupStudents
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(401, 230);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(textBoxGroupNumber);
Controls.Add(textBoxAbbreviationGroup);
Controls.Add(numericUpDownQuantityStudents);
Controls.Add(labelQuantityStudents);
Controls.Add(labelGroupNumber);
Controls.Add(labelAbbreviationGroup);
Name = "FormGroupStudents";
StartPosition = FormStartPosition.CenterParent;
Text = "Группа студентов";
((System.ComponentModel.ISupportInitialize)numericUpDownQuantityStudents).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label labelAbbreviationGroup;
private Label labelGroupNumber;
private Label labelQuantityStudents;
private NumericUpDown numericUpDownQuantityStudents;
private TextBox textBoxAbbreviationGroup;
private TextBox textBoxGroupNumber;
private Button buttonSave;
private Button buttonCancel;
}
}

View File

@ -0,0 +1,74 @@
using ProjectSchedule.Entities;
using ProjectSchedule.Repositories;
namespace ProjectSchedule.Forms;
public partial class FormGroupStudents : Form
{
private readonly IGroupStudentsRepository _groupStudentsRepository;
private int? _groupStudentsId;
public int Id
{
set
{
try
{
var groupStudents = _groupStudentsRepository.ReadGroupStudentsById(value);
if (groupStudents == null)
{
throw new InvalidDataException(nameof(groupStudents));
}
textBoxAbbreviationGroup.Text = groupStudents.AbbreviationGroup;
textBoxGroupNumber.Text = groupStudents.GroupNumber;
numericUpDownQuantityStudents.Value = groupStudents.QuantityStudents;
_groupStudentsId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormGroupStudents(IGroupStudentsRepository groupStudentsRepository)
{
InitializeComponent();
_groupStudentsRepository = groupStudentsRepository ??
throw new ArgumentNullException(nameof(groupStudentsRepository));
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxAbbreviationGroup.Text) || string.IsNullOrWhiteSpace(textBoxGroupNumber.Text))
{
throw new Exception("Имеются незаполненные поля");
}
if (_groupStudentsId.HasValue)
{
_groupStudentsRepository.UpdateGroupStudents(CreateGroupOfStudents(_groupStudentsId.Value));
}
else
{
_groupStudentsRepository.CreateGroupStudents(CreateGroupOfStudents(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonCancel_Click(object sender, EventArgs e) => Close();
private GroupStudents CreateGroupOfStudents(int id) =>
GroupStudents.CreateEntity(id, textBoxAbbreviationGroup.Text, textBoxGroupNumber.Text, Convert.ToInt32(numericUpDownQuantityStudents.Value));
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,127 @@
namespace ProjectSchedule.Forms
{
partial class FormGroupsStudents
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
panelButtons = new Panel();
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
dataGridViewData = new DataGridView();
panelButtons.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit();
SuspendLayout();
//
// panelButtons
//
panelButtons.Controls.Add(buttonDel);
panelButtons.Controls.Add(buttonUpd);
panelButtons.Controls.Add(buttonAdd);
panelButtons.Dock = DockStyle.Right;
panelButtons.Location = new Point(660, 0);
panelButtons.Name = "panelButtons";
panelButtons.Size = new Size(140, 450);
panelButtons.TabIndex = 2;
//
// buttonDel
//
buttonDel.BackgroundImage = Properties.Resources.Del;
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(24, 194);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(94, 66);
buttonDel.TabIndex = 4;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += ButtonDel_Click;
//
// buttonUpd
//
buttonUpd.BackgroundImage = Properties.Resources.Upd;
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(24, 106);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(94, 66);
buttonUpd.TabIndex = 3;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += ButtonUpd_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.Add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(24, 12);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(94, 66);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// dataGridViewData
//
dataGridViewData.AllowUserToAddRows = false;
dataGridViewData.AllowUserToDeleteRows = false;
dataGridViewData.AllowUserToResizeColumns = false;
dataGridViewData.AllowUserToResizeRows = false;
dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewData.Dock = DockStyle.Fill;
dataGridViewData.Location = new Point(0, 0);
dataGridViewData.MultiSelect = false;
dataGridViewData.Name = "dataGridViewData";
dataGridViewData.ReadOnly = true;
dataGridViewData.RowHeadersVisible = false;
dataGridViewData.RowHeadersWidth = 51;
dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewData.Size = new Size(660, 450);
dataGridViewData.TabIndex = 3;
//
// FormGroupsStudents
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridViewData);
Controls.Add(panelButtons);
Name = "FormGroupsStudents";
StartPosition = FormStartPosition.CenterParent;
Text = "Группы студентов";
Load += FormGroupsStudents_Load;
panelButtons.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panelButtons;
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
private DataGridView dataGridViewData;
}
}

View File

@ -0,0 +1,104 @@
using ProjectSchedule.Repositories;
using Unity;
namespace ProjectSchedule.Forms
{
public partial class FormGroupsStudents : Form
{
private readonly IUnityContainer _container;
private readonly IGroupStudentsRepository _groupStudentsRepository;
public FormGroupsStudents(IUnityContainer container, IGroupStudentsRepository groupStudentsRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_groupStudentsRepository = groupStudentsRepository ??
throw new ArgumentNullException(nameof(groupStudentsRepository));
}
private void FormGroupsStudents_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<FormGroupStudents>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonUpd_Click(object sender, EventArgs e)
{
if (!TryGetIdentifierFromSelectedRow(out var findId))
{
return;
}
try
{
var form = _container.Resolve<FormGroupStudents>();
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
{
_groupStudentsRepository.DeleteGroupStudents(findId);
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewData.DataSource = _groupStudentsRepository.ReadGroupsStudents();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewData.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value);
return true;
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -1,3 +1,12 @@
using Unity.Lifetime;
using Unity;
using ProjectSchedule.Repositories;
using ProjectSchedule.Repositories.Implementations;
using Microsoft.Extensions.Logging;
using Serilog;
using Microsoft.Extensions.Configuration;
using Unity.Microsoft.Logging;
namespace ProjectSchedule
{
internal static class Program
@ -11,7 +20,37 @@ namespace ProjectSchedule
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
Application.Run(CreateContainer().Resolve<FormSchedule>());
}
private static IUnityContainer CreateContainer()
{
var container = new UnityContainer();
container.AddExtension(new LoggingExtension(CreateLoggerFactory()));
container.RegisterType<IAudienceRepository, AudienceRepository>(new TransientLifetimeManager());
container.RegisterType<ICurriculumSupplementRepository, CurriculumSupplementRepository>(new TransientLifetimeManager());
container.RegisterType<IDisciplineRepository, DisciplineRepository>(new TransientLifetimeManager());
container.RegisterType<IEducatorRepository, EducatorRepository>(new TransientLifetimeManager());
container.RegisterType<IGroupStudentsRepository, GroupStudentsRepository>(new TransientLifetimeManager());
container.RegisterType<ICompilingScheduleRepository, CompilingScheduleRepository>(new TransientLifetimeManager());
container.RegisterType<IConnectionString, ConnectionString>(new SingletonLifetimeManager());
return container;
}
private static LoggerFactory CreateLoggerFactory()
{
var loggerFactory = new LoggerFactory();
loggerFactory.AddSerilog(new LoggerConfiguration()
.ReadFrom.Configuration(new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build())
.CreateLogger());
return loggerFactory;
}
}
}

View File

@ -8,4 +8,40 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.1.35" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Npgsql" Version="8.0.5" />
<PackageReference Include="Serilog" Version="4.1.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.4" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Unity" Version="5.11.10" />
<PackageReference Include="Unity.Microsoft.Logging" Version="5.11.1" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -0,0 +1,103 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace ProjectSchedule.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ProjectSchedule.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Add {
get {
object obj = ResourceManager.GetObject("Add", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Del {
get {
object obj = ResourceManager.GetObject("Del", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Upd {
get {
object obj = ResourceManager.GetObject("Upd", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap Расписаниеаон {
get {
object obj = ResourceManager.GetObject("Расписание на фон", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Расписание на фон" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Расписание на фон.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Upd" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Upd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Del" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Del.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Add" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Add.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@ -0,0 +1,16 @@
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories;
public interface IAudienceRepository
{
IEnumerable<Audience> ReadAudiences();
Audience ReadAudienceById(int id);
void CreateAudience(Audience audience);
void UpdateAudience(Audience audience);
void DeleteAudience(int id);
}

View File

@ -0,0 +1,11 @@
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories;
public interface ICompilingScheduleRepository
{
IEnumerable<CompilingSchedule> ReadCompilingSchedules(int? educatorId = null, int? disciplineId = null,
int? groupStudentsId = null, int? audienceId = null);
void CreateCompilingSchedule(CompilingSchedule compilingSchedule);
}

View File

@ -0,0 +1,6 @@
namespace ProjectSchedule.Repositories;
public interface IConnectionString
{
public string ConnectionString { get; }
}

View File

@ -0,0 +1,13 @@
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories;
public interface ICurriculumSupplementRepository
{
IEnumerable<CurriculumSupplement> ReadCurriculumSupplements(DateTime? dateForm = null, DateTime? dateTo = null,
int? disciplineId = null, int? groupStudentsId = null);
void CreateCurriculumSupplement(CurriculumSupplement curriculumSupplement);
void DeleteCurriculumSupplement(int id);
}

View File

@ -0,0 +1,16 @@
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories;
public interface IDisciplineRepository
{
IEnumerable<Discipline> ReadDisciplines();
Discipline ReadDisciplineById(int id);
void CreateDiscipline(Discipline discipline);
void UpdateDiscipline(Discipline discipline);
void DeleteDiscipline(int id);
}

View File

@ -0,0 +1,16 @@
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories;
public interface IEducatorRepository
{
IEnumerable<Educator> ReadEducators();
Educator ReadEducatorById(int id);
void CreateEducator(Educator educator);
void UpdateEducator(Educator educator);
void DeleteEducator(int id);
}

View File

@ -0,0 +1,16 @@
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories;
public interface IGroupStudentsRepository
{
IEnumerable<GroupStudents> ReadGroupsStudents();
GroupStudents ReadGroupStudentsById(int id);
void CreateGroupStudents(GroupStudents groupStudents);
void UpdateGroupStudents(GroupStudents groupStudents);
void DeleteGroupStudents(int id);
}

View File

@ -0,0 +1,120 @@
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories.Implementations;
public class AudienceRepository : IAudienceRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<AudienceRepository> _logger;
public AudienceRepository(IConnectionString connectionString, ILogger<AudienceRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateAudience(Audience audience)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(audience));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryInsert = @"
INSERT INTO Audiences (NumberAudience, TypeAudience, QuantitySeats)
VALUES (@NumberAudience, @TypeAudience, @QuantitySeats)";
connection.Execute(queryInsert, audience);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void UpdateAudience(Audience audience)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(audience));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryUpdate = @"
UPDATE Audiences
SET
NumberAudience=@NumberAudience,
TypeAudience=@TypeAudience,
QuantitySeats=@QuantitySeats
WHERE Id=@Id";
connection.Execute(queryUpdate, audience);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
public void DeleteAudience(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM Audiences
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public Audience ReadAudienceById(int id)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT * FROM Audiences
WHERE Id=@id";
var audience = connection.QueryFirst<Audience>(querySelect, new { id });
_logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(audience));
return audience;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при поиске объекта");
throw;
}
}
public IEnumerable<Audience> ReadAudiences()
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM Audiences";
var audiences = connection.Query<Audience>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(audiences));
return audiences;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

View File

@ -0,0 +1,60 @@
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories.Implementations;
public class CompilingScheduleRepository : ICompilingScheduleRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<CompilingScheduleRepository> _logger;
public CompilingScheduleRepository(IConnectionString connectionString, ILogger<CompilingScheduleRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateCompilingSchedule(CompilingSchedule compilingSchedule)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(compilingSchedule));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryInsert = @"
INSERT INTO CompilingSchedules (EducatorId, DisciplineId, GroupStudentsId, AudienceId,
TypeWeek, NumberDay, NumberPair, TypeActivity)
VALUES (@EducatorId, @DisciplineId, @GroupStudentsId, @AudienceId,
@TypeWeek, @NumberDay, @NumberPair, @TypeActivity)";
connection.Execute(queryInsert, compilingSchedule);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public IEnumerable<CompilingSchedule> ReadCompilingSchedules(int? educatorId = null, int? disciplineId = null,
int? groupStudentsId = null, int? audienceId = null)
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM CompilingSchedules";
var compilingSchedules = connection.Query<CompilingSchedule>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(compilingSchedules));
return compilingSchedules;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

View File

@ -0,0 +1,6 @@
namespace ProjectSchedule.Repositories.Implementations;
internal class ConnectionString : IConnectionString
{
string IConnectionString.ConnectionString => "Host=127.0.0.1;Database=schedule;Username=postgres;Password=732005";
}

View File

@ -0,0 +1,90 @@
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories.Implementations;
public class CurriculumSupplementRepository : ICurriculumSupplementRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<CurriculumSupplementRepository> _logger;
public CurriculumSupplementRepository(IConnectionString connectionString, ILogger<CurriculumSupplementRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateCurriculumSupplement(CurriculumSupplement curriculumSupplement)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(curriculumSupplement));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
using var transaction = connection.BeginTransaction();
var queryInsert = @"
INSERT INTO CurriculumSupplements (GroupStudentsId, NameCurriculum, Semester, DateAdoptionPlan)
VALUES (@GroupStudentsId, @NameCurriculum, @Semester, @DateAdoptionPlan);
SELECT MAX(Id) FROM CurriculumSupplements";
var curriculumSupplementId = connection.QueryFirst<int>(queryInsert, curriculumSupplement, transaction);
var querySubInsert = @"
INSERT INTO DisciplineCurriculumSupplements (CurriculumSupplementId, DisciplineId, QuantityLectures, QuantityPractices)
VALUES (@CurriculumSupplementId, @DisciplineId, @QuantityLectures, @QuantityPractices)";
foreach (var elem in curriculumSupplement.DisciplineCurriculumSupplements)
{
connection.Execute(querySubInsert, new { curriculumSupplementId, elem.DisciplineId, elem.QuantityLectures, elem.QuantityPractices }, transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void DeleteCurriculumSupplement(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM CurriculumSupplements
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public IEnumerable<CurriculumSupplement> ReadCurriculumSupplements(DateTime? dateForm = null, DateTime? dateTo = null,
int? disciplineId = null, int? groupStudentsId = null)
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM CurriculumSupplements";
var curriculumSupplements = connection.Query<CurriculumSupplement>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(curriculumSupplements));
return curriculumSupplements;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

View File

@ -0,0 +1,118 @@
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories.Implementations;
public class DisciplineRepository : IDisciplineRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<DisciplineRepository> _logger;
public DisciplineRepository(IConnectionString connectionString, ILogger<DisciplineRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateDiscipline(Discipline discipline)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(discipline));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryInsert = @"
INSERT INTO Disciplines (NameDiscipline)
VALUES (@NameDiscipline)";
connection.Execute(queryInsert, discipline);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void UpdateDiscipline(Discipline discipline)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(discipline));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryUpdate = @"
UPDATE Disciplines
SET
NameDiscipline=@NameDiscipline
WHERE Id=@Id";
connection.Execute(queryUpdate, discipline);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
public void DeleteDiscipline(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM Disciplines
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public Discipline ReadDisciplineById(int id)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT * FROM Disciplines
WHERE Id=@id";
var discipline = connection.QueryFirst<Discipline>(querySelect, new { id });
_logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(discipline));
return discipline;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при поиске объекта");
throw;
}
}
public IEnumerable<Discipline> ReadDisciplines()
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM Disciplines";
var disciplines = connection.Query<Discipline>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(disciplines));
return disciplines;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

View File

@ -0,0 +1,120 @@
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories.Implementations;
public class EducatorRepository : IEducatorRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<EducatorRepository> _logger;
public EducatorRepository(IConnectionString connectionString, ILogger<EducatorRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateEducator(Educator educator)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(educator));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryInsert = @"
INSERT INTO Educators (Surname, Name, Patronymic)
VALUES (@Surname, @Name, @Patronymic)";
connection.Execute(queryInsert, educator);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void UpdateEducator(Educator educator)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(educator));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryUpdate = @"
UPDATE Educators
SET
Surname=@Surname,
Name=@Name,
Patronymic=@Patronymic
WHERE Id=@Id";
connection.Execute(queryUpdate, educator);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
public void DeleteEducator(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM Educators
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public Educator ReadEducatorById(int id)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT * FROM Educators
WHERE Id=@id";
var educator = connection.QueryFirst<Educator>(querySelect, new { id });
_logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(educator));
return educator;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при поиске объекта");
throw;
}
}
public IEnumerable<Educator> ReadEducators()
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM Educators";
var educators = connection.Query<Educator>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(educators));
return educators;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

View File

@ -0,0 +1,120 @@
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
using ProjectSchedule.Entities;
namespace ProjectSchedule.Repositories.Implementations;
public class GroupStudentsRepository : IGroupStudentsRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<GroupStudentsRepository> _logger;
public GroupStudentsRepository(IConnectionString connectionString, ILogger<GroupStudentsRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateGroupStudents(GroupStudents groupStudents)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(groupStudents));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryInsert = @"
INSERT INTO GroupsStudents (AbbreviationGroup, GroupNumber, QuantityStudents)
VALUES (@AbbreviationGroup, @GroupNumber, @QuantityStudents)";
connection.Execute(queryInsert, groupStudents);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void UpdateGroupStudents(GroupStudents groupStudents)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(groupStudents));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryUpdate = @"
UPDATE GroupsStudents
SET
AbbreviationGroup=@AbbreviationGroup,
GroupNumber=@GroupNumber,
QuantityStudents=@QuantityStudents
WHERE Id=@Id";
connection.Execute(queryUpdate, groupStudents);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
public void DeleteGroupStudents(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM GroupsStudents
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public GroupStudents ReadGroupStudentsById(int id)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT * FROM GroupsStudents
WHERE Id=@id";
var groupStudents = connection.QueryFirst<GroupStudents>(querySelect, new { id });
_logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(groupStudents));
return groupStudents;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при поиске объекта");
throw;
}
}
public IEnumerable<GroupStudents> ReadGroupsStudents()
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM GroupsStudents";
var groupsStudents = connection.Query<GroupStudents>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(groupsStudents));
return groupsStudents;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,15 @@
{
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/schedule_log.txt",
"rollingInterval": "Day"
}
}
]
}
}