Добавьте файлы проекта.

This commit is contained in:
Marselchi 2024-05-04 01:10:09 +04:00
parent 1b8a1a795a
commit 9b56b9e0f5
85 changed files with 7000 additions and 0 deletions

49
Journal.sln Normal file
View File

@ -0,0 +1,49 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34714.143
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JournalView", "Journal\JournalView.csproj", "{2B4A5A98-6D06-4461-8D41-363CED12B9C2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JournalDataModels", "JournalDataModels\JournalDataModels.csproj", "{C373ED9F-747E-47D0-9B7C-B65E062CD537}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JournalContracts", "JournalContracts\JournalContracts.csproj", "{1FD289B3-1422-4535-8969-2F320754517B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JournalBusinessLogic", "JournalBusinessLogic\JournalBusinessLogic.csproj", "{9CB0FFA6-FA25-440C-8B6A-B6DF2F0639F5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "JournalDatabaseImplement", "JournalDatabaseImplement\JournalDatabaseImplement.csproj", "{E62F051D-30D6-4F1C-B02E-C814B7D03F86}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2B4A5A98-6D06-4461-8D41-363CED12B9C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2B4A5A98-6D06-4461-8D41-363CED12B9C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2B4A5A98-6D06-4461-8D41-363CED12B9C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2B4A5A98-6D06-4461-8D41-363CED12B9C2}.Release|Any CPU.Build.0 = Release|Any CPU
{C373ED9F-747E-47D0-9B7C-B65E062CD537}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C373ED9F-747E-47D0-9B7C-B65E062CD537}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C373ED9F-747E-47D0-9B7C-B65E062CD537}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C373ED9F-747E-47D0-9B7C-B65E062CD537}.Release|Any CPU.Build.0 = Release|Any CPU
{1FD289B3-1422-4535-8969-2F320754517B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1FD289B3-1422-4535-8969-2F320754517B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1FD289B3-1422-4535-8969-2F320754517B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1FD289B3-1422-4535-8969-2F320754517B}.Release|Any CPU.Build.0 = Release|Any CPU
{9CB0FFA6-FA25-440C-8B6A-B6DF2F0639F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9CB0FFA6-FA25-440C-8B6A-B6DF2F0639F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9CB0FFA6-FA25-440C-8B6A-B6DF2F0639F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9CB0FFA6-FA25-440C-8B6A-B6DF2F0639F5}.Release|Any CPU.Build.0 = Release|Any CPU
{E62F051D-30D6-4F1C-B02E-C814B7D03F86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E62F051D-30D6-4F1C-B02E-C814B7D03F86}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E62F051D-30D6-4F1C-B02E-C814B7D03F86}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E62F051D-30D6-4F1C-B02E-C814B7D03F86}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {86A1AF32-AD3E-4D5E-B57B-4AE61FD58DF7}
EndGlobalSection
EndGlobal

149
Journal/FormGrade.Designer.cs generated Normal file
View File

@ -0,0 +1,149 @@
namespace JournalView
{
partial class FormGrade
{
/// <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()
{
label1 = new Label();
label2 = new Label();
buttonCancel = new Button();
buttonSave = new Button();
textBoxMark = new TextBox();
comboBoxSubject = new ComboBox();
comboBoxType = new ComboBox();
label3 = new Label();
SuspendLayout();
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(14, 12);
label1.Name = "label1";
label1.Size = new Size(70, 20);
label1.TabIndex = 0;
label1.Text = "Предмет";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(15, 92);
label2.Name = "label2";
label2.Size = new Size(61, 20);
label2.TabIndex = 1;
label2.Text = "Оценка";
//
// buttonCancel
//
buttonCancel.Location = new Point(269, 139);
buttonCancel.Margin = new Padding(3, 4, 3, 4);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(103, 35);
buttonCancel.TabIndex = 12;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += buttonCancel_Click;
//
// buttonSave
//
buttonSave.Location = new Point(159, 139);
buttonSave.Margin = new Padding(3, 4, 3, 4);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(103, 35);
buttonSave.TabIndex = 11;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += buttonSave_Click;
//
// textBoxMark
//
textBoxMark.Location = new Point(88, 88);
textBoxMark.Margin = new Padding(3, 4, 3, 4);
textBoxMark.Name = "textBoxMark";
textBoxMark.Size = new Size(284, 27);
textBoxMark.TabIndex = 9;
//
// comboBoxSubject
//
comboBoxSubject.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxSubject.FormattingEnabled = true;
comboBoxSubject.Location = new Point(88, 8);
comboBoxSubject.Margin = new Padding(3, 4, 3, 4);
comboBoxSubject.Name = "comboBoxSubject";
comboBoxSubject.Size = new Size(284, 28);
comboBoxSubject.TabIndex = 8;
//
// comboBoxType
//
comboBoxType.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxType.FormattingEnabled = true;
comboBoxType.Location = new Point(88, 52);
comboBoxType.Margin = new Padding(3, 4, 3, 4);
comboBoxType.Name = "comboBoxType";
comboBoxType.Size = new Size(284, 28);
comboBoxType.TabIndex = 14;
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(14, 56);
label3.Name = "label3";
label3.Size = new Size(39, 20);
label3.TabIndex = 13;
label3.Text = "Тип ";
//
// FormGrade
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(422, 201);
Controls.Add(comboBoxType);
Controls.Add(label3);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(textBoxMark);
Controls.Add(comboBoxSubject);
Controls.Add(label2);
Controls.Add(label1);
Margin = new Padding(3, 4, 3, 4);
Name = "FormGrade";
Text = "Оценка";
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label1;
private Label label2;
private Button buttonCancel;
private Button buttonSave;
private TextBox textBoxMark;
private ComboBox comboBoxSubject;
private ComboBox comboBoxType;
private Label label3;
}
}

99
Journal/FormGrade.cs Normal file
View File

@ -0,0 +1,99 @@
using JournalContracts.BusinessLogicContracts;
using JournalContracts.ViewModels;
using JournalDataModels.Enum;
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace JournalView
{
public partial class FormGrade : Form
{
private readonly List<SubjectViewModel>? _list;
public int Id { get { return Convert.ToInt32(comboBoxSubject.SelectedValue); } set { comboBoxSubject.SelectedValue = value; } }
public ISubjectModel? SubjectModel
{
get
{
if (_list == null)
{
return null;
}
foreach (var elem in _list)
{
if (elem.Id == Id)
{
return elem;
}
}
return null;
}
}
public ExamType Type { get { return (ExamType)comboBoxType.SelectedIndex; } set {
comboBoxType.SelectedValue = (int)value;
Console.WriteLine(value.ToString());
} }
public int Mark { get { return Convert.ToInt32(textBoxMark.Text); } set { textBoxMark.Text = value.ToString(); } }
public FormGrade(ISubjectLogic logic)
{
InitializeComponent();
_list = logic.ReadList(null);
if (_list != null)
{
comboBoxSubject.DisplayMember = "SubjectName";
comboBoxSubject.ValueMember = "Id";
comboBoxSubject.DataSource = _list;
comboBoxSubject.SelectedItem = null;
}
List<KOSTILISHE> kostil = new List<KOSTILISHE>();
foreach (ExamType value in Enum.GetValues(typeof(ExamType)))
{
kostil.Add(new KOSTILISHE (value));
}
comboBoxType.DisplayMember = "pole";
comboBoxType.ValueMember = "pomogi";
comboBoxType.DataSource = kostil;
comboBoxType.SelectedItem = null;
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxMark.Text))
{
MessageBox.Show("Заполните поле Оценка", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (comboBoxSubject.SelectedValue == null)
{
MessageBox.Show("Выберите предмет", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (comboBoxType.SelectedValue == null)
{
MessageBox.Show("Выберите тип", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
DialogResult = DialogResult.OK;
Close();
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}

120
Journal/FormGrade.resx Normal file
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>

123
Journal/FormGroup.Designer.cs generated Normal file
View File

@ -0,0 +1,123 @@
namespace JournalView
{
partial class FormGroup
{
/// <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()
{
label1 = new Label();
label2 = new Label();
textBoxName = new TextBox();
textBoxCourse = new TextBox();
buttonCancel = new Button();
buttonSave = new Button();
SuspendLayout();
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(14, 12);
label1.Name = "label1";
label1.Size = new Size(77, 20);
label1.TabIndex = 0;
label1.Text = "Название";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(14, 62);
label2.Name = "label2";
label2.Size = new Size(41, 20);
label2.TabIndex = 1;
label2.Text = "Курс";
//
// textBoxName
//
textBoxName.Location = new Point(103, 8);
textBoxName.Margin = new Padding(3, 4, 3, 4);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(249, 27);
textBoxName.TabIndex = 2;
//
// textBoxCourse
//
textBoxCourse.Location = new Point(103, 55);
textBoxCourse.Margin = new Padding(3, 4, 3, 4);
textBoxCourse.Name = "textBoxCourse";
textBoxCourse.Size = new Size(249, 27);
textBoxCourse.TabIndex = 3;
//
// buttonCancel
//
buttonCancel.Location = new Point(264, 104);
buttonCancel.Margin = new Padding(3, 4, 3, 4);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(88, 40);
buttonCancel.TabIndex = 7;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += buttonCancel_Click;
//
// buttonSave
//
buttonSave.Location = new Point(169, 104);
buttonSave.Margin = new Padding(3, 4, 3, 4);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(95, 40);
buttonSave.TabIndex = 6;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += buttonSave_Click;
//
// FormGroup
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(367, 158);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(textBoxCourse);
Controls.Add(textBoxName);
Controls.Add(label2);
Controls.Add(label1);
Margin = new Padding(3, 4, 3, 4);
Name = "FormGroup";
Text = "Группа";
Load += FormMenu_Load;
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label1;
private Label label2;
private TextBox textBoxName;
private TextBox textBoxCourse;
private Button buttonCancel;
private Button buttonSave;
}
}

86
Journal/FormGroup.cs Normal file
View File

@ -0,0 +1,86 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.SearchModels;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace JournalView
{
public partial class FormGroup : Form
{
private readonly IGroupLogic _logic;
private int? _id;
public int Id { set { _id = value; } }
public FormGroup(IGroupLogic logic)
{
InitializeComponent();
_logic = logic;
}
private void FormMenu_Load(object sender, EventArgs e)
{
if (_id.HasValue)
{
try
{
var view = _logic.ReadElement(new GroupSearchModel { Id = _id.Value });
if (view != null)
{
textBoxName.Text = view.GroupName;
textBoxCourse.Text = view.Course.ToString();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxName.Text) || string.IsNullOrEmpty(textBoxCourse.Text))
{
MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
var model = new GroupBindingModel
{
Id = _id ?? 0,
GroupName = textBoxName.Text,
Course = Convert.ToInt32(textBoxCourse.Text),
};
var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model);
if (!operationResult)
{
throw new Exception("Ошибка при сохранении. Доп информация в логах.");
}
MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}

120
Journal/FormGroup.resx Normal file
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>

112
Journal/FormGroups.Designer.cs generated Normal file
View File

@ -0,0 +1,112 @@
namespace JournalView
{
partial class FormGroups
{
/// <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()
{
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
dataGridView = new DataGridView();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// buttonDel
//
buttonDel.Location = new Point(625, 151);
buttonDel.Margin = new Padding(3, 4, 3, 4);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(135, 47);
buttonDel.TabIndex = 7;
buttonDel.Text = "Удалить";
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonUpd
//
buttonUpd.Location = new Point(625, 83);
buttonUpd.Margin = new Padding(3, 4, 3, 4);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(135, 47);
buttonUpd.TabIndex = 6;
buttonUpd.Text = "Изменить";
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonAdd
//
buttonAdd.Location = new Point(625, 16);
buttonAdd.Margin = new Padding(3, 4, 3, 4);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(135, 47);
buttonAdd.TabIndex = 5;
buttonAdd.Text = "Добавить";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridView
//
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.BackgroundColor = Color.White;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Left;
dataGridView.Location = new Point(0, 0);
dataGridView.Margin = new Padding(3, 4, 3, 4);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(563, 600);
dataGridView.TabIndex = 4;
//
// FormGroups
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(811, 600);
Controls.Add(buttonDel);
Controls.Add(buttonUpd);
Controls.Add(buttonAdd);
Controls.Add(dataGridView);
Margin = new Padding(3, 4, 3, 4);
Name = "FormGroups";
Text = "Группы";
Load += FormGroups_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
private DataGridView dataGridView;
}
}

100
Journal/FormGroups.cs Normal file
View File

@ -0,0 +1,100 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalView;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace JournalView
{
public partial class FormGroups : Form
{
private readonly IGroupLogic _logic;
public FormGroups(IGroupLogic logic)
{
InitializeComponent();
_logic = logic;
}
private void FormGroups_Load(object sender, EventArgs e)
{
LoadData();
}
private void LoadData()
{
try
{
var list = _logic.ReadList(null);
if (list != null)
{
dataGridView.DataSource = list;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormGroup));
if (service is FormGroup form)
{
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
private void buttonUpd_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
var service = Program.ServiceProvider?.GetService(typeof(FormGroup));
if (service is FormGroup form)
{
form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
}
private void buttonDel_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
try
{
if (!_logic.Delete(new GroupBindingModel { Id = id }))
{
throw new Exception("Ошибка при удалении. Доп информация в логах");
}
LoadData();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
}

120
Journal/FormGroups.resx Normal file
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>

259
Journal/FormMain.Designer.cs generated Normal file
View File

@ -0,0 +1,259 @@
namespace SushiBarView
{
partial class FormMain
{
/// <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()
{
menuStrip1 = new MenuStrip();
объектыToolStripMenuItem = new ToolStripMenuItem();
studentToolStripMenuItem = new ToolStripMenuItem();
teacherToolStripMenuItem = new ToolStripMenuItem();
groupToolStripMenuItem = new ToolStripMenuItem();
subjectToolStripMenuItem = new ToolStripMenuItem();
buttonTestGroup100 = new Button();
buttonTestSubject100 = new Button();
buttonTestTeacher100 = new Button();
buttonTestStudent1000 = new Button();
dataGridView = new DataGridView();
buttonTestJoinGroups = new Button();
buttonTestStudentD1000 = new Button();
buttonTestTeacherD100 = new Button();
buttonTestSubjectD100 = new Button();
buttonTestGroupD100 = new Button();
menuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// menuStrip1
//
menuStrip1.ImageScalingSize = new Size(20, 20);
menuStrip1.Items.AddRange(new ToolStripItem[] { объектыToolStripMenuItem });
menuStrip1.Location = new Point(0, 0);
menuStrip1.Name = "menuStrip1";
menuStrip1.Padding = new Padding(7, 3, 0, 3);
menuStrip1.Size = new Size(1387, 30);
menuStrip1.TabIndex = 0;
menuStrip1.Text = "menuStrip1";
//
// объектыToolStripMenuItem
//
объектыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { studentToolStripMenuItem, teacherToolStripMenuItem, groupToolStripMenuItem, subjectToolStripMenuItem });
объектыToolStripMenuItem.Name = "объектыToolStripMenuItem";
объектыToolStripMenuItem.Size = new Size(84, 24);
объектыToolStripMenuItem.Text = "Объекты";
//
// studentToolStripMenuItem
//
studentToolStripMenuItem.Name = "studentToolStripMenuItem";
studentToolStripMenuItem.Size = new Size(200, 26);
studentToolStripMenuItem.Text = "Студент";
studentToolStripMenuItem.Click += studentToolStripMenuItem_Click;
//
// teacherToolStripMenuItem
//
teacherToolStripMenuItem.Name = "teacherToolStripMenuItem";
teacherToolStripMenuItem.Size = new Size(200, 26);
teacherToolStripMenuItem.Text = "Преподаватель";
teacherToolStripMenuItem.Click += teacherToolStripMenuItem_Click;
//
// groupToolStripMenuItem
//
groupToolStripMenuItem.Name = "groupToolStripMenuItem";
groupToolStripMenuItem.Size = new Size(200, 26);
groupToolStripMenuItem.Text = "Группа";
groupToolStripMenuItem.Click += groupToolStripMenuItem_Click;
//
// subjectToolStripMenuItem
//
subjectToolStripMenuItem.Name = "subjectToolStripMenuItem";
subjectToolStripMenuItem.Size = new Size(200, 26);
subjectToolStripMenuItem.Text = "Предмет";
subjectToolStripMenuItem.Click += subjectToolStripMenuItem_Click;
//
// buttonTestGroup100
//
buttonTestGroup100.Location = new Point(1106, 275);
buttonTestGroup100.Margin = new Padding(3, 4, 3, 4);
buttonTestGroup100.Name = "buttonTestGroup100";
buttonTestGroup100.Size = new Size(226, 37);
buttonTestGroup100.TabIndex = 11;
buttonTestGroup100.Text = "Создать 100 групп";
buttonTestGroup100.UseVisualStyleBackColor = true;
buttonTestGroup100.Click += buttonTestGroup100_Click;
//
// buttonTestSubject100
//
buttonTestSubject100.Location = new Point(1106, 205);
buttonTestSubject100.Margin = new Padding(3, 4, 3, 4);
buttonTestSubject100.Name = "buttonTestSubject100";
buttonTestSubject100.Size = new Size(226, 37);
buttonTestSubject100.TabIndex = 10;
buttonTestSubject100.Text = "Создать 100 предметов";
buttonTestSubject100.UseVisualStyleBackColor = true;
buttonTestSubject100.Click += buttonTestSubject100_Click;
//
// buttonTestTeacher100
//
buttonTestTeacher100.Location = new Point(1106, 133);
buttonTestTeacher100.Margin = new Padding(3, 4, 3, 4);
buttonTestTeacher100.Name = "buttonTestTeacher100";
buttonTestTeacher100.Size = new Size(226, 37);
buttonTestTeacher100.TabIndex = 9;
buttonTestTeacher100.Text = "Создать 100 преподавателей";
buttonTestTeacher100.UseVisualStyleBackColor = true;
buttonTestTeacher100.Click += buttonTestTeacher100_Click;
//
// buttonTestStudent1000
//
buttonTestStudent1000.Location = new Point(1106, 61);
buttonTestStudent1000.Margin = new Padding(3, 4, 3, 4);
buttonTestStudent1000.Name = "buttonTestStudent1000";
buttonTestStudent1000.Size = new Size(226, 37);
buttonTestStudent1000.TabIndex = 8;
buttonTestStudent1000.Text = "Создать 1000 студентов";
buttonTestStudent1000.UseVisualStyleBackColor = true;
buttonTestStudent1000.Click += buttonTestStudent1000_Click;
//
// dataGridView
//
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.BackgroundColor = Color.White;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Left;
dataGridView.Location = new Point(0, 30);
dataGridView.Margin = new Padding(3, 4, 3, 4);
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(1049, 622);
dataGridView.TabIndex = 7;
//
// buttonTestJoinGroups
//
buttonTestJoinGroups.Location = new Point(1106, 349);
buttonTestJoinGroups.Margin = new Padding(3, 4, 3, 4);
buttonTestJoinGroups.Name = "buttonTestJoinGroups";
buttonTestJoinGroups.Size = new Size(226, 37);
buttonTestJoinGroups.TabIndex = 12;
buttonTestJoinGroups.Text = "JOIN STUDENT GROUP";
buttonTestJoinGroups.UseVisualStyleBackColor = true;
buttonTestJoinGroups.Click += buttonTestJoinGroups_Click;
//
// buttonTestStudentD1000
//
buttonTestStudentD1000.Location = new Point(1106, 424);
buttonTestStudentD1000.Margin = new Padding(3, 4, 3, 4);
buttonTestStudentD1000.Name = "buttonTestStudentD1000";
buttonTestStudentD1000.Size = new Size(226, 37);
buttonTestStudentD1000.TabIndex = 13;
buttonTestStudentD1000.Text = "Удалить 1000 студентов";
buttonTestStudentD1000.UseVisualStyleBackColor = true;
buttonTestStudentD1000.Click += buttonTestStudentD1000_Click;
//
// buttonTestTeacherD100
//
buttonTestTeacherD100.Location = new Point(1106, 489);
buttonTestTeacherD100.Margin = new Padding(3, 4, 3, 4);
buttonTestTeacherD100.Name = "buttonTestTeacherD100";
buttonTestTeacherD100.Size = new Size(226, 37);
buttonTestTeacherD100.TabIndex = 14;
buttonTestTeacherD100.Text = "Удалить 100 преподавателей";
buttonTestTeacherD100.UseVisualStyleBackColor = true;
buttonTestTeacherD100.Click += buttonTestTeacherD100_Click;
//
// buttonTestSubjectD100
//
buttonTestSubjectD100.Location = new Point(1106, 551);
buttonTestSubjectD100.Margin = new Padding(3, 4, 3, 4);
buttonTestSubjectD100.Name = "buttonTestSubjectD100";
buttonTestSubjectD100.Size = new Size(226, 37);
buttonTestSubjectD100.TabIndex = 15;
buttonTestSubjectD100.Text = "Удалить 100 предметов";
buttonTestSubjectD100.UseVisualStyleBackColor = true;
buttonTestSubjectD100.Click += buttonTestSubjectD100_Click;
//
// buttonTestGroupD100
//
buttonTestGroupD100.Location = new Point(1106, 602);
buttonTestGroupD100.Margin = new Padding(3, 4, 3, 4);
buttonTestGroupD100.Name = "buttonTestGroupD100";
buttonTestGroupD100.Size = new Size(226, 37);
buttonTestGroupD100.TabIndex = 16;
buttonTestGroupD100.Text = "Удалить 100 групп";
buttonTestGroupD100.UseVisualStyleBackColor = true;
buttonTestGroupD100.Click += buttonTestGroupD100_Click;
//
// FormMain
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1387, 652);
Controls.Add(buttonTestGroupD100);
Controls.Add(buttonTestSubjectD100);
Controls.Add(buttonTestTeacherD100);
Controls.Add(buttonTestStudentD1000);
Controls.Add(buttonTestJoinGroups);
Controls.Add(buttonTestGroup100);
Controls.Add(buttonTestSubject100);
Controls.Add(buttonTestTeacher100);
Controls.Add(buttonTestStudent1000);
Controls.Add(dataGridView);
Controls.Add(menuStrip1);
MainMenuStrip = menuStrip1;
Margin = new Padding(3, 4, 3, 4);
Name = "FormMain";
Text = "Главное окно";
Load += FormMain_Load;
menuStrip1.ResumeLayout(false);
menuStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private MenuStrip menuStrip1;
private ToolStripMenuItem объектыToolStripMenuItem;
private ToolStripMenuItem studentToolStripMenuItem;
private ToolStripMenuItem teacherToolStripMenuItem;
private ToolStripMenuItem groupToolStripMenuItem;
private ToolStripMenuItem subjectToolStripMenuItem;
private Button buttonTestGroup100;
private Button buttonTestSubject100;
private Button buttonTestTeacher100;
private Button buttonTestStudent1000;
private DataGridView dataGridView;
private Button buttonTestJoinGroups;
private Button buttonTestStudentD1000;
private Button buttonTestTeacherD100;
private Button buttonTestSubjectD100;
private Button buttonTestGroupD100;
}
}

302
Journal/FormMain.cs Normal file
View File

@ -0,0 +1,302 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.ViewModels;
using JournalDataBaseImplement;
using JournalDataBaseImplement.Models;
using JournalDataModels.Models;
using JournalView;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SushiBarView
{
public partial class FormMain : Form
{
private readonly ITeacherLogic _TLogic;
private readonly IGroupLogic _GLogic;
private readonly IStudentLogic _StLogic;
private readonly ISubjectLogic _SLogic;
public FormMain(ITeacherLogic tLogic, IStudentLogic stLogic, ISubjectLogic sLogic, IGroupLogic gLogic)
{
InitializeComponent();
_TLogic = tLogic;
_GLogic = gLogic;
_StLogic = stLogic;
_SLogic = sLogic;
}
private void studentToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormStudents));
if (service is FormStudents form)
{
form.ShowDialog();
}
}
private void teacherToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormTeachers));
if (service is FormTeachers form)
{
form.ShowDialog();
}
}
private void subjectToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormSubjects));
if (service is FormSubjects form)
{
form.ShowDialog();
}
}
private void groupToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormGroups));
if (service is FormGroups form)
{
form.ShowDialog();
}
}
private void FormMain_Load(object sender, EventArgs e)
{
}
private void buttonTestGroup100_Click(object sender, EventArgs e)
{
int id = 0;
if (_GLogic.ReadList(null).Count > 0)
{
GroupViewModel fs = _GLogic.ReadList(null).First();
id = fs.Id - 1;
}
DateTime start = DateTime.Now;
for (int i = 1; i <= 100; i++)
{
GroupBindingModel model = new GroupBindingModel()
{
Course = i % 4 + 1,
GroupName = "Пибдоры номер " + i,
};
_GLogic.Create(model);
}
DateTime stop = DateTime.Now;
TimeSpan Time = stop - start;
MessageBox.Show($"Создание 100 групп заняло: {Time.TotalMilliseconds}");
}
private void buttonTestSubject100_Click(object sender, EventArgs e)
{
int id = 0;
if (_SLogic.ReadList(null).Count > 0)
{
SubjectViewModel fs = _SLogic.ReadList(null).First();
id = fs.Id - 1;
}
DateTime start = DateTime.Now;
for (int i = 1; i <= 100; i++)
{
SubjectBindingModel model = new SubjectBindingModel()
{
Hours = 3 * i,
SubjectName = "Точно не математика номер " + i + id,
};
_SLogic.Create(model);
}
DateTime stop = DateTime.Now;
TimeSpan Time = stop - start;
MessageBox.Show($"Создание 100 предметов заняло: {Time.TotalMilliseconds}");
}
private void buttonTestTeacher100_Click(object sender, EventArgs e)
{
int id = 0;
if (_TLogic.ReadList(null).Count > 0)
{
TeacherViewModel fs = _TLogic.ReadList(null).First();
id = fs.Id - 1;
}
DateTime start = DateTime.Now;
for (int i = 1; i <= 100; i++)
{
TeacherBindingModel model = new TeacherBindingModel()
{
Cafedra = "ФИСТ " + i,
Experience = (i + 10) / 2,
Position = "Заместитель по работе номер" + i + id,
TeacherName = "Иванов Иван Такойтов " + i + id,
};
_TLogic.Create(model);
}
DateTime stop = DateTime.Now;
TimeSpan Time = stop - start;
MessageBox.Show($"Создание 100 преподавателей заняло: {Time.TotalMilliseconds}");
}
private void buttonTestStudent1000_Click(object sender, EventArgs e)
{
int id = 0;
if (_StLogic.ReadList(null).Count > 0)
{
StudentViewModel fs = _StLogic.ReadList(null).First();
id = fs.Id - 1;
}
DateTime start = DateTime.Now;
for (int i = 1; i <= 10000; i++)
{
StudentBindingModel model = new StudentBindingModel()
{
BookNumber = i + 10000,
Email = "pochta" + i + "@ulstu.ru",
GroupId = i % 100 + 1,
StudentName = "Григорьев Гриша Гришевич " + i + id,
};
_StLogic.Create(model);
}
DateTime stop = DateTime.Now;
TimeSpan Time = stop - start;
MessageBox.Show($"Создание 1000 студентов заняло: {Time.TotalMilliseconds}");
}
private void buttonTestGroupD100_Click(object sender, EventArgs e)
{
int id = 0;
if (_GLogic.ReadList(null).Count > 0)
{
GroupViewModel fs = _GLogic.ReadList(null).First();
id = fs.Id - 1;
}
DateTime start = DateTime.Now;
for (int i = 1; i <= 100; i++)
{
GroupBindingModel model = new GroupBindingModel()
{
Id = i + id,
};
_GLogic.Delete(model);
}
DateTime stop = DateTime.Now;
TimeSpan Time = stop - start;
MessageBox.Show($"Удаление 100 групп заняло: {Time.TotalMilliseconds}");
}
private void buttonTestSubjectD100_Click(object sender, EventArgs e)
{
int id = 0;
if (_SLogic.ReadList(null).Count > 0)
{
SubjectViewModel fs = _SLogic.ReadList(null).First();
id = fs.Id - 1;
}
DateTime start = DateTime.Now;
for (int i = 1; i <= 100; i++)
{
SubjectBindingModel model = new SubjectBindingModel()
{
Id = i + id,
};
_SLogic.Delete(model);
}
DateTime stop = DateTime.Now;
TimeSpan Time = stop - start;
MessageBox.Show($"Удаление 100 предметов заняло: {Time.TotalMilliseconds}");
}
private void buttonTestTeacherD100_Click(object sender, EventArgs e)
{
int id = 0;
if (_TLogic.ReadList(null).Count > 0)
{
TeacherViewModel fs = _TLogic.ReadList(null).First();
id = fs.Id - 1;
}
DateTime start = DateTime.Now;
for (int i = 1; i <= 100; i++)
{
TeacherBindingModel model = new TeacherBindingModel()
{
Id = i + id,
};
_TLogic.Delete(model);
}
DateTime stop = DateTime.Now;
TimeSpan Time = stop - start;
MessageBox.Show($"Удаление 100 преподавателей заняло: {Time.TotalMilliseconds}");
}
private void buttonTestStudentD1000_Click(object sender, EventArgs e)
{
int id = 0;
if (_StLogic.ReadList(null).Count > 0)
{
StudentViewModel fs = _StLogic.ReadList(null).First();
id = fs.Id - 1;
}
DateTime start = DateTime.Now;
for (int i = 1; i <= 1000; i++)
{
StudentBindingModel model = new StudentBindingModel()
{
Id = i + id,
};
_StLogic.Delete(model);
}
DateTime stop = DateTime.Now;
TimeSpan Time = stop - start;
MessageBox.Show($"Удаление 1000 студентов заняло: {Time.TotalMilliseconds}");
}
private void buttonTestJoinGroups_Click(object sender, EventArgs e)
{
DateTime start = DateTime.Now;
using (var db = new JournalDataBase())
{
var query = from student in db.Students
join groupp in db.Groups on student.GroupId equals groupp.Id
select new
{
student.Id,
student.StudentName,
student.BookNumber,
groupp.GroupName,
};
var result = query.ToList();
DateTime stop = DateTime.Now;
TimeSpan queryTime = stop - start;
dataGridView.DataSource = result;
MessageBox.Show($"Присоединение групп к студентам заняло {queryTime.TotalMilliseconds}");
}
}
}
}

123
Journal/FormMain.resx Normal file
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="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>

102
Journal/FormSelectSubject.Designer.cs generated Normal file
View File

@ -0,0 +1,102 @@
namespace JournalView
{
partial class FormSelectSubject
{
/// <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()
{
label1 = new Label();
buttonCancel = new Button();
buttonSave = new Button();
comboBoxSubject = new ComboBox();
SuspendLayout();
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(14, 12);
label1.Name = "label1";
label1.Size = new Size(70, 20);
label1.TabIndex = 0;
label1.Text = "Предмет";
//
// buttonCancel
//
buttonCancel.Location = new Point(260, 62);
buttonCancel.Margin = new Padding(3, 4, 3, 4);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(103, 35);
buttonCancel.TabIndex = 12;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += buttonCancel_Click;
//
// buttonSave
//
buttonSave.Location = new Point(150, 62);
buttonSave.Margin = new Padding(3, 4, 3, 4);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(103, 35);
buttonSave.TabIndex = 11;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += buttonSave_Click;
//
// comboBoxSubject
//
comboBoxSubject.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxSubject.FormattingEnabled = true;
comboBoxSubject.Location = new Point(88, 8);
comboBoxSubject.Margin = new Padding(3, 4, 3, 4);
comboBoxSubject.Name = "comboBoxSubject";
comboBoxSubject.Size = new Size(284, 28);
comboBoxSubject.TabIndex = 8;
//
// FormSelectSubject
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(390, 114);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(comboBoxSubject);
Controls.Add(label1);
Margin = new Padding(3, 4, 3, 4);
Name = "FormSelectSubject";
Text = "Выберите предмет";
Load += FormSelectSubject_Load;
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label1;
private Button buttonCancel;
private Button buttonSave;
private ComboBox comboBoxSubject;
}
}

View File

@ -0,0 +1,88 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.ViewModels;
using JournalDataModels.Models;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace JournalView
{
public partial class FormSelectSubject : Form
{
private readonly List<SubjectViewModel>? _list;
public int Id
{
get
{
return Convert.ToInt32(comboBoxSubject.SelectedValue);
}
set
{
comboBoxSubject.SelectedValue = value;
}
}
public ISubjectModel? SubjectModel
{
get
{
if (_list == null)
{
return null;
}
foreach (var elem in _list)
{
if (elem.Id == Id)
{
return elem;
}
}
return null;
}
}
public FormSelectSubject(ISubjectLogic Logic)
{
InitializeComponent();
_list = Logic.ReadList(null);
if (_list != null)
{
comboBoxSubject.DisplayMember = "SubjectName";
comboBoxSubject.ValueMember = "Id";
comboBoxSubject.DataSource = _list;
comboBoxSubject.SelectedItem = null;
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (comboBoxSubject.SelectedValue == null)
{
MessageBox.Show("Выберите предмет", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
DialogResult = DialogResult.OK;
Close();
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
private void FormSelectSubject_Load(object sender, EventArgs e)
{
}
}
}

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>

286
Journal/FormStudent.Designer.cs generated Normal file
View File

@ -0,0 +1,286 @@
namespace JournalView
{
partial class FormStudent
{
/// <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()
{
label1 = new Label();
label2 = new Label();
label3 = new Label();
groupBox1 = new GroupBox();
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
dataGridView = new DataGridView();
buttonCancel = new Button();
buttonSave = new Button();
label4 = new Label();
textBoxFCS = new TextBox();
textBoxBookNumber = new TextBox();
textBoxEmail = new TextBox();
comboBoxGroup = new ComboBox();
ColumnId = new DataGridViewTextBoxColumn();
ColumnSubjectName = new DataGridViewTextBoxColumn();
ColumnType = new DataGridViewTextBoxColumn();
ColumnGrade = new DataGridViewTextBoxColumn();
groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(18, 12);
label1.Name = "label1";
label1.Size = new Size(42, 20);
label1.TabIndex = 0;
label1.Text = "ФИО";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(18, 56);
label2.Name = "label2";
label2.Size = new Size(114, 20);
label2.TabIndex = 1;
label2.Text = "Номер зачетки";
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(18, 101);
label3.Name = "label3";
label3.Size = new Size(46, 20);
label3.TabIndex = 2;
label3.Text = "Email";
//
// groupBox1
//
groupBox1.Controls.Add(buttonDel);
groupBox1.Controls.Add(buttonUpd);
groupBox1.Controls.Add(buttonAdd);
groupBox1.Controls.Add(dataGridView);
groupBox1.Location = new Point(14, 136);
groupBox1.Margin = new Padding(3, 4, 3, 4);
groupBox1.Name = "groupBox1";
groupBox1.Padding = new Padding(3, 4, 3, 4);
groupBox1.Size = new Size(709, 448);
groupBox1.TabIndex = 7;
groupBox1.TabStop = false;
groupBox1.Text = "Оценки";
//
// buttonDel
//
buttonDel.Location = new Point(549, 164);
buttonDel.Margin = new Padding(3, 4, 3, 4);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(135, 47);
buttonDel.TabIndex = 10;
buttonDel.Text = "Удалить";
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonUpd
//
buttonUpd.Location = new Point(549, 96);
buttonUpd.Margin = new Padding(3, 4, 3, 4);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(135, 47);
buttonUpd.TabIndex = 9;
buttonUpd.Text = "Изменить";
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonAdd
//
buttonAdd.Location = new Point(549, 29);
buttonAdd.Margin = new Padding(3, 4, 3, 4);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(135, 47);
buttonAdd.TabIndex = 8;
buttonAdd.Text = "Добавить";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.BackgroundColor = Color.White;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Columns.AddRange(new DataGridViewColumn[] { ColumnId, ColumnSubjectName, ColumnType, ColumnGrade });
dataGridView.Location = new Point(7, 29);
dataGridView.Margin = new Padding(3, 4, 3, 4);
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(515, 411);
dataGridView.TabIndex = 0;
//
// buttonCancel
//
buttonCancel.Location = new Point(617, 592);
buttonCancel.Margin = new Padding(3, 4, 3, 4);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(135, 47);
buttonCancel.TabIndex = 12;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += buttonCancel_Click;
//
// buttonSave
//
buttonSave.Location = new Point(475, 592);
buttonSave.Margin = new Padding(3, 4, 3, 4);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(135, 47);
buttonSave.TabIndex = 11;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += buttonSave_Click;
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(21, 608);
label4.Name = "label4";
label4.Size = new Size(58, 20);
label4.TabIndex = 13;
label4.Text = "Группа";
//
// textBoxFCS
//
textBoxFCS.Location = new Point(138, 12);
textBoxFCS.Margin = new Padding(3, 4, 3, 4);
textBoxFCS.Name = "textBoxFCS";
textBoxFCS.Size = new Size(351, 27);
textBoxFCS.TabIndex = 15;
//
// textBoxBookNumber
//
textBoxBookNumber.Location = new Point(138, 53);
textBoxBookNumber.Margin = new Padding(3, 4, 3, 4);
textBoxBookNumber.Name = "textBoxBookNumber";
textBoxBookNumber.Size = new Size(351, 27);
textBoxBookNumber.TabIndex = 16;
//
// textBoxEmail
//
textBoxEmail.Location = new Point(138, 94);
textBoxEmail.Margin = new Padding(3, 4, 3, 4);
textBoxEmail.Name = "textBoxEmail";
textBoxEmail.Size = new Size(351, 27);
textBoxEmail.TabIndex = 17;
//
// comboBoxGroup
//
comboBoxGroup.FormattingEnabled = true;
comboBoxGroup.Location = new Point(100, 605);
comboBoxGroup.Name = "comboBoxGroup";
comboBoxGroup.Size = new Size(151, 28);
comboBoxGroup.TabIndex = 18;
//
// ColumnId
//
ColumnId.HeaderText = "Id";
ColumnId.MinimumWidth = 6;
ColumnId.Name = "ColumnId";
ColumnId.ReadOnly = true;
//
// ColumnSubjectName
//
ColumnSubjectName.HeaderText = "Предмет";
ColumnSubjectName.MinimumWidth = 6;
ColumnSubjectName.Name = "ColumnSubjectName";
ColumnSubjectName.ReadOnly = true;
//
// ColumnType
//
ColumnType.HeaderText = "Тип";
ColumnType.MinimumWidth = 6;
ColumnType.Name = "ColumnType";
ColumnType.ReadOnly = true;
//
// ColumnGrade
//
ColumnGrade.HeaderText = "Оценка";
ColumnGrade.MinimumWidth = 6;
ColumnGrade.Name = "ColumnGrade";
ColumnGrade.ReadOnly = true;
//
// FormStudent
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(766, 653);
Controls.Add(comboBoxGroup);
Controls.Add(textBoxEmail);
Controls.Add(textBoxBookNumber);
Controls.Add(textBoxFCS);
Controls.Add(label4);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(groupBox1);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Margin = new Padding(3, 4, 3, 4);
Name = "FormStudent";
Text = "Студент";
Load += FormStudent_Load;
groupBox1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label1;
private Label label2;
private Label label3;
private GroupBox groupBox1;
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
private DataGridView dataGridView;
private Button buttonCancel;
private Button buttonSave;
private Label label4;
private TextBox textBoxFCS;
private TextBox textBoxBookNumber;
private TextBox textBoxEmail;
private ComboBox comboBoxGroup;
private DataGridViewTextBoxColumn ColumnId;
private DataGridViewTextBoxColumn ColumnSubjectName;
private DataGridViewTextBoxColumn ColumnType;
private DataGridViewTextBoxColumn ColumnGrade;
}
}

199
Journal/FormStudent.cs Normal file
View File

@ -0,0 +1,199 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.SearchModels;
using JournalDataModels.Enum;
using JournalDataModels.Models;
using JournalView;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace JournalView
{
public partial class FormStudent : Form
{
private readonly ISubjectLogic _logicS;
private readonly ITeacherLogic _logicT;
private readonly IStudentLogic _logicSt;
private readonly IGroupLogic _logicG;
private int? _id;
private Dictionary<int, (ISubjectModel, ExamType, int)> _studentGrades;
public int Id { set { _id = value; } }
public FormStudent(ISubjectLogic slogic, ITeacherLogic tlogic, IStudentLogic stlogic, IGroupLogic glogic)
{
InitializeComponent();
_logicT = tlogic;
_logicS = slogic;
_logicG = glogic;
_logicSt = stlogic;
_studentGrades = new Dictionary<int, (ISubjectModel, ExamType, int)>();
}
private void FormStudent_Load(object sender, EventArgs e)
{
var _listG = _logicG.ReadList(null);
if (_listG != null)
{
comboBoxGroup.DisplayMember = "GroupName";
comboBoxGroup.ValueMember = "Id";
comboBoxGroup.DataSource = _listG;
comboBoxGroup.SelectedItem = null;
}
if (_id.HasValue)
{
try
{
var view = _logicSt.ReadElement(new StudentSearchModel { Id = _id.Value });
if (view != null)
{
textBoxBookNumber.Text = view.BookNumber.ToString();
textBoxFCS.Text = view.StudentName;
textBoxEmail.Text = view.Email;
comboBoxGroup.SelectedIndex = view.GroupId - 1;
_studentGrades = view.StudentGrades ?? new Dictionary<int, (ISubjectModel, ExamType, int)>();
LoadData();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void LoadData()
{
try
{
if (_studentGrades != null)
{
dataGridView.Rows.Clear();
foreach (var rc in _studentGrades)
{
dataGridView.Rows.Add(new object[] { rc.Key, rc.Value.Item1.SubjectName, rc.Value.Item2.ToString(), rc.Value.Item3});
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormGrade));
if (service is FormGrade form)
{
if (form.ShowDialog() == DialogResult.OK)
{
if (form.SubjectModel == null)
{
return;
}
if (_studentGrades.ContainsKey(form.Id))
{
_studentGrades[form.Id] = (form.SubjectModel, (ExamType)form.Type, form.Mark);
}
else
{
_studentGrades.Add(form.Id, (form.SubjectModel, (ExamType)form.Type, form.Mark));
}
LoadData();
}
}
}
private void buttonUpd_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
var service = Program.ServiceProvider?.GetService(typeof(FormGrade));
if (service is FormGrade form)
{
int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value);
form.Id = id;
form.Mark = _studentGrades[id].Item3;
form.Type = _studentGrades[id].Item2;
if (form.ShowDialog() == DialogResult.OK)
{
if (form.SubjectModel == null)
{
return;
}
_studentGrades[form.Id] = (form.SubjectModel, (ExamType)form.Type, form.Mark);
LoadData();
}
}
}
}
private void buttonDel_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
_studentGrades?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
LoadData();
}
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (_studentGrades == null || _studentGrades.Count == 0)
{
MessageBox.Show("Заполните оценки", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
var model = new StudentBindingModel
{
Id = _id ?? 0,
BookNumber = Convert.ToInt32(textBoxBookNumber.Text),
Email = textBoxEmail.Text,
StudentName = textBoxFCS.Text,
GroupId = comboBoxGroup.SelectedIndex + 1,
StudentGrades = _studentGrades,
};
var operationResult = _id.HasValue ? _logicSt.Update(model) : _logicSt.Create(model);
if (!operationResult)
{
throw new Exception("Ошибка при сохранении. Доп информация в логах");
}
MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}

132
Journal/FormStudent.resx Normal file
View File

@ -0,0 +1,132 @@
<?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="ColumnId.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnSubjectName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnType.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnGrade.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

113
Journal/FormStudents.Designer.cs generated Normal file
View File

@ -0,0 +1,113 @@
namespace JournalView
{
partial class FormStudents
{
/// <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()
{
dataGridView = new DataGridView();
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.BackgroundColor = Color.White;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Left;
dataGridView.Location = new Point(0, 0);
dataGridView.Margin = new Padding(3, 4, 3, 4);
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.ShowCellToolTips = false;
dataGridView.ShowEditingIcon = false;
dataGridView.Size = new Size(1141, 600);
dataGridView.TabIndex = 1;
//
// buttonDel
//
buttonDel.Location = new Point(1147, 148);
buttonDel.Margin = new Padding(3, 4, 3, 4);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(135, 47);
buttonDel.TabIndex = 7;
buttonDel.Text = "Удалить";
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonUpd
//
buttonUpd.Location = new Point(1147, 80);
buttonUpd.Margin = new Padding(3, 4, 3, 4);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(135, 47);
buttonUpd.TabIndex = 6;
buttonUpd.Text = "Изменить";
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonAdd
//
buttonAdd.Location = new Point(1147, 13);
buttonAdd.Margin = new Padding(3, 4, 3, 4);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(135, 47);
buttonAdd.TabIndex = 5;
buttonAdd.Text = "Добавить";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// FormStudents
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1328, 600);
Controls.Add(buttonDel);
Controls.Add(buttonUpd);
Controls.Add(buttonAdd);
Controls.Add(dataGridView);
Margin = new Padding(3, 4, 3, 4);
Name = "FormStudents";
Text = "Студенты";
Load += FormBuyers_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private DataGridView dataGridView;
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
}
}

103
Journal/FormStudents.cs Normal file
View File

@ -0,0 +1,103 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalView;
using Microsoft.EntityFrameworkCore.Diagnostics;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace JournalView
{
public partial class FormStudents : Form
{
private readonly IStudentLogic _logic;
public FormStudents(IStudentLogic logic)
{
InitializeComponent();
_logic = logic;
}
private void FormBuyers_Load(object sender, EventArgs e)
{
LoadData();
}
private void LoadData()
{
try
{
var list = _logic.ReadList(null);
if (list != null)
{
dataGridView.DataSource = list;
dataGridView.Columns["GroupId"].Visible = false;
dataGridView.Columns["GroupName"].Visible = false;
dataGridView.Columns["StudentGrades"].Visible = false;
dataGridView.Columns["StudentName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormStudent));
if (service is FormStudent form)
{
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
private void buttonUpd_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
var service = Program.ServiceProvider?.GetService(typeof(FormStudent));
if (service is FormStudent form)
{
form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
}
private void buttonDel_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
try
{
if (!_logic.Delete(new StudentBindingModel { Id = id }))
{
throw new Exception("Ошибка при удалении. Доп информация в логах");
}
LoadData();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
}

120
Journal/FormStudents.resx Normal file
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>

123
Journal/FormSubject.Designer.cs generated Normal file
View File

@ -0,0 +1,123 @@
namespace JournalView
{
partial class FormSubject
{
/// <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()
{
label1 = new Label();
label2 = new Label();
textBoxName = new TextBox();
textBoxHours = new TextBox();
buttonCancel = new Button();
buttonSave = new Button();
SuspendLayout();
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(14, 24);
label1.Name = "label1";
label1.Size = new Size(148, 20);
label1.TabIndex = 0;
label1.Text = "Название предмета";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(14, 64);
label2.Name = "label2";
label2.Size = new Size(102, 20);
label2.TabIndex = 1;
label2.Text = "Кол-во часов";
//
// textBoxName
//
textBoxName.Location = new Point(231, 21);
textBoxName.Margin = new Padding(3, 4, 3, 4);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(193, 27);
textBoxName.TabIndex = 2;
//
// textBoxHours
//
textBoxHours.Location = new Point(231, 64);
textBoxHours.Margin = new Padding(3, 4, 3, 4);
textBoxHours.Name = "textBoxHours";
textBoxHours.Size = new Size(193, 27);
textBoxHours.TabIndex = 3;
//
// buttonCancel
//
buttonCancel.Location = new Point(231, 117);
buttonCancel.Margin = new Padding(3, 4, 3, 4);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(88, 40);
buttonCancel.TabIndex = 7;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += buttonCancel_Click;
//
// buttonSave
//
buttonSave.Location = new Point(136, 117);
buttonSave.Margin = new Padding(3, 4, 3, 4);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(95, 40);
buttonSave.TabIndex = 6;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += buttonSave_Click;
//
// FormSubject
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(510, 186);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(textBoxHours);
Controls.Add(textBoxName);
Controls.Add(label2);
Controls.Add(label1);
Margin = new Padding(3, 4, 3, 4);
Name = "FormSubject";
Text = "Предмет";
Load += FormSubject_Load;
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label1;
private Label label2;
private TextBox textBoxName;
private TextBox textBoxHours;
private Button buttonCancel;
private Button buttonSave;
}
}

86
Journal/FormSubject.cs Normal file
View File

@ -0,0 +1,86 @@
using JournalContracts.BusinessLogicContracts;
using JournalContracts.SearchModels;
using JournalContracts.BindingModels;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace JournalView
{
public partial class FormSubject : Form
{
private readonly ISubjectLogic _logic;
private int? _id;
public int Id { set { _id = value; } }
public FormSubject(ISubjectLogic logic)
{
InitializeComponent();
_logic = logic;
}
private void FormSubject_Load(object sender, EventArgs e)
{
if (_id.HasValue)
{
try
{
var view = _logic.ReadElement(new SubjectSearchModel { Id = _id.Value });
if (view != null)
{
textBoxName.Text = view.SubjectName;
textBoxHours.Text = view.Hours.ToString();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxName.Text) || string.IsNullOrEmpty(textBoxHours.Text))
{
MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
var model = new SubjectBindingModel
{
Id = _id ?? 0,
SubjectName = textBoxName.Text,
Hours = Convert.ToInt32(textBoxHours.Text)
};
var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model);
if (!operationResult)
{
throw new Exception("Ошибка при сохранении. Доп информация в логах.");
}
MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}

120
Journal/FormSubject.resx Normal file
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>

114
Journal/FormSubjects.Designer.cs generated Normal file
View File

@ -0,0 +1,114 @@
namespace JournalView
{
partial class FormSubjects
{
/// <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()
{
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
dataGridView = new DataGridView();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// buttonDel
//
buttonDel.Location = new Point(413, 157);
buttonDel.Margin = new Padding(3, 4, 3, 4);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(135, 47);
buttonDel.TabIndex = 8;
buttonDel.Text = "Удалить";
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonUpd
//
buttonUpd.Location = new Point(413, 89);
buttonUpd.Margin = new Padding(3, 4, 3, 4);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(135, 47);
buttonUpd.TabIndex = 7;
buttonUpd.Text = "Изменить";
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonAdd
//
buttonAdd.Location = new Point(413, 23);
buttonAdd.Margin = new Padding(3, 4, 3, 4);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(135, 47);
buttonAdd.TabIndex = 6;
buttonAdd.Text = "Добавить";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.BackgroundColor = Color.White;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Left;
dataGridView.Location = new Point(0, 0);
dataGridView.Margin = new Padding(3, 4, 3, 4);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(378, 600);
dataGridView.TabIndex = 5;
//
// FormSubjects
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(578, 600);
Controls.Add(buttonDel);
Controls.Add(buttonUpd);
Controls.Add(buttonAdd);
Controls.Add(dataGridView);
Margin = new Padding(3, 4, 3, 4);
Name = "FormSubjects";
Text = "Предметы";
Load += FormSubjects_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
private DataGridView dataGridView;
}
}

101
Journal/FormSubjects.cs Normal file
View File

@ -0,0 +1,101 @@
using JournalContracts.BusinessLogicContracts;
using JournalView;
using JournalContracts.BindingModels;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace JournalView
{
public partial class FormSubjects : Form
{
private readonly ISubjectLogic _logic;
public FormSubjects(ISubjectLogic logic)
{
InitializeComponent();
_logic = logic;
}
private void FormSubjects_Load(object sender, EventArgs e)
{
LoadData();
}
private void LoadData()
{
try
{
var list = _logic.ReadList(null);
if (list != null)
{
dataGridView.DataSource = list;
dataGridView.Columns["Id"].Visible = true;
dataGridView.Columns["SubjectName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["Hours"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormSubject));
if (service is FormSubject form)
{
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
private void buttonUpd_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
var service = Program.ServiceProvider?.GetService(typeof(FormSubject));
if (service is FormSubject form)
{
form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
}
private void buttonDel_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
try
{
if (!_logic.Delete(new SubjectBindingModel { Id = id }))
{
throw new Exception("Ошибка при удалении. Доп информация в логах");
}
LoadData();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
}

120
Journal/FormSubjects.resx Normal file
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>

268
Journal/FormTeacher.Designer.cs generated Normal file
View File

@ -0,0 +1,268 @@
namespace JournalView
{
partial class FormTeacher
{
/// <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()
{
label1 = new Label();
label2 = new Label();
label3 = new Label();
groupBox1 = new GroupBox();
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
dataGridView = new DataGridView();
buttonCancel = new Button();
buttonSave = new Button();
textBoxExperience = new TextBox();
label4 = new Label();
textBoxFCS = new TextBox();
textBoxPosition = new TextBox();
textBoxCafedra = new TextBox();
ColumnId = new DataGridViewTextBoxColumn();
ColumnSubjectName = new DataGridViewTextBoxColumn();
groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(18, 12);
label1.Name = "label1";
label1.Size = new Size(42, 20);
label1.TabIndex = 0;
label1.Text = "ФИО";
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(18, 56);
label2.Name = "label2";
label2.Size = new Size(86, 20);
label2.TabIndex = 1;
label2.Text = "Должность";
//
// label3
//
label3.AutoSize = true;
label3.Location = new Point(18, 101);
label3.Name = "label3";
label3.Size = new Size(69, 20);
label3.TabIndex = 2;
label3.Text = "Кафедра";
//
// groupBox1
//
groupBox1.Controls.Add(buttonDel);
groupBox1.Controls.Add(buttonUpd);
groupBox1.Controls.Add(buttonAdd);
groupBox1.Controls.Add(dataGridView);
groupBox1.Location = new Point(14, 136);
groupBox1.Margin = new Padding(3, 4, 3, 4);
groupBox1.Name = "groupBox1";
groupBox1.Padding = new Padding(3, 4, 3, 4);
groupBox1.Size = new Size(709, 448);
groupBox1.TabIndex = 7;
groupBox1.TabStop = false;
groupBox1.Text = "Предметы";
//
// buttonDel
//
buttonDel.Location = new Point(549, 164);
buttonDel.Margin = new Padding(3, 4, 3, 4);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(135, 47);
buttonDel.TabIndex = 10;
buttonDel.Text = "Удалить";
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonUpd
//
buttonUpd.Location = new Point(549, 96);
buttonUpd.Margin = new Padding(3, 4, 3, 4);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(135, 47);
buttonUpd.TabIndex = 9;
buttonUpd.Text = "Изменить";
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonAdd
//
buttonAdd.Location = new Point(549, 29);
buttonAdd.Margin = new Padding(3, 4, 3, 4);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(135, 47);
buttonAdd.TabIndex = 8;
buttonAdd.Text = "Добавить";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridView.BackgroundColor = Color.White;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Columns.AddRange(new DataGridViewColumn[] { ColumnId, ColumnSubjectName });
dataGridView.Location = new Point(7, 29);
dataGridView.Margin = new Padding(3, 4, 3, 4);
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(515, 411);
dataGridView.TabIndex = 0;
//
// buttonCancel
//
buttonCancel.Location = new Point(617, 592);
buttonCancel.Margin = new Padding(3, 4, 3, 4);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(135, 47);
buttonCancel.TabIndex = 12;
buttonCancel.Text = "Отмена";
buttonCancel.UseVisualStyleBackColor = true;
buttonCancel.Click += buttonCancel_Click;
//
// buttonSave
//
buttonSave.Location = new Point(475, 592);
buttonSave.Margin = new Padding(3, 4, 3, 4);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(135, 47);
buttonSave.TabIndex = 11;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += buttonSave_Click;
//
// textBoxExperience
//
textBoxExperience.Location = new Point(537, 17);
textBoxExperience.Margin = new Padding(3, 4, 3, 4);
textBoxExperience.Name = "textBoxExperience";
textBoxExperience.Size = new Size(161, 27);
textBoxExperience.TabIndex = 14;
//
// label4
//
label4.AutoSize = true;
label4.Location = new Point(423, 20);
label4.Name = "label4";
label4.Size = new Size(102, 20);
label4.TabIndex = 13;
label4.Text = "Опыт работы";
//
// textBoxFCS
//
textBoxFCS.Location = new Point(114, 12);
textBoxFCS.Margin = new Padding(3, 4, 3, 4);
textBoxFCS.Name = "textBoxFCS";
textBoxFCS.Size = new Size(280, 27);
textBoxFCS.TabIndex = 15;
//
// textBoxPosition
//
textBoxPosition.Location = new Point(114, 56);
textBoxPosition.Margin = new Padding(3, 4, 3, 4);
textBoxPosition.Name = "textBoxPosition";
textBoxPosition.Size = new Size(280, 27);
textBoxPosition.TabIndex = 16;
//
// textBoxCafedra
//
textBoxCafedra.Location = new Point(114, 101);
textBoxCafedra.Margin = new Padding(3, 4, 3, 4);
textBoxCafedra.Name = "textBoxCafedra";
textBoxCafedra.Size = new Size(280, 27);
textBoxCafedra.TabIndex = 17;
//
// ColumnId
//
ColumnId.HeaderText = "Id";
ColumnId.MinimumWidth = 6;
ColumnId.Name = "ColumnId";
ColumnId.ReadOnly = true;
//
// ColumnSubjectName
//
ColumnSubjectName.HeaderText = "Название";
ColumnSubjectName.MinimumWidth = 6;
ColumnSubjectName.Name = "ColumnSubjectName";
ColumnSubjectName.ReadOnly = true;
//
// FormTeacher
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(766, 653);
Controls.Add(textBoxCafedra);
Controls.Add(textBoxPosition);
Controls.Add(textBoxFCS);
Controls.Add(textBoxExperience);
Controls.Add(label4);
Controls.Add(buttonCancel);
Controls.Add(buttonSave);
Controls.Add(groupBox1);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Margin = new Padding(3, 4, 3, 4);
Name = "FormTeacher";
Text = "Преподаватель";
Load += FormTeacher_Load;
groupBox1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label1;
private Label label2;
private Label label3;
private GroupBox groupBox1;
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
private DataGridView dataGridView;
private Button buttonCancel;
private Button buttonSave;
private TextBox textBoxExperience;
private Label label4;
private TextBox textBoxFCS;
private TextBox textBoxPosition;
private TextBox textBoxCafedra;
private DataGridViewTextBoxColumn ColumnId;
private DataGridViewTextBoxColumn ColumnSubjectName;
}
}

185
Journal/FormTeacher.cs Normal file
View File

@ -0,0 +1,185 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.SearchModels;
using JournalDataModels.Models;
using JournalView;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace JournalView
{
public partial class FormTeacher : Form
{
private readonly ISubjectLogic _logicP;
private readonly ITeacherLogic _logicC;
private int? _id;
private Dictionary<int, ISubjectModel> _teacherSubjects;
public int Id { set { _id = value; } }
public FormTeacher(ISubjectLogic plogic, ITeacherLogic clogic)
{
InitializeComponent();
_logicP = plogic;
_logicC = clogic;
_teacherSubjects = new Dictionary<int, ISubjectModel>();
}
private void FormTeacher_Load(object sender, EventArgs e)
{
if (_id.HasValue)
{
try
{
var view = _logicC.ReadElement(new TeacherSearchModel { Id = _id.Value });
if (view != null)
{
textBoxFCS.Text = view.TeacherName;
textBoxCafedra.Text = view.Cafedra;
textBoxPosition.Text = view.Position;
textBoxExperience.Text = view.Experience.ToString();
_teacherSubjects = view.TeacherSubjects ?? new Dictionary<int, ISubjectModel>();
LoadData();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void LoadData()
{
try
{
if (_teacherSubjects != null)
{
dataGridView.Rows.Clear();
foreach (var rc in _teacherSubjects)
{
dataGridView.Rows.Add(new object[] {rc.Key ,rc.Value.SubjectName });
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormSelectSubject));
if (service is FormSelectSubject form)
{
if (form.ShowDialog() == DialogResult.OK)
{
if (form.SubjectModel == null)
{
return;
}
if (_teacherSubjects.ContainsKey(form.Id))
{
_teacherSubjects[form.Id] = form.SubjectModel;
}
else
{
_teacherSubjects.Add(form.Id, form.SubjectModel);
}
LoadData();
}
}
}
private void buttonUpd_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
var service = Program.ServiceProvider?.GetService(typeof(FormSelectSubject));
if (service is FormSelectSubject form)
{
int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value);
form.Id = id;
if (form.ShowDialog() == DialogResult.OK)
{
if (form.SubjectModel == null)
{
return;
}
_teacherSubjects[form.Id] = form.SubjectModel;
LoadData();
}
}
}
}
private void buttonDel_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
_teacherSubjects?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
LoadData();
}
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (_teacherSubjects == null || _teacherSubjects.Count == 0)
{
MessageBox.Show("Заполните предметы", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
var model = new TeacherBindingModel
{
Id = _id ?? 0,
TeacherName = textBoxFCS.Text,
TeacherSubjects = _teacherSubjects,
Cafedra = textBoxCafedra.Text,
Experience = Convert.ToInt32(textBoxExperience.Text),
Position = textBoxPosition.Text,
};
var operationResult = _id.HasValue ? _logicC.Update(model) : _logicC.Create(model);
if (!operationResult)
{
throw new Exception("Ошибка при сохранении. Доп информация в логах");
}
MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}

126
Journal/FormTeacher.resx Normal file
View File

@ -0,0 +1,126 @@
<?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="ColumnId.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnSubjectName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

114
Journal/FormTeachers.Designer.cs generated Normal file
View File

@ -0,0 +1,114 @@
namespace SushiBarView
{
partial class FormTeachers
{
/// <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()
{
buttonDel = new Button();
buttonUpd = new Button();
buttonAdd = new Button();
dataGridView = new DataGridView();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// buttonDel
//
buttonDel.Location = new Point(656, 155);
buttonDel.Margin = new Padding(3, 4, 3, 4);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(135, 47);
buttonDel.TabIndex = 11;
buttonDel.Text = "Удалить";
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonUpd
//
buttonUpd.Location = new Point(656, 87);
buttonUpd.Margin = new Padding(3, 4, 3, 4);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(135, 47);
buttonUpd.TabIndex = 10;
buttonUpd.Text = "Изменить";
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonAdd
//
buttonAdd.Location = new Point(656, 20);
buttonAdd.Margin = new Padding(3, 4, 3, 4);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(135, 47);
buttonAdd.TabIndex = 9;
buttonAdd.Text = "Добавить";
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridView
//
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.BackgroundColor = Color.White;
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Dock = DockStyle.Left;
dataGridView.Location = new Point(0, 0);
dataGridView.Margin = new Padding(3, 4, 3, 4);
dataGridView.Name = "dataGridView";
dataGridView.ReadOnly = true;
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.ShowCellToolTips = false;
dataGridView.ShowEditingIcon = false;
dataGridView.Size = new Size(600, 600);
dataGridView.TabIndex = 8;
//
// FormTeachers
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(842, 600);
Controls.Add(buttonDel);
Controls.Add(buttonUpd);
Controls.Add(buttonAdd);
Controls.Add(dataGridView);
Margin = new Padding(3, 4, 3, 4);
Name = "FormTeachers";
Text = "Преподаватели";
Load += FormTeachers_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
}
#endregion
private Button buttonDel;
private Button buttonUpd;
private Button buttonAdd;
private DataGridView dataGridView;
}
}

102
Journal/FormTeachers.cs Normal file
View File

@ -0,0 +1,102 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalView;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace SushiBarView
{
public partial class FormTeachers : Form
{
private readonly ITeacherLogic _logic;
public FormTeachers(ITeacherLogic logic)
{
InitializeComponent();
_logic = logic;
}
private void FormTeachers_Load(object sender, EventArgs e)
{
LoadData();
}
private void LoadData()
{
try
{
var list = _logic.ReadList(null);
if (list != null)
{
dataGridView.DataSource = list;
dataGridView.Columns["TeacherName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
dataGridView.Columns["TeacherSubjects"].Visible = false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonAdd_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormTeacher));
if (service is FormTeacher form)
{
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
private void buttonUpd_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
var service = Program.ServiceProvider?.GetService(typeof(FormTeacher));
if (service is FormTeacher form)
{
form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
}
private void buttonDel_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
try
{
if (!_logic.Delete(new TeacherBindingModel { Id = id }))
{
throw new Exception("Ошибка при удалении. Доп информация в логах");
}
LoadData();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
}

120
Journal/FormTeachers.resx Normal file
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,37 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\JournalBusinessLogic\JournalBusinessLogic.csproj" />
<ProjectReference Include="..\JournalContracts\JournalContracts.csproj" />
<ProjectReference Include="..\JournalDataBaseImplement\JournalDataBaseImplement.csproj" />
<ProjectReference Include="..\JournalDataModels\JournalDataModels.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="FormSelectSubject.cs">
<SubType>Form</SubType>
</Compile>
<Compile Update="FormStudent.cs">
<SubType>Form</SubType>
</Compile>
</ItemGroup>
</Project>

56
Journal/Program.cs Normal file
View File

@ -0,0 +1,56 @@
using JournalBusinessLogic.BusinessLogics;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.StoragesContracts;
using JournalDataBaseImplement.Implements;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SushiBarView;
namespace JournalView
{
internal static class Program
{
private static ServiceProvider? _serviceProvider;
public static ServiceProvider? ServiceProvider => _serviceProvider;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
var services = new ServiceCollection();
ConfigureServices(services);
_serviceProvider = services.BuildServiceProvider();
Application.Run(_serviceProvider.GetRequiredService<FormMain>());
}
private static void ConfigureServices(ServiceCollection services)
{
services.AddTransient<IStudentStorage, StudentStorage>();
services.AddTransient<ITeacherStorage, TeacherStorage>();
services.AddTransient<IGroupStorage, GroupStorage>();
services.AddTransient<ISubjectStorage, SubjectStorage>();
services.AddTransient<IStudentLogic, StudentLogic>();
services.AddTransient<ITeacherLogic, TeacherLogic>();
services.AddTransient<IGroupLogic, GroupLogic>();
services.AddTransient<ISubjectLogic, SubjectLogic>();
services.AddTransient<FormMain>();
services.AddTransient<FormStudents>();
services.AddTransient<FormStudent>();
services.AddTransient<FormTeachers>();
services.AddTransient<FormTeacher>();
services.AddTransient<FormSubject>();
services.AddTransient<FormSubjects>();
services.AddTransient<FormSelectSubject>();
services.AddTransient<FormGroups>();
services.AddTransient<FormGroup>();
services.AddTransient<FormTeacher>();
services.AddTransient<FormGrade>();
}
}
}

View File

@ -0,0 +1,93 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.SearchModels;
using JournalContracts.StoragesContracts;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalBusinessLogic.BusinessLogics
{
public class GroupLogic : IGroupLogic
{
private readonly IGroupStorage _groupStorage;
public GroupLogic(IGroupStorage groupStorage)
{
_groupStorage = groupStorage;
}
public GroupViewModel? ReadElement(GroupSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
var element = _groupStorage.GetElement(model);
if (element == null)
{
return null;
}
return element;
}
public List<GroupViewModel>? ReadList(GroupSearchModel? model)
{
var list = model == null ? _groupStorage.GetFullList() : _groupStorage.GetFilteredList(model);
if (list == null)
{
return null;
}
return list;
}
public bool Create(GroupBindingModel model)
{
CheckModel(model);
if (_groupStorage.Insert(model) == null)
{
return false;
}
return true;
}
public bool Delete(GroupBindingModel model)
{
CheckModel(model, false);
if (_groupStorage.Delete(model) == null)
{
return false;
}
return true;
}
public bool Update(GroupBindingModel model)
{
CheckModel(model);
if (_groupStorage.Update(model) == null)
{
return false;
}
return true;
}
private void CheckModel(GroupBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (!withParams)
{
return;
}
if (string.IsNullOrEmpty(model.GroupName))
{
throw new ArgumentNullException("Нет названия", nameof(model.GroupName));
}
}
}
}

View File

@ -0,0 +1,94 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.SearchModels;
using JournalContracts.StoragesContracts;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalBusinessLogic.BusinessLogics
{
public class StudentLogic : IStudentLogic
{
private readonly IStudentStorage _studentStorage;
public StudentLogic(IStudentStorage studentStorage)
{
_studentStorage = studentStorage;
}
public StudentViewModel? ReadElement(StudentSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
var element = _studentStorage.GetElement(model);
if (element == null)
{
return null;
}
return element;
}
public List<StudentViewModel>? ReadList(StudentSearchModel? model)
{
var list = model == null ? _studentStorage.GetFullList() : _studentStorage.GetFilteredList(model);
if (list == null)
{
return null;
}
return list;
}
public bool Create(StudentBindingModel model)
{
CheckModel(model);
if (_studentStorage.Insert(model) == null)
{
return false;
}
return true;
}
public bool Delete(StudentBindingModel model)
{
CheckModel(model, false);
if (_studentStorage.Delete(model) == null)
{
return false;
}
return true;
}
public bool Update(StudentBindingModel model)
{
CheckModel(model);
if (_studentStorage.Update(model) == null)
{
return false;
}
return true;
}
private void CheckModel(StudentBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (!withParams)
{
return;
}
if (string.IsNullOrEmpty(model.StudentName))
{
throw new ArgumentNullException("Нет названия", nameof(model.StudentName));
}
}
}
}

View File

@ -0,0 +1,93 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.SearchModels;
using JournalContracts.StoragesContracts;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalBusinessLogic.BusinessLogics
{
public class SubjectLogic : ISubjectLogic
{
private readonly ISubjectStorage _subjectStorage;
public SubjectLogic(ISubjectStorage subjectStorage)
{
_subjectStorage = subjectStorage;
}
public SubjectViewModel? ReadElement(SubjectSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
var element = _subjectStorage.GetElement(model);
if (element == null)
{
return null;
}
return element;
}
public List<SubjectViewModel>? ReadList(SubjectSearchModel? model)
{
var list = model == null ? _subjectStorage.GetFullList() : _subjectStorage.GetFilteredList(model);
if (list == null)
{
return null;
}
return list;
}
public bool Create(SubjectBindingModel model)
{
CheckModel(model);
if (_subjectStorage.Insert(model) == null)
{
return false;
}
return true;
}
public bool Delete(SubjectBindingModel model)
{
CheckModel(model, false);
if (_subjectStorage.Delete(model) == null)
{
return false;
}
return true;
}
public bool Update(SubjectBindingModel model)
{
CheckModel(model);
if (_subjectStorage.Update(model) == null)
{
return false;
}
return true;
}
private void CheckModel(SubjectBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (!withParams)
{
return;
}
if (string.IsNullOrEmpty(model.SubjectName.ToString()))
{
throw new ArgumentNullException("Нет названия", nameof(model.SubjectName));
}
}
}
}

View File

@ -0,0 +1,93 @@
using JournalContracts.BindingModels;
using JournalContracts.BusinessLogicContracts;
using JournalContracts.SearchModels;
using JournalContracts.StoragesContracts;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalBusinessLogic.BusinessLogics
{
public class TeacherLogic : ITeacherLogic
{
private readonly ITeacherStorage _teacherStorage;
public TeacherLogic(ITeacherStorage teacherStorage)
{
_teacherStorage = teacherStorage;
}
public TeacherViewModel? ReadElement(TeacherSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
var element = _teacherStorage.GetElement(model);
if (element == null)
{
return null;
}
return element;
}
public List<TeacherViewModel>? ReadList(TeacherSearchModel? model)
{
var list = model == null ? _teacherStorage.GetFullList() : _teacherStorage.GetFilteredList(model);
if (list == null)
{
return null;
}
return list;
}
public bool Create(TeacherBindingModel model)
{
CheckModel(model);
if (_teacherStorage.Insert(model) == null)
{
return false;
}
return true;
}
public bool Delete(TeacherBindingModel model)
{
CheckModel(model, false);
if (_teacherStorage.Delete(model) == null)
{
return false;
}
return true;
}
public bool Update(TeacherBindingModel model)
{
CheckModel(model);
if (_teacherStorage.Update(model) == null)
{
return false;
}
return true;
}
private void CheckModel(TeacherBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (!withParams)
{
return;
}
if (string.IsNullOrEmpty(model.TeacherName))
{
throw new ArgumentNullException("Нет названия", nameof(model.TeacherName));
}
}
}
}

View File

@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\JournalContracts\JournalContracts.csproj" />
<ProjectReference Include="..\JournalDataModels\JournalDataModels.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,17 @@
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.BindingModels
{
public class GroupBindingModel : IGroupModel
{
public int Id { get; set; }
public string GroupName { get; set; } = string.Empty;
public int Course { get; set; }
}
}

View File

@ -0,0 +1,25 @@
using JournalContracts.StoragesContracts;
using JournalDataModels.Enum;
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.BindingModels
{
public class StudentBindingModel : IStudentModel
{
public int Id { get; set; }
public string StudentName { get; set; } = String.Empty;
public string? Email { get; set; }
public int BookNumber { get; set; }
public int GroupId { get; set; }
public Dictionary<int, (ISubjectModel, ExamType, int)> StudentGrades { get; set; } = new ();
}
}

View File

@ -0,0 +1,19 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using JournalDataModels.Models;
namespace JournalContracts.BindingModels
{
public class SubjectBindingModel : ISubjectModel
{
public int Id { get; set; }
public string SubjectName { get; set; } = string.Empty;
public int Hours { get; set; }
}
}

View File

@ -0,0 +1,24 @@
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.BindingModels
{
public class TeacherBindingModel : ITeacherModel
{
public int Id { get; set; }
public string TeacherName { get; set; } = string.Empty;
public int Experience { get; set; }
public string Position { get; set; } = string.Empty;
public string Cafedra { get; set; } = string.Empty;
public Dictionary<int, ISubjectModel> TeacherSubjects { get; set; } = new();
}
}

View File

@ -0,0 +1,21 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.BusinessLogicContracts
{
public interface IGroupLogic
{
List<GroupViewModel>? ReadList(GroupSearchModel? model);
GroupViewModel? ReadElement(GroupSearchModel model);
bool Create(GroupBindingModel model);
bool Update(GroupBindingModel model);
bool Delete(GroupBindingModel model);
}
}

View File

@ -0,0 +1,20 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.BusinessLogicContracts
{
public interface IStudentLogic
{
List<StudentViewModel>? ReadList(StudentSearchModel? model);
StudentViewModel? ReadElement(StudentSearchModel model);
bool Create(StudentBindingModel model);
bool Update(StudentBindingModel model);
bool Delete(StudentBindingModel model);
}
}

View File

@ -0,0 +1,21 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.BusinessLogicContracts
{
public interface ISubjectLogic
{
List<SubjectViewModel>? ReadList(SubjectSearchModel? model);
SubjectViewModel? ReadElement(SubjectSearchModel model);
bool Create(SubjectBindingModel model);
bool Update(SubjectBindingModel model);
bool Delete(SubjectBindingModel model);
}
}

View File

@ -0,0 +1,21 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.BusinessLogicContracts
{
public interface ITeacherLogic
{
List<TeacherViewModel>? ReadList(TeacherSearchModel? model);
TeacherViewModel? ReadElement(TeacherSearchModel model);
bool Create(TeacherBindingModel model);
bool Update(TeacherBindingModel model);
bool Delete(TeacherBindingModel model);
}
}

View File

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\JournalDataModels\JournalDataModels.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.SearchModels
{
public class GroupSearchModel
{
public int? Id { get; set; }
public string? GroupName { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.SearchModels
{
public class StudentSearchModel
{
public int? Id { get; set; }
public string? StudentName { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.SearchModels
{
public class SubjectSearchModel
{
public int? Id { get; set; }
public string? SubjectName { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.SearchModels
{
public class TeacherSearchModel
{
public int? Id { get; set; }
public string? TeacherName { get; set; }
}
}

View File

@ -0,0 +1,22 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.StoragesContracts
{
public interface IGroupStorage
{
List<GroupViewModel> GetFullList();
List<GroupViewModel> GetFilteredList(GroupSearchModel model);
GroupViewModel? GetElement(GroupSearchModel model);
GroupViewModel? Insert(GroupBindingModel model);
GroupViewModel? Update(GroupBindingModel model);
GroupViewModel? Delete(GroupBindingModel model);
}
}

View File

@ -0,0 +1,22 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.StoragesContracts
{
public interface IStudentStorage
{
List<StudentViewModel> GetFullList();
List<StudentViewModel> GetFilteredList(StudentSearchModel model);
StudentViewModel? GetElement(StudentSearchModel model);
StudentViewModel? Insert(StudentBindingModel model);
StudentViewModel? Update(StudentBindingModel model);
StudentViewModel? Delete(StudentBindingModel model);
}
}

View File

@ -0,0 +1,22 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.StoragesContracts
{
public interface ISubjectStorage
{
List<SubjectViewModel> GetFullList();
List<SubjectViewModel> GetFilteredList(SubjectSearchModel model);
SubjectViewModel? GetElement(SubjectSearchModel model);
SubjectViewModel? Insert(SubjectBindingModel model);
SubjectViewModel? Update(SubjectBindingModel model);
SubjectViewModel? Delete(SubjectBindingModel model);
}
}

View File

@ -0,0 +1,22 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalContracts.StoragesContracts
{
public interface ITeacherStorage
{
List<TeacherViewModel> GetFullList();
List<TeacherViewModel> GetFilteredList(TeacherSearchModel model);
TeacherViewModel? GetElement(TeacherSearchModel model);
TeacherViewModel? Insert(TeacherBindingModel model);
TeacherViewModel? Update(TeacherBindingModel model);
TeacherViewModel? Delete(TeacherBindingModel model);
}
}

View File

@ -0,0 +1,20 @@
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace JournalContracts.ViewModels
{
public class GroupViewModel : IGroupModel
{
public int Id { get; set; }
[DisplayName("Название группы")]
public string GroupName { get; set; } = string.Empty;
[DisplayName("Номер курса")]
public int Course { get; set; }
}
}

View File

@ -0,0 +1,28 @@
using JournalDataModels.Enum;
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace JournalContracts.ViewModels
{
public class StudentViewModel : IStudentModel
{
public int Id { get; set; }
[DisplayName("Имя студента")]
public string StudentName { get; set; } = string.Empty;
[DisplayName("Почта")]
public string? Email { get; set; }
[DisplayName("Номер книжки")]
public int BookNumber { get; set; }
public int GroupId { get; set; }
[DisplayName("Группа")]
public int GroupName { get; set; }
public Dictionary<int, (ISubjectModel, ExamType, int)> StudentGrades { get; set; } = new();
}
}

View File

@ -0,0 +1,20 @@
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace JournalContracts.ViewModels
{
public class SubjectViewModel : ISubjectModel
{
public int Id { get; set; }
[DisplayName("Название предмета")]
public string SubjectName { get; set; } = string.Empty;
[DisplayName("Кол-во часов")]
public int Hours { get; set; }
}
}

View File

@ -0,0 +1,27 @@
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace JournalContracts.ViewModels
{
public class TeacherViewModel : ITeacherModel
{
public int Id { get; set; }
[DisplayName("ФИО преподавателя")]
public string TeacherName { get; set; } = string.Empty;
[DisplayName("Опыт работы")]
public int Experience { get; set; }
[DisplayName("Должность")]
public string Position { get; set; } = string.Empty;
[DisplayName("Кафедра")]
public string Cafedra { get; set; } = string.Empty;
public Dictionary<int, ISubjectModel> TeacherSubjects { get; set; } = new();
}
}

View File

@ -0,0 +1,14 @@
namespace JournalDataModels.Enum
{
public enum ExamType
{
Лекция = 0,
Зачет = 1,
Экзамен = 2,
Лабораторная = 3
}
}

View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JournalDataModels.Enum
{
public class KOSTILISHE
{
public ExamType pole { get; set; }
public int pomogi { get; set; }
public KOSTILISHE(ExamType ex) {
pole = ex;
pomogi = (int)pole;
}
}
}

13
JournalDataModels/IId.cs Normal file
View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalDataModels
{
public interface IId
{
int Id { get; }
}
}

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,16 @@
using JournalDataModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalDataModels.Models
{
public interface IGroupModel : IId
{
string GroupName { get; }
int Course { get; }
}
}

View File

@ -0,0 +1,23 @@
using JournalDataModels;
using JournalDataModels.Enum;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalDataModels.Models
{
public interface IStudentModel : IId
{
string StudentName { get; }
//чиним BirthDate
string? Email { get; }
int BookNumber { get; }
int GroupId { get; }
Dictionary<int, (ISubjectModel, ExamType, int)> StudentGrades { get; }
}
}

View File

@ -0,0 +1,15 @@
using JournalDataModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalDataModels.Models
{
public interface ISubjectModel : IId
{
string SubjectName { get; }
int Hours { get; }
}
}

View File

@ -0,0 +1,12 @@
namespace JournalDataModels.Models
{
public interface ITeacherModel : IId
{
string TeacherName { get; }
string Position { get; }
int Experience { get; }
string Cafedra { get; }
Dictionary<int, ISubjectModel> TeacherSubjects { get; }
}
}

View File

@ -0,0 +1,78 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.StoragesContracts;
using JournalContracts.ViewModels;
using JournalDataBaseImplement.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Implements
{
public class GroupStorage : IGroupStorage
{
public GroupViewModel? Delete(GroupBindingModel model)
{
using var context = new JournalDataBase();
var element = context.Groups.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
context.Groups.Remove(element);
context.SaveChanges();
return element.GetViewModel;
}
return null;
}
public GroupViewModel? GetElement(GroupSearchModel model)
{
using var context = new JournalDataBase();
return context.Groups.FirstOrDefault(x => !string.IsNullOrEmpty(model.GroupName) && x.GroupName == model.GroupName || model.Id.HasValue && x.Id == model.Id)?.GetViewModel;
}
public List<GroupViewModel> GetFilteredList(GroupSearchModel model)
{
if (string.IsNullOrEmpty(model.GroupName))
{
return new();
}
using var context = new JournalDataBase();
return context.Groups.Where(x => x.GroupName.Contains(model.GroupName)).Select(x => x.GetViewModel).ToList();
}
public List<GroupViewModel> GetFullList()
{
using var context = new JournalDataBase();
return context.Groups.Select(x => x.GetViewModel).ToList();
}
public GroupViewModel? Insert(GroupBindingModel model)
{
var newMenu = Group.Create(model);
if (newMenu == null)
{
return null;
}
using var context = new JournalDataBase();
context.Groups.Add(newMenu);
context.SaveChanges();
return newMenu.GetViewModel;
}
public GroupViewModel? Update(GroupBindingModel model)
{
using var context = new JournalDataBase();
var component = context.Groups.FirstOrDefault(x => x.Id == model.Id);
if (component == null)
{
return null;
}
component.Update(model);
context.SaveChanges();
return component.GetViewModel;
}
}
}

View File

@ -0,0 +1,82 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.StoragesContracts;
using JournalContracts.ViewModels;
using JournalDataBaseImplement.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Implements
{
public class StudentStorage : IStudentStorage
{
public List<StudentViewModel> GetFilteredList(StudentSearchModel model)
{
if (string.IsNullOrEmpty(model.StudentName))
{
return new();
}
using var context = new JournalDataBase();
return context.Students.Include(x => x.Grades).Where(x => x.StudentName.Contains(model.StudentName)).Select(x => x.GetViewModel).ToList();
}
public List<StudentViewModel> GetFullList()
{
using var context = new JournalDataBase();
return context.Students.Include(x => x.Grades).Select(x => x.GetViewModel).ToList();
}
public StudentViewModel? Delete(StudentBindingModel model)
{
using var context = new JournalDataBase();
var element = context.Students
.Include(x => x.Grades)
.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
context.Students.Remove(element);
context.SaveChanges();
return element.GetViewModel;
}
return null;
}
public StudentViewModel? GetElement(StudentSearchModel model)
{
using var context = new JournalDataBase();
return context.Students.Include(x => x.Grades).FirstOrDefault(x => !string.IsNullOrEmpty(model.StudentName) && x.StudentName == model.StudentName || model.Id.HasValue && x.Id == model.Id)?.GetViewModel;
}
public StudentViewModel? Insert(StudentBindingModel model)
{
using var context = new JournalDataBase();
var newStudent = Student.Create(context,model);
if (newStudent == null)
{
return null;
}
context.Students.Add(newStudent);
context.SaveChanges();
return newStudent.GetViewModel;
}
public StudentViewModel? Update(StudentBindingModel model)
{
using var context = new JournalDataBase();
var component = context.Students.FirstOrDefault(x => x.Id == model.Id);
if (component == null)
{
return null;
}
component.Update(model);
context.SaveChanges();
component.UpdateGrades(context, model);
return component.GetViewModel;
}
}
}

View File

@ -0,0 +1,87 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.StoragesContracts;
using JournalContracts.ViewModels;
using JournalDataBaseImplement.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Implements
{
public class SubjectStorage : ISubjectStorage
{
public SubjectViewModel? Delete(SubjectBindingModel model)
{
using var context = new JournalDataBase();
var element = context.Subjects.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
context.Subjects.Remove(element);
context.SaveChanges();
return element.GetViewModel;
}
return null;
}
public SubjectViewModel? GetElement(SubjectSearchModel model)
{
using var context = new JournalDataBase();
return context.Subjects.FirstOrDefault(x => !string.IsNullOrEmpty(model.SubjectName.ToString()) && x.SubjectName.ToString() == model.SubjectName.ToString() || model.Id.HasValue && x.Id == model.Id)?.GetViewModel;
}
public List<SubjectViewModel> GetFilteredList(SubjectSearchModel model)
{
if (string.IsNullOrEmpty(model.SubjectName.ToString()))
{
return new();
}
using var context = new JournalDataBase();
return context.Subjects.Where(x => x.SubjectName.ToString().Contains(model.SubjectName.ToString())).Select(x => x.GetViewModel).ToList();
}
public List<SubjectViewModel> GetFullList()
{
using var context = new JournalDataBase();
return context.Subjects.Select(x => x.GetViewModel).ToList();
}
public SubjectViewModel? Insert(SubjectBindingModel model)
{
var newSubject = Subject.Create(model);
if (newSubject == null)
{
return null;
}
using var context = new JournalDataBase();
context.Subjects.Add(newSubject);
context.SaveChanges();
return newSubject.GetViewModel;
}
public SubjectViewModel? Update(SubjectBindingModel model)
{
using var context = new JournalDataBase();
using var transaction = context.Database.BeginTransaction();
try
{
var component = context.Subjects.FirstOrDefault(x => x.Id == model.Id);
if (component == null)
{
return null;
}
component.Update(model);
context.SaveChanges();
return component.GetViewModel;
}
catch
{
transaction.Rollback();
throw;
}
}
}
}

View File

@ -0,0 +1,99 @@
using JournalContracts.BindingModels;
using JournalContracts.SearchModels;
using JournalContracts.StoragesContracts;
using JournalContracts.ViewModels;
using JournalDataBaseImplement.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Implements
{
public class TeacherStorage : ITeacherStorage
{
public TeacherViewModel? Delete(TeacherBindingModel model)
{
using var context = new JournalDataBase();
var element = context.Teachers
.Include(x => x.Subjects)
.ThenInclude(x => x.Subject)
.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
context.Teachers.Remove(element);
context.SaveChanges();
return element.GetViewModel;
}
return null;
}
public TeacherViewModel? GetElement(TeacherSearchModel model)
{
using var context = new JournalDataBase();
return context.Teachers
.Include(x => x.Subjects)
.ThenInclude(x => x.Subject)
.FirstOrDefault(x => !string.IsNullOrEmpty(model.TeacherName) && x.TeacherName == model.TeacherName || model.Id.HasValue && x.Id == model.Id)?.GetViewModel;
}
public List<TeacherViewModel> GetFilteredList(TeacherSearchModel model)
{
if (string.IsNullOrEmpty(model.TeacherName))
{
return new();
}
using var context = new JournalDataBase();
return context.Teachers
.Include(x => x.Subjects)
.ThenInclude(x => x.Subject)
.Where(x => x.TeacherName.Contains(model.TeacherName)).Select(x => x.GetViewModel).ToList();
}
public List<TeacherViewModel> GetFullList()
{
using var context = new JournalDataBase();
return context.Teachers.Include(x => x.Subjects).ThenInclude(x => x.Subject).Select(x => x.GetViewModel).ToList();
}
public TeacherViewModel? Insert(TeacherBindingModel model)
{
using var context = new JournalDataBase();
var newTeacher = Teacher.Create(context,model);
if (newTeacher == null)
{
return null;
}
context.Teachers.Add(newTeacher);
context.SaveChanges();
return newTeacher.GetViewModel;
}
public TeacherViewModel? Update(TeacherBindingModel model)
{
using var context = new JournalDataBase();
using var transaction = context.Database.BeginTransaction();
try
{
var component = context.Teachers.FirstOrDefault(x => x.Id == model.Id);
if (component == null)
{
return null;
}
component.Update(model);
context.SaveChanges();
component.UpdateSubjects(context, model);
transaction.Commit();
return component.GetViewModel;
}
catch
{
transaction.Rollback();
throw;
}
}
}
}

View File

@ -0,0 +1,31 @@
using JournalDataBaseImplement.Models;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement
{
public class JournalDataBase : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (optionsBuilder.IsConfigured == false)
{
optionsBuilder.UseNpgsql(@"Host=localhost;Database=JournalDataBase;Username=postgres;Password=postgres");
}
base.OnConfiguring(optionsBuilder);
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
}
public virtual DbSet<Student> Students { get; set; }
public virtual DbSet<Teacher> Teachers { get; set; }
public virtual DbSet<Group> Groups { get; set; }
public virtual DbSet<Subject> Subjects { get; set; }
public virtual DbSet<Grade> StudentGrades { get; set; }
public virtual DbSet<TeacherSubject> TeacherSubjects { get; set; }
}
}

View File

@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\JournalBusinessLogic\JournalBusinessLogic.csproj" />
<ProjectReference Include="..\JournalContracts\JournalContracts.csproj" />
<ProjectReference Include="..\JournalDataModels\JournalDataModels.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Migrations\" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,230 @@
// <auto-generated />
using JournalDataBaseImplement;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace JournalDatabaseImplement.Migrations
{
[DbContext(typeof(JournalDataBase))]
[Migration("20240503203216_pereehali")]
partial class pereehali
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("JournalDataBaseImplement.Models.Grade", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Mark")
.HasColumnType("integer");
b.Property<int>("StudentId")
.HasColumnType("integer");
b.Property<int>("SubjectId")
.HasColumnType("integer");
b.Property<int>("Type")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("StudentId");
b.HasIndex("SubjectId");
b.ToTable("StudentGrades");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Group", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Course")
.HasColumnType("integer");
b.Property<string>("GroupName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Groups");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Student", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("BookNumber")
.HasColumnType("integer");
b.Property<string>("Email")
.HasColumnType("text");
b.Property<int>("GroupId")
.HasColumnType("integer");
b.Property<string>("StudentName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Students");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Subject", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Hours")
.HasColumnType("integer");
b.Property<string>("SubjectName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Subjects");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Teacher", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Cafedra")
.IsRequired()
.HasColumnType("text");
b.Property<int>("Experience")
.HasColumnType("integer");
b.Property<string>("Position")
.IsRequired()
.HasColumnType("text");
b.Property<string>("TeacherName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Teachers");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.TeacherSubject", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("SubjectId")
.HasColumnType("integer");
b.Property<int>("TeacherId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SubjectId");
b.HasIndex("TeacherId");
b.ToTable("TeacherSubjects");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Grade", b =>
{
b.HasOne("JournalDataBaseImplement.Models.Student", "Student")
.WithMany("Grades")
.HasForeignKey("StudentId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("JournalDataBaseImplement.Models.Subject", "Subject")
.WithMany("Grade")
.HasForeignKey("SubjectId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Student");
b.Navigation("Subject");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.TeacherSubject", b =>
{
b.HasOne("JournalDataBaseImplement.Models.Subject", "Subject")
.WithMany("TeacherSubjects")
.HasForeignKey("SubjectId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("JournalDataBaseImplement.Models.Teacher", "Teacher")
.WithMany("Subjects")
.HasForeignKey("TeacherId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Subject");
b.Navigation("Teacher");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Student", b =>
{
b.Navigation("Grades");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Subject", b =>
{
b.Navigation("Grade");
b.Navigation("TeacherSubjects");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Teacher", b =>
{
b.Navigation("Subjects");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,171 @@
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace JournalDatabaseImplement.Migrations
{
/// <inheritdoc />
public partial class pereehali : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Groups",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
GroupName = table.Column<string>(type: "text", nullable: false),
Course = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Groups", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Students",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StudentName = table.Column<string>(type: "text", nullable: false),
Email = table.Column<string>(type: "text", nullable: true),
BookNumber = table.Column<int>(type: "integer", nullable: false),
GroupId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Students", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Subjects",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
SubjectName = table.Column<string>(type: "text", nullable: false),
Hours = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Subjects", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Teachers",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
TeacherName = table.Column<string>(type: "text", nullable: false),
Experience = table.Column<int>(type: "integer", nullable: false),
Position = table.Column<string>(type: "text", nullable: false),
Cafedra = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Teachers", x => x.Id);
});
migrationBuilder.CreateTable(
name: "StudentGrades",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
StudentId = table.Column<int>(type: "integer", nullable: false),
SubjectId = table.Column<int>(type: "integer", nullable: false),
Type = table.Column<int>(type: "integer", nullable: false),
Mark = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_StudentGrades", x => x.Id);
table.ForeignKey(
name: "FK_StudentGrades_Students_StudentId",
column: x => x.StudentId,
principalTable: "Students",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_StudentGrades_Subjects_SubjectId",
column: x => x.SubjectId,
principalTable: "Subjects",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "TeacherSubjects",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
SubjectId = table.Column<int>(type: "integer", nullable: false),
TeacherId = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_TeacherSubjects", x => x.Id);
table.ForeignKey(
name: "FK_TeacherSubjects_Subjects_SubjectId",
column: x => x.SubjectId,
principalTable: "Subjects",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_TeacherSubjects_Teachers_TeacherId",
column: x => x.TeacherId,
principalTable: "Teachers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_StudentGrades_StudentId",
table: "StudentGrades",
column: "StudentId");
migrationBuilder.CreateIndex(
name: "IX_StudentGrades_SubjectId",
table: "StudentGrades",
column: "SubjectId");
migrationBuilder.CreateIndex(
name: "IX_TeacherSubjects_SubjectId",
table: "TeacherSubjects",
column: "SubjectId");
migrationBuilder.CreateIndex(
name: "IX_TeacherSubjects_TeacherId",
table: "TeacherSubjects",
column: "TeacherId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Groups");
migrationBuilder.DropTable(
name: "StudentGrades");
migrationBuilder.DropTable(
name: "TeacherSubjects");
migrationBuilder.DropTable(
name: "Students");
migrationBuilder.DropTable(
name: "Subjects");
migrationBuilder.DropTable(
name: "Teachers");
}
}
}

View File

@ -0,0 +1,227 @@
// <auto-generated />
using JournalDataBaseImplement;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace JournalDatabaseImplement.Migrations
{
[DbContext(typeof(JournalDataBase))]
partial class JournalDataBaseModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("JournalDataBaseImplement.Models.Grade", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Mark")
.HasColumnType("integer");
b.Property<int>("StudentId")
.HasColumnType("integer");
b.Property<int>("SubjectId")
.HasColumnType("integer");
b.Property<int>("Type")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("StudentId");
b.HasIndex("SubjectId");
b.ToTable("StudentGrades");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Group", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Course")
.HasColumnType("integer");
b.Property<string>("GroupName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Groups");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Student", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("BookNumber")
.HasColumnType("integer");
b.Property<string>("Email")
.HasColumnType("text");
b.Property<int>("GroupId")
.HasColumnType("integer");
b.Property<string>("StudentName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Students");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Subject", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("Hours")
.HasColumnType("integer");
b.Property<string>("SubjectName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Subjects");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Teacher", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Cafedra")
.IsRequired()
.HasColumnType("text");
b.Property<int>("Experience")
.HasColumnType("integer");
b.Property<string>("Position")
.IsRequired()
.HasColumnType("text");
b.Property<string>("TeacherName")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("Teachers");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.TeacherSubject", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("SubjectId")
.HasColumnType("integer");
b.Property<int>("TeacherId")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("SubjectId");
b.HasIndex("TeacherId");
b.ToTable("TeacherSubjects");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Grade", b =>
{
b.HasOne("JournalDataBaseImplement.Models.Student", "Student")
.WithMany("Grades")
.HasForeignKey("StudentId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("JournalDataBaseImplement.Models.Subject", "Subject")
.WithMany("Grade")
.HasForeignKey("SubjectId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Student");
b.Navigation("Subject");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.TeacherSubject", b =>
{
b.HasOne("JournalDataBaseImplement.Models.Subject", "Subject")
.WithMany("TeacherSubjects")
.HasForeignKey("SubjectId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("JournalDataBaseImplement.Models.Teacher", "Teacher")
.WithMany("Subjects")
.HasForeignKey("TeacherId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Subject");
b.Navigation("Teacher");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Student", b =>
{
b.Navigation("Grades");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Subject", b =>
{
b.Navigation("Grade");
b.Navigation("TeacherSubjects");
});
modelBuilder.Entity("JournalDataBaseImplement.Models.Teacher", b =>
{
b.Navigation("Subjects");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,29 @@
using JournalContracts.BindingModels;
using JournalContracts.ViewModels;
using JournalDataBaseImplement;
using JournalDataModels.Enum;
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Models
{
public class Grade
{
public int Id { get; set; }
[Required]
public int StudentId { get; set; }
[Required]
public int SubjectId { get; set; }
public ExamType Type { get; set; }
public int Mark { get; set; }
public virtual Subject Subject { get; set; } = new();
public virtual Student Student { get; set; } = new();
}
}

View File

@ -0,0 +1,48 @@
using JournalContracts.BindingModels;
using JournalContracts.ViewModels;
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Models
{
public class Group : IGroupModel
{
public int Id { get; set; }
[Required]
public string GroupName { get; set; } = string.Empty;
[Required]
public int Course { get; set; }
public static Group? Create(GroupBindingModel model)
{
if (model == null) return null;
return new Group()
{
Id = model.Id,
GroupName = model.GroupName,
Course = model.Course,
};
}
public void Update(GroupBindingModel model)
{
if (model == null) return;
Id = model.Id;
GroupName = model.GroupName;
Course = model.Course;
}
public GroupViewModel GetViewModel => new()
{
Id = Id,
GroupName = GroupName,
Course = Course,
};
}
}

View File

@ -0,0 +1,99 @@
using JournalContracts.BindingModels;
using JournalContracts.ViewModels;
using JournalDataModels.Enum;
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Models
{
public class Student : IStudentModel
{
public int Id { get; set; }
[Required]
public string StudentName { get; set; } = string.Empty;
public string? Email { get; set; }
[Required]
public int BookNumber { get; set; }
[Required]
public int GroupId { get; set; }
[ForeignKey("StudentId")]
public virtual List<Grade> Grades { get; set; } = new();
private Dictionary<int, (ISubjectModel, ExamType, int)>? _studentGrades = null;
[NotMapped]
public Dictionary<int, (ISubjectModel,ExamType, int)> StudentGrades {
get
{
if (_studentGrades == null)
{
_studentGrades = Grades.ToDictionary(recPC => recPC.SubjectId, recPC =>
(recPC.Subject as ISubjectModel, recPC.Type, recPC.Mark));
}
return _studentGrades;
}
}
public static Student? Create(JournalDataBase context, StudentBindingModel model)
{
if (model == null) return null;
return new Student()
{
Id = model.Id,
StudentName = model.StudentName,
Email = model.Email,
BookNumber = model.BookNumber,
GroupId = model.GroupId,
Grades = model.StudentGrades.Select(x => new Grade
{
Subject = context.Subjects.First(y => y.Id == x.Key),
Type = x.Value.Item2,
Mark = x.Value.Item3
}).ToList()
};
}
public void Update(StudentBindingModel model)
{
if (model == null) return;
StudentName = model.StudentName;
Email = model.Email;
BookNumber = model.BookNumber;
}
public StudentViewModel GetViewModel => new()
{
Id = Id,
StudentName = StudentName,
Email = Email,
BookNumber = BookNumber,
GroupId = GroupId,
StudentGrades = StudentGrades
};
public void UpdateGrades(JournalDataBase context, StudentBindingModel model)
{
var student = context.Students.First(x => x.Id == Id);
foreach (var rc in model.StudentGrades)
{
context.StudentGrades.Add(new Grade
{
Student = student,
Subject = context.Subjects.First(x => x.Id == rc.Key),
Mark = rc.Value.Item3,
Type = rc.Value.Item2
});
context.SaveChanges();
}
_studentGrades = null;
}
}
}

View File

@ -0,0 +1,54 @@
using JournalContracts.BindingModels;
using JournalContracts.ViewModels;
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Models
{
public class Subject : ISubjectModel
{
[Required]
public int Id { get; set; }
[Required]
public string SubjectName { get; set; } = string.Empty;
[Required]
public int Hours { get; set; }
[ForeignKey("SubjectId")]
public virtual List<TeacherSubject> TeacherSubjects { get; set; } = new();
[ForeignKey("SubjectId")]
public virtual List<Grade> Grade { get; set; } = new();
public static Subject? Create(SubjectBindingModel model)
{
if (model == null)
{
return null;
}
return new Subject()
{
Id = model.Id,
SubjectName = model.SubjectName,
Hours = model.Hours
};
}
public void Update(SubjectBindingModel model)
{
if (model == null) return;
SubjectName = model.SubjectName;
Hours = model.Hours;
}
public SubjectViewModel GetViewModel => new()
{
Id = Id,
SubjectName = SubjectName,
Hours = Hours
};
}
}

View File

@ -0,0 +1,92 @@
using JournalContracts.BindingModels;
using JournalContracts.ViewModels;
using JournalDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Models
{
public class Teacher : ITeacherModel
{
public int Id { get; set; }
[Required]
public string TeacherName { get; set; } = string.Empty;
public int Experience { get; set; }
public string Position { get; set; } = string.Empty;
public string Cafedra { get; set; } = string.Empty;
private Dictionary<int, ISubjectModel>? _teacherSubjects = null;
[NotMapped]
public Dictionary<int, ISubjectModel> TeacherSubjects {
get
{
if (_teacherSubjects == null)
{
_teacherSubjects = Subjects.ToDictionary(recPC => recPC.SubjectId, recPC =>
recPC.Subject as ISubjectModel);
}
return _teacherSubjects;
}
}
[ForeignKey("TeacherId")]
public virtual List<TeacherSubject> Subjects { get; set; } = new();
public static Teacher? Create(JournalDataBase context, TeacherBindingModel model)
{
if (model == null) return null;
return new Teacher()
{
Id = model.Id,
TeacherName = model.TeacherName,
Experience = model.Experience,
Position = model.Position,
Cafedra = model.Cafedra,
Subjects = model.TeacherSubjects.Select(x => new TeacherSubject
{
Subject = context.Subjects.First(y => y.Id == x.Key),
}).ToList(),
};
}
public void Update(TeacherBindingModel model)
{
if (model == null) return;
TeacherName = model.TeacherName;
Experience = model.Experience;
Position = model.Position;
Cafedra = model.Cafedra;
}
public TeacherViewModel GetViewModel => new()
{
Id = Id,
TeacherName = TeacherName,
TeacherSubjects = TeacherSubjects,
Experience = Experience,
Position = Position,
Cafedra = Cafedra,
};
public void UpdateSubjects(JournalDataBase context, TeacherBindingModel model)
{
var teacher = context.Teachers.First(x => x.Id == Id);
foreach (var rc in model.TeacherSubjects)
{
context.TeacherSubjects.Add(new TeacherSubject
{
Teacher = teacher,
Subject = context.Subjects.First(x => x.Id == rc.Key),
});
context.SaveChanges();
}
_teacherSubjects = null;
}
}
}

View File

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
namespace JournalDataBaseImplement.Models
{
public class TeacherSubject
{
public int Id { get; set; }
[Required]
public int SubjectId { get; set; }
[Required]
public int TeacherId { get; set; }
public virtual Subject Subject { get; set; } = new();
public virtual Teacher Teacher { get; set; } = new();
}
}