diff --git a/Atelier/Atelier/Atelier.csproj b/Atelier/Atelier/Atelier.csproj
index b57c89e..ebb86e7 100644
--- a/Atelier/Atelier/Atelier.csproj
+++ b/Atelier/Atelier/Atelier.csproj
@@ -6,6 +6,30 @@
enable
true
enable
+ preview
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Entities/Client.cs b/Atelier/Atelier/Entities/Client.cs
new file mode 100644
index 0000000..d981a91
--- /dev/null
+++ b/Atelier/Atelier/Entities/Client.cs
@@ -0,0 +1,19 @@
+public class Client
+{
+ public int Id { get; private set; }
+ public string FirstName { get; private set; } = string.Empty;
+ public string LastName { get; private set; } = string.Empty;
+ public string ContactInformation { get; private set; } = string.Empty;
+ public static Client CreateEntity(int id, string firstName, string
+ lastName, string contactInformation)
+ {
+ return new Client
+ {
+ Id = id,
+ FirstName = firstName ?? string.Empty,
+ LastName = lastName ?? string.Empty,
+ ContactInformation = contactInformation ?? string.Empty,
+
+ };
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Entities/Enums/Color.cs b/Atelier/Atelier/Entities/Enums/Color.cs
new file mode 100644
index 0000000..d5f5d1d
--- /dev/null
+++ b/Atelier/Atelier/Entities/Enums/Color.cs
@@ -0,0 +1,13 @@
+public enum Color
+{
+ None = 0,
+ Black = 1,
+ Red = 2,
+ Blue = 3,
+ Green = 4,
+ Grey = 5,
+ Yellow = 6,
+ Pink = 7,
+ White = 8,
+ Purple = 9,
+}
diff --git a/Atelier/Atelier/Entities/Enums/FabricType.cs b/Atelier/Atelier/Entities/Enums/FabricType.cs
new file mode 100644
index 0000000..8c2aa75
--- /dev/null
+++ b/Atelier/Atelier/Entities/Enums/FabricType.cs
@@ -0,0 +1,9 @@
+[Flags]
+public enum FabricType
+{
+ None = 0,
+ Cotton = 1,
+ Silk = 2,
+ Linen = 4,
+ Polyester = 8
+}
diff --git a/Atelier/Atelier/Entities/Enums/ModelType.cs b/Atelier/Atelier/Entities/Enums/ModelType.cs
new file mode 100644
index 0000000..83557b2
--- /dev/null
+++ b/Atelier/Atelier/Entities/Enums/ModelType.cs
@@ -0,0 +1,9 @@
+[Flags]
+public enum ModelType
+{
+ None = 0,
+ Pants = 1,
+ Skirt = 2,
+ Dress = 4,
+ Jacket = 8
+}
diff --git a/Atelier/Atelier/Entities/Enums/Status.cs b/Atelier/Atelier/Entities/Enums/Status.cs
new file mode 100644
index 0000000..95c35b1
--- /dev/null
+++ b/Atelier/Atelier/Entities/Enums/Status.cs
@@ -0,0 +1,7 @@
+public enum Status
+{
+ None = 0,
+ Waiting = 1,
+ InProcess = 2,
+ Done = 3
+}
diff --git a/Atelier/Atelier/Entities/Fabric.cs b/Atelier/Atelier/Entities/Fabric.cs
new file mode 100644
index 0000000..fb6e783
--- /dev/null
+++ b/Atelier/Atelier/Entities/Fabric.cs
@@ -0,0 +1,18 @@
+public class Fabric
+{
+ public int Id { get; private set; }
+ public FabricType FabricType { get; private set; }
+ public Color Color { get; private set; }
+ public double Metrage { get; private set; }
+ public static Fabric CreateEntity(int id, FabricType fabricType, Color color, double metrage)
+ {
+ return new Fabric
+ {
+ Id = id,
+ FabricType = fabricType,
+ Color = color,
+ Metrage = metrage,
+
+ };
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Entities/FabricModel.cs b/Atelier/Atelier/Entities/FabricModel.cs
new file mode 100644
index 0000000..442ad77
--- /dev/null
+++ b/Atelier/Atelier/Entities/FabricModel.cs
@@ -0,0 +1,15 @@
+public class FabricModel
+{
+ public int FabricId { get; private set; }
+ public int ModelId { get; private set; }
+ public int Count { get; private set; }
+ public static FabricModel CreateElement(int fabricId, int modelId, int count)
+ {
+ return new FabricModel
+ {
+ FabricId = fabricId,
+ ModelId = modelId,
+ Count = count
+ };
+ }
+}
diff --git a/Atelier/Atelier/Entities/Model.cs b/Atelier/Atelier/Entities/Model.cs
new file mode 100644
index 0000000..11fe15a
--- /dev/null
+++ b/Atelier/Atelier/Entities/Model.cs
@@ -0,0 +1,21 @@
+using Microsoft.VisualBasic.FileIO;
+
+public class Model
+{
+ public int Id { get; private set; }
+ public ModelType ModelType { get; private set; }
+ public double Price { get; private set; }
+ public IEnumerable FabricModel { get;private set;} = [];
+
+ public static Model CreateEntity(int id, ModelType modelType,double price, IEnumerable fabricModel)
+ {
+ return new Model
+ {
+ Id = id,
+ ModelType = modelType,
+ Price = price,
+ FabricModel = fabricModel
+
+ };
+ }
+}
diff --git a/Atelier/Atelier/Entities/ModelOrder.cs b/Atelier/Atelier/Entities/ModelOrder.cs
new file mode 100644
index 0000000..d409dde
--- /dev/null
+++ b/Atelier/Atelier/Entities/ModelOrder.cs
@@ -0,0 +1,15 @@
+public class ModelOrder
+{
+ public int OrderId { get; private set; }
+ public int ModelId { get; private set; }
+ public int Count { get; private set; }
+ public static ModelOrder CreateElement(int orderId, int modelId, int count)
+ {
+ return new ModelOrder
+ {
+ OrderId = orderId,
+ ModelId = modelId,
+ Count = count
+ };
+ }
+}
diff --git a/Atelier/Atelier/Entities/Order.cs b/Atelier/Atelier/Entities/Order.cs
new file mode 100644
index 0000000..360d3c5
--- /dev/null
+++ b/Atelier/Atelier/Entities/Order.cs
@@ -0,0 +1,22 @@
+public class Order
+{
+ public int Id { get; private set; }
+ public DateTime Date { get; private set; }
+ public Status Status { get; private set; }
+ public int ClientId { get; private set; }
+ public FabricType FabricType { get; private set; }
+ public IEnumerable ModelOrder { get; private set; } = [];
+
+ public static Order CreateOperation(int id,DateTime date, Status status, int clientId, IEnumerable modelOrder)
+ {
+ return new Order
+ {
+ Id = id,
+ Date = DateTime.Now,
+ Status = status,
+ ClientId = clientId,
+ ModelOrder = modelOrder
+
+ };
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Entities/Storage.cs b/Atelier/Atelier/Entities/Storage.cs
new file mode 100644
index 0000000..16f8b25
--- /dev/null
+++ b/Atelier/Atelier/Entities/Storage.cs
@@ -0,0 +1,17 @@
+public class Storage
+{
+ public int Id { get; private set; }
+ public double StockMetrage { get; private set; }
+ public int FabricId { get; private set; }
+
+ public static Storage CreateOperation(int id, double stockMetrage, int fabricId)
+ {
+ return new Storage
+ {
+ Id = id,
+ StockMetrage = stockMetrage,
+ FabricId = fabricId
+
+ };
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Form1.Designer.cs b/Atelier/Atelier/Form1.Designer.cs
deleted file mode 100644
index 2349e22..0000000
--- a/Atelier/Atelier/Form1.Designer.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-namespace Atelier
-{
- partial class Form1
- {
- ///
- /// Required designer variable.
- ///
- private System.ComponentModel.IContainer components = null;
-
- ///
- /// Clean up any resources being used.
- ///
- /// true if managed resources should be disposed; otherwise, false.
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
-
- #region Windows Form Designer generated code
-
- ///
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- ///
- private void InitializeComponent()
- {
- this.components = new System.ComponentModel.Container();
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(800, 450);
- this.Text = "Form1";
- }
-
- #endregion
- }
-}
\ No newline at end of file
diff --git a/Atelier/Atelier/Form1.cs b/Atelier/Atelier/Form1.cs
deleted file mode 100644
index e84fdb4..0000000
--- a/Atelier/Atelier/Form1.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace Atelier
-{
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- }
-}
\ No newline at end of file
diff --git a/Atelier/Atelier/FormAtelier.Designer.cs b/Atelier/Atelier/FormAtelier.Designer.cs
new file mode 100644
index 0000000..504cdda
--- /dev/null
+++ b/Atelier/Atelier/FormAtelier.Designer.cs
@@ -0,0 +1,139 @@
+namespace Atelier
+{
+ partial class FormAtelier
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormAtelier));
+ menuStrip = new MenuStrip();
+ справочникиToolStripMenuItem = new ToolStripMenuItem();
+ ClientsToolStripMenuItem = new ToolStripMenuItem();
+ ModelsToolStripMenuItem = new ToolStripMenuItem();
+ FabricsToolStripMenuItem1 = new ToolStripMenuItem();
+ операцииToolStripMenuItem = new ToolStripMenuItem();
+ OrdersToolStripMenuItem = new ToolStripMenuItem();
+ StoragesToolStripMenuItem = new ToolStripMenuItem();
+ отчётыToolStripMenuItem = new ToolStripMenuItem();
+ menuStrip.SuspendLayout();
+ SuspendLayout();
+ //
+ // menuStrip
+ //
+ menuStrip.ImageScalingSize = new Size(20, 20);
+ menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, отчётыToolStripMenuItem });
+ menuStrip.Location = new Point(0, 0);
+ menuStrip.Name = "menuStrip";
+ menuStrip.Size = new Size(817, 28);
+ menuStrip.TabIndex = 0;
+ menuStrip.Text = "menuStrip1";
+ //
+ // справочникиToolStripMenuItem
+ //
+ справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ClientsToolStripMenuItem, ModelsToolStripMenuItem, FabricsToolStripMenuItem1 });
+ справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
+ справочникиToolStripMenuItem.Size = new Size(117, 24);
+ справочникиToolStripMenuItem.Text = "Справочники";
+ //
+ // ClientsToolStripMenuItem
+ //
+ ClientsToolStripMenuItem.Name = "ClientsToolStripMenuItem";
+ ClientsToolStripMenuItem.Size = new Size(224, 26);
+ ClientsToolStripMenuItem.Text = "Клиент";
+ ClientsToolStripMenuItem.Click += ClientsToolStripMenuItem_Click_1;
+ //
+ // ModelsToolStripMenuItem
+ //
+ ModelsToolStripMenuItem.Name = "ModelsToolStripMenuItem";
+ ModelsToolStripMenuItem.Size = new Size(224, 26);
+ ModelsToolStripMenuItem.Text = "Модель";
+ ModelsToolStripMenuItem.Click += ModelsToolStripMenuItem_Click_1;
+ //
+ // FabricsToolStripMenuItem1
+ //
+ FabricsToolStripMenuItem1.Name = "FabricsToolStripMenuItem1";
+ FabricsToolStripMenuItem1.Size = new Size(224, 26);
+ FabricsToolStripMenuItem1.Text = "Ткань";
+ FabricsToolStripMenuItem1.Click += FabricsToolStripMenuItem1_Click;
+ //
+ // операцииToolStripMenuItem
+ //
+ операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { OrdersToolStripMenuItem, StoragesToolStripMenuItem });
+ операцииToolStripMenuItem.Name = "операцииToolStripMenuItem";
+ операцииToolStripMenuItem.Size = new Size(95, 24);
+ операцииToolStripMenuItem.Text = "Операции";
+ //
+ // OrdersToolStripMenuItem
+ //
+ OrdersToolStripMenuItem.Name = "OrdersToolStripMenuItem";
+ OrdersToolStripMenuItem.Size = new Size(224, 26);
+ OrdersToolStripMenuItem.Text = "Заказ";
+ OrdersToolStripMenuItem.Click += OrdersToolStripMenuItem_Click_1;
+ //
+ // StoragesToolStripMenuItem
+ //
+ StoragesToolStripMenuItem.Name = "StoragesToolStripMenuItem";
+ StoragesToolStripMenuItem.Size = new Size(224, 26);
+ StoragesToolStripMenuItem.Text = "Склад";
+ StoragesToolStripMenuItem.Click += StoragesToolStripMenuItem_Click_1;
+ //
+ // отчётыToolStripMenuItem
+ //
+ отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem";
+ отчётыToolStripMenuItem.Size = new Size(73, 24);
+ отчётыToolStripMenuItem.Text = "Отчёты";
+ //
+ // FormAtelier
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ BackgroundImage = (Image)resources.GetObject("$this.BackgroundImage");
+ BackgroundImageLayout = ImageLayout.Zoom;
+ ClientSize = new Size(817, 467);
+ Controls.Add(menuStrip);
+ MainMenuStrip = menuStrip;
+ Name = "FormAtelier";
+ StartPosition = FormStartPosition.CenterScreen;
+ Text = "Ателье";
+ menuStrip.ResumeLayout(false);
+ menuStrip.PerformLayout();
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private MenuStrip menuStrip;
+ private ToolStripMenuItem справочникиToolStripMenuItem;
+ private ToolStripMenuItem ClientsToolStripMenuItem;
+ private ToolStripMenuItem операцииToolStripMenuItem;
+ private ToolStripMenuItem отчётыToolStripMenuItem;
+ private ToolStripMenuItem ModelsToolStripMenuItem;
+ private ToolStripMenuItem FabricsToolStripMenuItem1;
+ private ToolStripMenuItem OrdersToolStripMenuItem;
+ private ToolStripMenuItem StoragesToolStripMenuItem;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/FormAtelier.cs b/Atelier/Atelier/FormAtelier.cs
new file mode 100644
index 0000000..4c082d0
--- /dev/null
+++ b/Atelier/Atelier/FormAtelier.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Unity;
+using Atelier.Forms;
+
+namespace Atelier
+{
+ public partial class FormAtelier : Form
+ {
+ private readonly IUnityContainer _container;
+ public FormAtelier(IUnityContainer container)
+ {
+ InitializeComponent();
+ _container = container ??
+ throw new ArgumentNullException(nameof(container));
+ }
+
+
+ private void ClientsToolStripMenuItem_Click_1(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void ModelsToolStripMenuItem_Click_1(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void FabricsToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void OrdersToolStripMenuItem_Click_1(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void StoragesToolStripMenuItem_Click_1(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+}
diff --git a/Atelier/Atelier/FormAtelier.resx b/Atelier/Atelier/FormAtelier.resx
new file mode 100644
index 0000000..df019d5
--- /dev/null
+++ b/Atelier/Atelier/FormAtelier.resx
@@ -0,0 +1,329 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+
+ 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
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAEIIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AA0++qusAAEAIAUqecAAAAAAAAAAAAAAAAAAAAAAAAAAAAE+mwgwgcuoM64AAwwYukAAAAAAAAAAAAAA
+ AAAAAAAAAAAEe8AAAAAQw+c0gAAAAA0+AAAAAAAAAAAAAAAAAAAAAAAAAA+gAAAAAAMwqkMMMAAAQ+4A
+ AAAAAAAAAAAAAAAAAAAAAAA+IAAAAAAc4w0A2ysAAAAE6AAAAAAAAAAAAAAAAAAAAAAAQ+IAAAAAUe+Q
+ AQAwAAAAAUmIAAAAAAAAAAAAAAAAAAAAAAA2gAAAAce6wAAAAAAAAAAU+AAAAAAAAAAAAAAAAAAAAAAA
+ A8gAAAEeugAAAAAAAAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAwuIAc+uAAAAAAAAAAAAA+oAAAAAAAAAAA
+ AAAAAAAAAAAAAQY+M++gAAAAAAAAAAAE02gAAAAAAAAAAAAAAAAAAAAAAAAAQa+0gAAAAAAAAAAAEe+g
+ AAAAAAAAAAAAAAAAAAAAAAAAAAEW40IAAAAAAAAAAA8+gAAAAAAAAAAAAAAAAAAAAAAAAAAEEwwa+IAA
+ AAAAAAE8+gAAAAAAAAAAAAAAAAAAAAAAAAAAA0wAAQa+IAAAAAAE8+gAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAQAAAAQa+IAAAAE8+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQa+IAAEu+gAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAQa+IEk+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQa++6AAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAe6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ 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
+
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormClient.Designer.cs b/Atelier/Atelier/Forms/FormClient.Designer.cs
new file mode 100644
index 0000000..609eab6
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormClient.Designer.cs
@@ -0,0 +1,141 @@
+namespace Atelier.Forms
+{
+ partial class FormClient
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ textBoxFirstName = new TextBox();
+ labelFirstName = new Label();
+ textBoxLastName = new TextBox();
+ labelLastName = new Label();
+ labelContactInf = new Label();
+ textBoxContactInf = new TextBox();
+ buttonSave = new Button();
+ buttonCancel = new Button();
+ SuspendLayout();
+ //
+ // textBoxFirstName
+ //
+ textBoxFirstName.Location = new Point(171, 42);
+ textBoxFirstName.Name = "textBoxFirstName";
+ textBoxFirstName.Size = new Size(235, 27);
+ textBoxFirstName.TabIndex = 0;
+ //
+ // labelFirstName
+ //
+ labelFirstName.AutoSize = true;
+ labelFirstName.Location = new Point(12, 49);
+ labelFirstName.Name = "labelFirstName";
+ labelFirstName.Size = new Size(101, 20);
+ labelFirstName.TabIndex = 1;
+ labelFirstName.Text = "Имя клиента:";
+
+ //
+ // textBoxLastName
+ //
+ textBoxLastName.Location = new Point(171, 104);
+ textBoxLastName.Name = "textBoxLastName";
+ textBoxLastName.Size = new Size(235, 27);
+ textBoxLastName.TabIndex = 2;
+ //
+ // labelLastName
+ //
+ labelLastName.AutoSize = true;
+ labelLastName.Location = new Point(12, 111);
+ labelLastName.Name = "labelLastName";
+ labelLastName.Size = new Size(135, 20);
+ labelLastName.TabIndex = 3;
+ labelLastName.Text = "Фамилия клиента:";
+ //
+ // labelContactInf
+ //
+ labelContactInf.AutoSize = true;
+ labelContactInf.Location = new Point(114, 178);
+ labelContactInf.Name = "labelContactInf";
+ labelContactInf.Size = new Size(186, 20);
+ labelContactInf.TabIndex = 4;
+ labelContactInf.Text = "Контактная информация:";
+ //
+ // textBoxContactInf
+ //
+ textBoxContactInf.Location = new Point(59, 221);
+ textBoxContactInf.Name = "textBoxContactInf";
+ textBoxContactInf.Size = new Size(306, 27);
+ textBoxContactInf.TabIndex = 5;
+ //
+ // buttonSave
+ //
+ buttonSave.Location = new Point(95, 282);
+ buttonSave.Name = "buttonSave";
+ buttonSave.Size = new Size(94, 29);
+ buttonSave.TabIndex = 6;
+ buttonSave.Text = "Сохранить";
+ buttonSave.UseVisualStyleBackColor = true;
+ buttonSave.Click += ButtonSave_Click;
+ //
+ // buttonCancel
+ //
+ buttonCancel.Location = new Point(223, 282);
+ buttonCancel.Name = "buttonCancel";
+ buttonCancel.Size = new Size(94, 29);
+ buttonCancel.TabIndex = 7;
+ buttonCancel.Text = "Отмена";
+ buttonCancel.UseVisualStyleBackColor = true;
+ buttonCancel.Click += ButtonCancel_Click;
+ //
+ // FormClient
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(444, 348);
+ Controls.Add(buttonCancel);
+ Controls.Add(buttonSave);
+ Controls.Add(textBoxContactInf);
+ Controls.Add(labelContactInf);
+ Controls.Add(labelLastName);
+ Controls.Add(textBoxLastName);
+ Controls.Add(labelFirstName);
+ Controls.Add(textBoxFirstName);
+ Name = "FormClient";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Клиент";
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private TextBox textBoxFirstName;
+ private Label labelFirstName;
+ private TextBox textBoxLastName;
+ private Label labelLastName;
+ private Label labelContactInf;
+ private TextBox textBoxContactInf;
+ private Button buttonSave;
+ private Button buttonCancel;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormClient.cs b/Atelier/Atelier/Forms/FormClient.cs
new file mode 100644
index 0000000..b841928
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormClient.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Atelier.Forms
+{
+ public partial class FormClient : Form
+ {
+ private readonly IClientRepository _clientRepository;
+ private int? _clientId;
+ public int Id
+ {
+ set
+ {
+ try
+ {
+ var client =
+ _clientRepository.ReadClientById(value);
+ if (client == null)
+ {
+ throw new
+ InvalidDataException(nameof(client));
+ }
+ textBoxFirstName.Text = client.FirstName;
+ textBoxLastName.Text = client.LastName;
+ textBoxContactInf.Text = client.ContactInformation;
+ _clientId = value;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+ }
+ public FormClient(IClientRepository clientRepository)
+ {
+ InitializeComponent();
+ _clientRepository = clientRepository ??
+ throw new
+ ArgumentNullException(nameof(clientRepository));
+ }
+ private void ButtonSave_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (string.IsNullOrWhiteSpace(textBoxFirstName.Text) || string.IsNullOrWhiteSpace(textBoxLastName.Text) || string.IsNullOrWhiteSpace(textBoxContactInf.Text))
+ {
+ throw new Exception("Имеются незаполненные поля");
+ }
+ if (_clientId.HasValue)
+ {
+ _clientRepository.UpdateClient(CreateClient(_clientId.Value));
+ }
+ else
+ {
+ _clientRepository.CreateClient(CreateClient(0));
+ }
+ Close();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при сохранении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonCancel_Click(object sender, EventArgs e) => Close();
+ private Client CreateClient(int id) => Client.CreateEntity(id, textBoxFirstName.Text, textBoxLastName.Text, textBoxContactInf.Text);
+ }
+}
+
+
+
diff --git a/Atelier/Atelier/Forms/FormClient.resx b/Atelier/Atelier/Forms/FormClient.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormClient.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormClients.Designer.cs b/Atelier/Atelier/Forms/FormClients.Designer.cs
new file mode 100644
index 0000000..46e38d7
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormClients.Designer.cs
@@ -0,0 +1,126 @@
+namespace Atelier.Forms
+{
+ partial class FormClients
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormClients));
+ dataGridView1 = new DataGridView();
+ panel1 = new Panel();
+ buttonDel = new Button();
+ buttonUpd = new Button();
+ buttonAdd = new Button();
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
+ panel1.SuspendLayout();
+ SuspendLayout();
+ //
+ // dataGridView1
+ //
+ dataGridView1.AllowUserToAddRows = false;
+ dataGridView1.AllowUserToDeleteRows = false;
+ dataGridView1.AllowUserToResizeColumns = false;
+ dataGridView1.AllowUserToResizeRows = false;
+ dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView1.Dock = DockStyle.Fill;
+ dataGridView1.Location = new Point(0, 0);
+ dataGridView1.MultiSelect = false;
+ dataGridView1.Name = "dataGridView1";
+ dataGridView1.ReadOnly = true;
+ dataGridView1.RowHeadersVisible = false;
+ dataGridView1.RowHeadersWidth = 51;
+ dataGridView1.RowTemplate.Height = 29;
+ dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
+ dataGridView1.Size = new Size(1001, 604);
+ dataGridView1.TabIndex = 0;
+ //
+ // panel1
+ //
+ panel1.Controls.Add(buttonDel);
+ panel1.Controls.Add(buttonUpd);
+ panel1.Controls.Add(buttonAdd);
+ panel1.Dock = DockStyle.Right;
+ panel1.Location = new Point(1001, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(133, 604);
+ panel1.TabIndex = 1;
+ //
+ // buttonDel
+ //
+ buttonDel.Image = (Image)resources.GetObject("buttonDel.Image");
+ buttonDel.Location = new Point(14, 204);
+ buttonDel.Name = "buttonDel";
+ buttonDel.Size = new Size(107, 88);
+ buttonDel.TabIndex = 2;
+ buttonDel.UseVisualStyleBackColor = true;
+ buttonDel.Click += ButtonDel_Click;
+ //
+ // buttonUpd
+ //
+ buttonUpd.Image = (Image)resources.GetObject("buttonUpd.Image");
+ buttonUpd.Location = new Point(14, 107);
+ buttonUpd.Name = "buttonUpd";
+ buttonUpd.Size = new Size(107, 91);
+ buttonUpd.TabIndex = 1;
+ buttonUpd.UseVisualStyleBackColor = true;
+ buttonUpd.Click += ButtonUpd_Click;
+ //
+ // buttonAdd
+ //
+ buttonAdd.Image = (Image)resources.GetObject("buttonAdd.Image");
+ buttonAdd.Location = new Point(14, 12);
+ buttonAdd.Name = "buttonAdd";
+ buttonAdd.Size = new Size(107, 89);
+ buttonAdd.TabIndex = 0;
+ buttonAdd.UseVisualStyleBackColor = true;
+ buttonAdd.Click += ButtonAdd_Click;
+ //
+ // FormClients
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(1134, 604);
+ Controls.Add(dataGridView1);
+ Controls.Add(panel1);
+ Name = "FormClients";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Клиенты";
+ Load += FormClients_Load;
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
+ panel1.ResumeLayout(false);
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private DataGridView dataGridView1;
+ private Panel panel1;
+ private Button buttonDel;
+ private Button buttonUpd;
+ private Button buttonAdd;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormClients.cs b/Atelier/Atelier/Forms/FormClients.cs
new file mode 100644
index 0000000..775a98c
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormClients.cs
@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Unity;
+using Atelier.Forms;
+
+namespace Atelier.Forms
+{
+ public partial class FormClients : Form
+ {
+ private readonly IUnityContainer _container;
+ private readonly IClientRepository _clientRepository;
+ public FormClients(IUnityContainer container, IClientRepository clientRepository)
+ {
+ InitializeComponent();
+ _container = container ??
+ throw new ArgumentNullException(nameof(container));
+ _clientRepository = clientRepository ??
+ throw new
+ ArgumentNullException(nameof(clientRepository));
+ }
+ private void FormClients_Load(object sender, EventArgs e)
+ {
+ try
+ {
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonAdd_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при добавлении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+
+ }
+ private void ButtonUpd_Click(object sender, EventArgs e)
+ {
+ if (!TryGetIdentifierFromSelectedRow(out var findId))
+ {
+ return;
+ }
+ try
+ {
+ var form = _container.Resolve();
+ form.Id = findId;
+ form.ShowDialog();
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при изменении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonDel_Click(object sender, EventArgs e)
+ {
+ if (!TryGetIdentifierFromSelectedRow(out var findId))
+ {
+ return;
+ }
+ if (MessageBox.Show("Удалить запись?", "Удаление",
+ MessageBoxButtons.YesNo) != DialogResult.Yes)
+ {
+ return;
+ }
+ try
+ {
+ _clientRepository.DeleteClient(findId);
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при удалении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void LoadList() => dataGridView1.DataSource = _clientRepository.ReadClients();
+ private bool TryGetIdentifierFromSelectedRow(out int id)
+ {
+ id = 0;
+ if (dataGridView1.SelectedRows.Count < 1)
+ {
+ MessageBox.Show("Нет выбранной записи", "Ошибка",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
+ }
+ id =
+ Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Id"].Value);
+ return true;
+ }
+
+
+ }
+}
+
+
+
+
+
+
+
diff --git a/Atelier/Atelier/Forms/FormClients.resx b/Atelier/Atelier/Forms/FormClients.resx
new file mode 100644
index 0000000..7cb8229
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormClients.resx
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DAAACwwBP0AiyAAABNVJREFUeF7tnL9uXHUQhZ2OKk8ANRJ5AHipNInXgCFKyuD1H/ECZJ11Eh7AViCP
+ ELeJaCgQHV2gIIULc0cZ0KfRaDTaO2Ph63ukrzg+oxnOzxvT7dasWbNmzbpafX93fXtve/XTcnt1sVwc
+ X47iw46XslPXT1/LxerbvcXqxcOHTz7SH20s2TE84o9728cP9EfT1/B4b5f3n36udrQOdp58sbc4/kXt
+ tPV4Z3VnKPv75dblLf3RaMmu4Zfy2/L++jP90XQ1/L16NPz921dbpuHPwoHsVjtdVf/z/Vf/63/G+/d+
+ +ORo99nL/Z31+//+7zdRpOPQ9efvFutPtf44yeMdfn3y7vTF+cWb8z8uf33716SRjmdD1/0vn/4p3fUZ
+ Npd88mShd2zKnD4/vzjaPTnTZ9hcB8NH+iZ88izSefgUvtdn2Fzyd8E7cBOQ7voMm2t+wJGaH3CkZMlN
+ Rp+hTrLU+21NgZYHs5ofcKTmBxyp+QFHyj5g9KDZx97kl1Kx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8o
+ PYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3Z
+ J+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZ
+ eK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U
+ 7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpI
+ do5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0
+ JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWaf
+ vKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bi
+ tWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx
+ 22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZ
+ OVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKT
+ KCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3y
+ jtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nX
+ mn3apOx1YX7AkVzJA8q3m03xq6DevJavelr/rTX7dLh78kq+mMv7j7jOnD5/fXH0zbNTrdkn+V49+Wo4
+ ecQpfBLlkyePd/jV+t3jnfXHWrNXH76Q8eRMvt1M/m5cZ6SDfPKu7PFmzZo1azLa2voHHNxQxvmbf3YA
+ AAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DAAACwwBP0AiyAAAB1ZJREFUeF7tmllPG1cUx+nePrXqB6j60OdK/QRVK/Wx6lPfKlVVpUiNbZakJKSp
+ SpSoNE1sszsZsGfwQqEGQmIWB0zYkhAgDklYTIBAAgRQtlZN1QRSKafn3LkzDOMxmCiNl/hIfwnP2Mz5
+ /e+9557xOCsTmchESobV4v7IahJzrGapwGap+QSy4CV+Kr3D/6X/FZtZcqBAK6tJCh3eIbzN35aeIcOL
+ HgIusUgQ3OWEblSFWXzCjRhMWxO08KWoifxquF8gMC3sqYJqiyjPBpMYtuVVv8s/lh5B8DjFvUbwRiZg
+ XbiU8ibYTK5v7GapzWoWf0DVEVgZKpJfFQWvaGFvFVRl85mQysvBZpIOcAhVsUZer5SfCSo8FrnfhD4o
+ zvM+ptdVFtfMXQNgI2lnAm6VQykzE7QjXy+eg/5LK3C6c1o1QbS4xp7WhOIc6R1+meQM/bRv8FxgBjAT
+ QusmSNniRNqZoIcXDp2E3sFF1YBnZQJuoz2FhYUv88smR2Bi+Sw5XPOSNQjuko6N8GEunQkui2t8OyaU
+ WcRH9Dn7TvELfunER2Gh/3WruYYBNdUOr0NzdfXfgMr9fqguCqjHmAm5ak2IxGtCMLd6iRltlo7yyyc+
+ aDriHn+PEvNWhNSRJp05dxMq9tWzqes63KoeV03QzIQ7BsB6NeQ6J+n9uDUW8csnPugODlvXZkqM5NOY
+ cKLuIjsmHGyGnqGN9YCZ0Dml3R0im5mAzdMTvM4qu47F9TG/fGKD4LEyl1JSJTk1TFoTei8uQ6D5KvQO
+ L6nQ3efnobF2CLoHZEPiMYE6R7tZXKP3UDvNL5/Y0MNPDQzD9HAYSnLdzARvWSf0hZdVcAXe8WMjO08m
+ KMe1fYIz2zWpNWESO8dikySPvElsLbWUvsFTSFwYwT/+c46JTCiNYQIVQjpOJpAZyvFYJmyEl5qEHcJr
+ PIXEhR5+evCiCq+agMeU5eAtX68JPkcPM0EPr0i7HASLa67YLMnT3iyeSEp47cjrNX0+hDNBLoweg+VA
+ 6sFewXm4Rd4ilT5BMxOYUmnkVd0egLXFEzDV8zuUZMsg2plAosIoHDzJzlGfoD0nzwSPbIJJ3MdTSFxE
+ jXwc8IpimdASGGPHygvqoatvToVXVO88y85j9Q/yNBITBI/9dxmDx+K2HXgjE5Qtsi+8BM0NI6xZUqBp
+ VjT6BsHvHsC9Xq4hVlPNDp7K84+okb8QDb84dhVaqtrg7rU+Q3hFUyGPWhO8ZR1RNYHgq4ta2HmNEtfy
+ xjPyC6NXoOJ7L0t29HS9ITjp0YwXHo4dg8lWAY3kM6G8c8O695SGtOC09n/hqTz/iIIfCkfB35oYhcp8
+ GT5Q4YNH802bwiuKZYJoC6YO/N3ZCJTv9rBkW4/Vwup8NDhpdcazAd7IBCqMTXjPYOdrPunhSUuRUVYT
+ 2oXY8PqR1+pW33FcOsoXHBolO/zq/Vn5b6z2/8wZT3nSVvCVHB4L7AW85ordIq3hTc5+nsrzj3jgqdof
+ K/BB0GkMrWgb8B22PP9bdO2Ednp6+OkY8Eq173LXRkHTMhhoqIPxduM1T1rsFVR41OnCr6U3eQqJC4LH
+ qVceL3yg0he15uk1FUI67z4gpha8OvIxevuliau41flY4qcMtjqCbzsuny/fJcKNLsEYPl8ucjTt0xRe
+ ghtnjOBxzXN4VLqO/IsO33V8U3gr3s1l4BMd/0fBu7nFtH/x4Hs01T7d4JV9fjN4tbc3ie0Z+GQIurOi
+ pOg7+pnhp+vwWhyyOQS4gKB6eDpWsZtPe5MUoAel/PKJDdvO6g8wKfl3dxYJXAfqoUVog6HWfpgbGWHa
+ Er5SHnmCp1GOhsdb2mSEp7CZXV9RYuUIST0+M8JAW8FTUaPKvhk8LrNTSQVPgT33Lkquuy4Eq/dm2Vof
+ 6TwHQSkINYf8LHHHXncc8JuPfFLCU9Dzc0pwINAXtfbX7s9CaZ6HLY2/ZtaLHsErBY/u3OjePRp+veDh
+ NdqS4kGlUeDICJTk5dD5KANItb82MYhwoA4eXG9i8LQc6JgjH+H7o+HnWcFTq31zUo68EvQ8jRK9FuPZ
+ XZevUwYh4Uxw7JG/kEwLeAqsyr2U7M0rlw0N+GN+EjrcHeD5uQGKsUdQzDCq9vPdtOaVaZ8kT2m3Ckx0
+ nBK+MzNuaIBWD+9cB0+R/KMF/V6fkvAUWANuU9IPlqcNofXq9HQwyLC/SoXfUO2T5RF1PCH/aktij5aX
+ J8cMgfW60jXAQNsrnAyeWl5qfekYjnxjysBTlGS732OjhnLs9cHKta1NWJ4cZe+XfqKWd33kUw6e4qhZ
+ /FQxQDVhanMTqFmiewZ7tnzTwz5rkhpSDp6CnqdrDdCa8PfKNNybi7DOcDZ8CSL9Q6xDpIapco/cBzAh
+ PC6lV/m/TK3ANviIFn67ws87UxaeAiH8eigmk/Qv7Q64riP4+iz18VgsRQS2YnOzD499e+S7mg/5v0nd
+ sFvEzxGmhZ74oEwI+FlxjvR+0v3EPBOZyMSziays/wB+daIEvDXupgAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DAAACwwBP0AiyAAACDBJREFUeF7tXFlTFFcU9inbQ5JfkOU9eyqVPGT7B6kk5UsEZmkYfMFUCpnunkE2
+ Uy6pCotCEKa3ARQliklYRWMEyvigErSMmriRlMlDSpGSmaFUoHO/yaUmNncchpnunhnmq/qqKObc7VR3
+ n3PPPeeuyyOPtQtPW/VTjgD/YaFUsdGpCM3Fmu8k4ZRbFf5xKnzYEfDOg/gb/8NvkIFsUcBbWihXfIA+
+ aHdrA4527ztEKVtLgv5zTtl7b9P+upnagYZw46isq6f36z0Xvtd7L/Xr/VeG9eEbx6LE3/gffoMMZGtI
+ m03ddTPogyh10inxdQVy+dt0mNxCQXv5i0WKt5Y8RX9v7Npyd/tIy/3gxAF98NqIPjL1Y0pEH9rZA/o2
+ 0mdpZ+Usp4p/OWS+xqHyL9DhsxeOgPAmWdCwWxUjW4ea5vadP8RUQjq579whvW5w15xbFubcqn9wg1Lx
+ Bp1O9gCKc6niaLHqDzWNygvpeNKSJcYkr/piseaPcKpvrFDiX6fTy1w41M+fdSuCRJ66cPO4tjB8/Shz
+ cVYSc9g1pi5ymjjHKb52Txv/DJ1uZsEpCeuJ8u7UDDRF+shHn7UYO/nD70N6dX9jBHN0SPyndNr2w6FW
+ P+GShYAnWBnaO2n+Ny5VdpE5lnZUhl3kaSxrKnucLsMewLq6VOGycPirUP/VzHvq4hFuEX94Z8StCZds
+ s9YFMv+qSxGnG0el+SNTx5gTzWRizg2j0gOyhttFgc2v0GVZA+wAyG5gtu1U1yJrctlErMFF1lIk8e/T
+ 5ZkLKI+8tmE4wqwJZSPhiGNNpiuR7ElfJv7dXQzImkg2s2PiWx1PoqN982t0uelF1GCQb14uvLbx+N/r
+ LN5Ou2GBq+JWxN9gMFgD5xJhWMjW82JaXRzsLry9O8PZaG2TJdZI3LKwWxPb6PJTA3YYHuJ4ZpOflyrh
+ J3qC/nCRvPljqobVge5t72TDDiPd7PrlIDEq4nRKe2e8ujWDTRHWAGbTCJaM2awaaIgQJbZSdSQHGsuz
+ LTBgBEvGbPZdGdIRy1yVa8Np4njzuGaby2IES8YK7h5TF4hB+YmqZWVA8LFY80WGbIznGcGSsYKIJ3Ka
+ L4w3kqonMTjVP4xIMqtDq2gES8YqEt9wvlj1DVD1PBrYceC9tyMM/38awZKxigNXR3ScsXwmlT9P1RQf
+ OD3bOtg0x+rIShrBkrGSdQNNcw7Vu4WqKT5wLNh9vpfZiZU0giVjJeELu1XhJlUTGzj0xrktqwOraQRL
+ xkpii1faUTnrbBPeoupaDqfEf7njaMt9VgdW0wiWjNXcPtJyzxHga6i6lgPpFpkSKDWCJWM11TP79WLN
+ f5aq62EgSQd5JnZb3yUawZKxmrDG0NH6ni+epGqLAVlSSPRhNbSDRrBk7GBZd+0MM/SPFDNkSbEa2UEj
+ WDJ2sLqvMVQoeUuo2mJwyXwL0sZYjeygESwZO1h/Qloke+MmqrYYkLiIjySrkR00giVjB5XT3ToxtmNU
+ bTFwqu8PJDCyGtlBI1gydvDAhe+IJfbdoGqLgVN8t3ov9zMb2UEjWDJ2EJmySDemaovBqQhhnAWwGiXD
+ TAdrzskQWV44P6Zqi8EheeeRj8xqlAwzHaw5J0PEB4tk7wOqthjyClwZ4yow/wqvjHFf4bwRWRnjGhFi
+ mqfybkxixnVjoo706bwjnYhyPEc6upUj2xRWIztoBEvGDsbdyuWDCStj3GACMk/LuvPhrEQs21c3s6G9
+ 4j2qthjyAdXEHLx2JH5AFSCGZDJT0neNYMlYTUSrSoK+M1Rdy4EyVFRSshpbTSNYMlZz25Hme07JW03V
+ tRyot0XJKKux1TSCJWMlcazp6aicTZgjw6niTSvKUhPRCJaMldw7eVDnNPFPqqb4QLFyPrVjOWsHGuec
+ El9J1RQfSPHPJxc9zKXkosI2/jmqpkfDrYhDjWP2ljQYwZKxivUnAvOcIvZT9SQGUlo5zRcZvG7fU2gE
+ S8YKIskUCZZJXx3Aqb7R3WOabUmWRrBkrOCuMWWBGI8fqVpWDqT54luIACKrY7NpBEvGbGLt5HMWWXU5
+ rFMR2mr67QkwGMGSMZtV/Q0Rlyq2UHUkDxSZoNAGZfKsAXKZnZOo3hSnN3SWPU3VsToUBryfeIKVaTkv
+ yRaiNsbT4Q8XtvMfUTWkBpcitHsPraViwx0h8uZ9Q5efOlD6STq8hFJQ1qC5xK+PBx6Q796F9T3Vj9Hl
+ pwfYobhk8VbbqS5b60fM5J6fOxeJ1b214h1HsiiQyl/K1ZL/4ERP9LwXt5HQ5ZoDZGfigoZcUmL00glF
+ CBfK/Lt0meYC5RBkwLutJ4M5cO1J5wLeKuY5h5mAd44LGmBYstE6Y84wGPjm4dNEl2UtooZFFS7yvTtD
+ 2eQnws/jD++IuDXfr6YZjJUCLo5LFvbg8jGUybMmnEnEDqMk6I+4NH9r2l2VVIALGrD1wRVzqPRmTd5O
+ IjBQ1VcfIa7YdNp2GOkG9s4uTWxFFAeV3nYWbC8RMU2EpBBVwe4i5b2tFUBAlnwbj3OqGIKRQUictTgz
+ iTHrRwPznOrDFaDHLb+hLR2AIos13wDOE1Bva/b1KbCsOD3DARDGJIrrM90xtgKo9HYE+CocmaJkdNuR
+ 5vs45U/Hk4k+0BcOvXFui6NHh+zdYrt1NQuot3VKQjV5MieQZ4Las+q+hlDjqBQtYkECY7yLuPEb8vMa
+ Tsg62iDRB32ggtIl81VJXQyRC0CSDraGjkCFBzl3RKnjXNB3HSm0yNleugqeuEkh/A+/IbkRsmiD3UPc
+ RJ888lgDWLfuXyHjrOzkVJ7gAAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormFabric.Designer.cs b/Atelier/Atelier/Forms/FormFabric.Designer.cs
new file mode 100644
index 0000000..3d824e1
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormFabric.Designer.cs
@@ -0,0 +1,148 @@
+namespace Atelier.Forms
+{
+ partial class FormFabric
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ labelFabric = new Label();
+ labelColor = new Label();
+ labelMetrage = new Label();
+ checkedListBoxColor = new CheckedListBox();
+ comboBoxFabric = new ComboBox();
+ numericUpDownMetrage = new NumericUpDown();
+ buttonSave = new Button();
+ buttonCancel = new Button();
+ ((System.ComponentModel.ISupportInitialize)numericUpDownMetrage).BeginInit();
+ SuspendLayout();
+ //
+ // labelFabric
+ //
+ labelFabric.AutoSize = true;
+ labelFabric.Location = new Point(60, 33);
+ labelFabric.Name = "labelFabric";
+ labelFabric.Size = new Size(52, 20);
+ labelFabric.TabIndex = 0;
+ labelFabric.Text = "Ткань:";
+ //
+ // labelColor
+ //
+ labelColor.AutoSize = true;
+ labelColor.Location = new Point(67, 77);
+ labelColor.Name = "labelColor";
+ labelColor.Size = new Size(45, 20);
+ labelColor.TabIndex = 1;
+ labelColor.Text = "Цвет:";
+ //
+ // labelMetrage
+ //
+ labelMetrage.AutoSize = true;
+ labelMetrage.Location = new Point(55, 229);
+ labelMetrage.Name = "labelMetrage";
+ labelMetrage.Size = new Size(67, 20);
+ labelMetrage.TabIndex = 2;
+ labelMetrage.Text = "Метраж:";
+ //
+ // checkedListBoxColor
+ //
+ checkedListBoxColor.FormattingEnabled = true;
+ checkedListBoxColor.Location = new Point(146, 77);
+ checkedListBoxColor.Name = "checkedListBoxColor";
+ checkedListBoxColor.Size = new Size(150, 114);
+ checkedListBoxColor.TabIndex = 3;
+ //
+ // comboBoxFabric
+ //
+ comboBoxFabric.DropDownStyle = ComboBoxStyle.DropDownList;
+ comboBoxFabric.FormattingEnabled = true;
+ comboBoxFabric.Location = new Point(145, 25);
+ comboBoxFabric.Name = "comboBoxFabric";
+ comboBoxFabric.Size = new Size(151, 28);
+ comboBoxFabric.TabIndex = 4;
+ //
+ // numericUpDownMetrage
+ //
+ numericUpDownMetrage.DecimalPlaces = 2;
+ numericUpDownMetrage.Location = new Point(146, 229);
+ numericUpDownMetrage.Minimum = new decimal(new int[] { 5, 0, 0, 65536 });
+ numericUpDownMetrage.Name = "numericUpDownMetrage";
+ numericUpDownMetrage.Size = new Size(150, 27);
+ numericUpDownMetrage.TabIndex = 5;
+ numericUpDownMetrage.Value = new decimal(new int[] { 5, 0, 0, 65536 });
+ //
+ // buttonSave
+ //
+ buttonSave.Location = new Point(67, 296);
+ buttonSave.Name = "buttonSave";
+ buttonSave.Size = new Size(94, 29);
+ buttonSave.TabIndex = 6;
+ buttonSave.Text = "Сохранить";
+ buttonSave.UseVisualStyleBackColor = true;
+ buttonSave.Click += ButtonSave_Click;
+ //
+ // buttonCancel
+ //
+ buttonCancel.Location = new Point(215, 296);
+ buttonCancel.Name = "buttonCancel";
+ buttonCancel.Size = new Size(94, 29);
+ buttonCancel.TabIndex = 7;
+ buttonCancel.Text = "Отмена";
+ buttonCancel.UseVisualStyleBackColor = true;
+ buttonCancel.Click += ButtonCancel_Click;
+ //
+ // FormFabric
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(367, 352);
+ Controls.Add(buttonCancel);
+ Controls.Add(buttonSave);
+ Controls.Add(numericUpDownMetrage);
+ Controls.Add(comboBoxFabric);
+ Controls.Add(checkedListBoxColor);
+ Controls.Add(labelMetrage);
+ Controls.Add(labelColor);
+ Controls.Add(labelFabric);
+ Name = "FormFabric";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Ткань";
+ ((System.ComponentModel.ISupportInitialize)numericUpDownMetrage).EndInit();
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private Label labelFabric;
+ private Label labelColor;
+ private Label labelMetrage;
+ private CheckedListBox checkedListBoxColor;
+ private ComboBox comboBoxFabric;
+ private NumericUpDown numericUpDownMetrage;
+ private Button buttonSave;
+ private Button buttonCancel;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormFabric.cs b/Atelier/Atelier/Forms/FormFabric.cs
new file mode 100644
index 0000000..27bdfa4
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormFabric.cs
@@ -0,0 +1,105 @@
+using Microsoft.VisualBasic.FileIO;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Atelier.Forms
+{
+ public partial class FormFabric : Form
+ {
+ private readonly IFabricRepository _fabricRepository;
+ private int? _fabricId;
+
+ public FormFabric(IFabricRepository fabricRepository)
+ {
+ InitializeComponent();
+ _fabricRepository = fabricRepository ?? throw new ArgumentNullException(nameof(fabricRepository));
+ comboBoxFabric.DataSource = Enum.GetValues(typeof(FabricType));
+
+ // Инициализация CheckedListBox
+ foreach (Color elem in Enum.GetValues(typeof(Color)))
+ {
+ checkedListBoxColor.Items.Add(elem);
+ }
+
+ // Отладочный вывод
+ foreach (var item in checkedListBoxColor.Items)
+ {
+ Console.WriteLine(item);
+ }
+ }
+
+ public int Id
+ {
+ set
+ {
+ try
+ {
+ var fabric = _fabricRepository.ReadFabricById(value);
+ if (fabric == null)
+ {
+ throw new InvalidDataException(nameof(fabric));
+ }
+
+ comboBoxFabric.SelectedItem = fabric.FabricType;
+ foreach (Color elem in Enum.GetValues(typeof(Color)))
+ {
+ if ((elem & fabric.Color) != 0)
+ {
+ checkedListBoxColor.SetItemChecked(checkedListBoxColor.Items.IndexOf(elem), true);
+ }
+ }
+ numericUpDownMetrage.Value = (decimal)fabric.Metrage;
+
+ _fabricId = value;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+ }
+
+ private void ButtonSave_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (comboBoxFabric.SelectedIndex < 0.50 || checkedListBoxColor.CheckedItems.Count == 0)
+ {
+ throw new Exception("Имеются незаполненные поля");
+ }
+ if (_fabricId.HasValue)
+ {
+ _fabricRepository.UpdateFabric(CreateFabric(_fabricId.Value));
+ }
+ else
+ {
+ _fabricRepository.CreateFabric(CreateFabric(0));
+ }
+ Close();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при сохранении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonCancel_Click(object sender, EventArgs e) => Close();
+ private Fabric CreateFabric(int id)
+ {
+ Color color = Color.None;
+ foreach (var elem in checkedListBoxColor.CheckedItems)
+ {
+ color |= (Color)elem;
+ }
+ return Fabric.CreateEntity(id, (FabricType)comboBoxFabric.SelectedItem!, color, Convert.ToDouble(numericUpDownMetrage.Value)); ;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormFabric.resx b/Atelier/Atelier/Forms/FormFabric.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormFabric.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormFabrics.Designer.cs b/Atelier/Atelier/Forms/FormFabrics.Designer.cs
new file mode 100644
index 0000000..2087bdd
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormFabrics.Designer.cs
@@ -0,0 +1,126 @@
+namespace Atelier.Forms
+{
+ partial class FormFabrics
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormFabrics));
+ dataGridView1 = new DataGridView();
+ panel1 = new Panel();
+ buttonDel = new Button();
+ buttonUpd = new Button();
+ buttonAdd = new Button();
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
+ panel1.SuspendLayout();
+ SuspendLayout();
+ //
+ // dataGridView1
+ //
+ dataGridView1.AllowUserToAddRows = false;
+ dataGridView1.AllowUserToDeleteRows = false;
+ dataGridView1.AllowUserToResizeColumns = false;
+ dataGridView1.AllowUserToResizeRows = false;
+ dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView1.Dock = DockStyle.Fill;
+ dataGridView1.Location = new Point(0, 0);
+ dataGridView1.MultiSelect = false;
+ dataGridView1.Name = "dataGridView1";
+ dataGridView1.ReadOnly = true;
+ dataGridView1.RowHeadersVisible = false;
+ dataGridView1.RowHeadersWidth = 51;
+ dataGridView1.RowTemplate.Height = 29;
+ dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
+ dataGridView1.Size = new Size(1001, 604);
+ dataGridView1.TabIndex = 0;
+ //
+ // panel1
+ //
+ panel1.Controls.Add(buttonDel);
+ panel1.Controls.Add(buttonUpd);
+ panel1.Controls.Add(buttonAdd);
+ panel1.Dock = DockStyle.Right;
+ panel1.Location = new Point(1001, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(133, 604);
+ panel1.TabIndex = 1;
+ //
+ // buttonDel
+ //
+ buttonDel.Image = (Image)resources.GetObject("buttonDel.Image");
+ buttonDel.Location = new Point(14, 204);
+ buttonDel.Name = "buttonDel";
+ buttonDel.Size = new Size(107, 88);
+ buttonDel.TabIndex = 2;
+ buttonDel.UseVisualStyleBackColor = true;
+ buttonDel.Click += ButtonDel_Click;
+ //
+ // buttonUpd
+ //
+ buttonUpd.Image = (Image)resources.GetObject("buttonUpd.Image");
+ buttonUpd.Location = new Point(14, 107);
+ buttonUpd.Name = "buttonUpd";
+ buttonUpd.Size = new Size(107, 91);
+ buttonUpd.TabIndex = 1;
+ buttonUpd.UseVisualStyleBackColor = true;
+ buttonUpd.Click += ButtonUpd_Click;
+ //
+ // buttonAdd
+ //
+ buttonAdd.Image = (Image)resources.GetObject("buttonAdd.Image");
+ buttonAdd.Location = new Point(14, 12);
+ buttonAdd.Name = "buttonAdd";
+ buttonAdd.Size = new Size(107, 89);
+ buttonAdd.TabIndex = 0;
+ buttonAdd.UseVisualStyleBackColor = true;
+ buttonAdd.Click += ButtonAdd_Click;
+ //
+ // FormFabrics
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(1134, 604);
+ Controls.Add(dataGridView1);
+ Controls.Add(panel1);
+ Name = "FormFabrics";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Ткани";
+ Load += FormFabrics_Load;
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
+ panel1.ResumeLayout(false);
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private DataGridView dataGridView1;
+ private Panel panel1;
+ private Button buttonDel;
+ private Button buttonUpd;
+ private Button buttonAdd;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormFabrics.cs b/Atelier/Atelier/Forms/FormFabrics.cs
new file mode 100644
index 0000000..aefec2d
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormFabrics.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Unity;
+
+namespace Atelier.Forms
+{
+ public partial class FormFabrics : Form
+ {
+ private readonly IUnityContainer _container;
+ private readonly IFabricRepository _fabricRepository;
+ public FormFabrics(IUnityContainer container, IFabricRepository fabricRepository)
+ {
+ InitializeComponent();
+ _container = container ??
+ throw new ArgumentNullException(nameof(container));
+ _fabricRepository = fabricRepository ??
+ throw new
+ ArgumentNullException(nameof(fabricRepository));
+ }
+ private void FormFabrics_Load(object sender, EventArgs e)
+ {
+ try
+ {
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonAdd_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при добавлении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonUpd_Click(object sender, EventArgs e)
+ {
+ if (!TryGetIdentifierFromSelectedRow(out var findId))
+ {
+ return;
+ }
+ try
+ {
+ var form = _container.Resolve();
+ form.Id = findId;
+ form.ShowDialog();
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при изменении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonDel_Click(object sender, EventArgs e)
+ {
+ if (!TryGetIdentifierFromSelectedRow(out var findId))
+ {
+ return;
+ }
+ if (MessageBox.Show("Удалить запись?", "Удаление",
+ MessageBoxButtons.YesNo) != DialogResult.Yes)
+ {
+ return;
+ }
+ try
+ {
+ _fabricRepository.DeleteFabric(findId);
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при удалении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void LoadList() => dataGridView1.DataSource = _fabricRepository.ReadFabrics();
+ private bool TryGetIdentifierFromSelectedRow(out int id)
+ {
+ id = 0;
+ if (dataGridView1.SelectedRows.Count < 1)
+ {
+ MessageBox.Show("Нет выбранной записи", "Ошибка",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
+ }
+ id =
+ Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Id"].Value);
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormFabrics.resx b/Atelier/Atelier/Forms/FormFabrics.resx
new file mode 100644
index 0000000..ad98e8b
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormFabrics.resx
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DgAACw4BQL7hQQAABNVJREFUeF7tnL9uXHUQhZ2OKk8ANRJ5AHipNInXgCFKyuD1H/ECZJ11Eh7AViCP
+ ELeJaCgQHV2gIIULc0cZ0KfRaDTaO2Ph63ukrzg+oxnOzxvT7dasWbNmzbpafX93fXtve/XTcnt1sVwc
+ X47iw46XslPXT1/LxerbvcXqxcOHTz7SH20s2TE84o9728cP9EfT1/B4b5f3n36udrQOdp58sbc4/kXt
+ tPV4Z3VnKPv75dblLf3RaMmu4Zfy2/L++jP90XQ1/L16NPz921dbpuHPwoHsVjtdVf/z/Vf/63/G+/d+
+ +ORo99nL/Z31+//+7zdRpOPQ9efvFutPtf44yeMdfn3y7vTF+cWb8z8uf33716SRjmdD1/0vn/4p3fUZ
+ Npd88mShd2zKnD4/vzjaPTnTZ9hcB8NH+iZ88izSefgUvtdn2Fzyd8E7cBOQ7voMm2t+wJGaH3CkZMlN
+ Rp+hTrLU+21NgZYHs5ofcKTmBxyp+QFHyj5g9KDZx97kl1Kx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8o
+ PYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3Z
+ J+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZ
+ eK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U
+ 7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpI
+ do5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0
+ JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWaf
+ vKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bi
+ tWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx
+ 22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZ
+ OVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKT
+ KCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3y
+ jtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nX
+ mn3apOx1YX7AkVzJA8q3m03xq6DevJavelr/rTX7dLh78kq+mMv7j7jOnD5/fXH0zbNTrdkn+V49+Wo4
+ ecQpfBLlkyePd/jV+t3jnfXHWrNXH76Q8eRMvt1M/m5cZ6SDfPKu7PFmzZo1azLa2voHHNxQxvmbf3YA
+ AAAASUVORK5CYII=
+
+
+
+
+ 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
+
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormModel.Designer.cs b/Atelier/Atelier/Forms/FormModel.Designer.cs
new file mode 100644
index 0000000..6c57b3d
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormModel.Designer.cs
@@ -0,0 +1,182 @@
+namespace Atelier.Forms
+{
+ partial class FormModel
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ labelModel = new Label();
+ labelPrice = new Label();
+ comboBoxModel = new ComboBox();
+ numericUpDownPrice = new NumericUpDown();
+ buttonSave = new Button();
+ buttonCancel = new Button();
+ groupBox1 = new GroupBox();
+ dataGridView1 = new DataGridView();
+ ColumnFabric = new DataGridViewComboBoxColumn();
+ ColumnCount = new DataGridViewTextBoxColumn();
+ ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit();
+ groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
+ SuspendLayout();
+ //
+ // labelModel
+ //
+ labelModel.AutoSize = true;
+ labelModel.Location = new Point(30, 52);
+ labelModel.Name = "labelModel";
+ labelModel.Size = new Size(66, 20);
+ labelModel.TabIndex = 0;
+ labelModel.Text = "Модель:";
+ //
+ // labelPrice
+ //
+ labelPrice.AutoSize = true;
+ labelPrice.Location = new Point(48, 118);
+ labelPrice.Name = "labelPrice";
+ labelPrice.Size = new Size(48, 20);
+ labelPrice.TabIndex = 1;
+ labelPrice.Text = "Цена:";
+ //
+ // comboBoxModel
+ //
+ comboBoxModel.DropDownStyle = ComboBoxStyle.DropDownList;
+ comboBoxModel.FormattingEnabled = true;
+ comboBoxModel.Location = new Point(119, 52);
+ comboBoxModel.Name = "comboBoxModel";
+ comboBoxModel.Size = new Size(151, 28);
+ comboBoxModel.TabIndex = 2;
+ //
+ // numericUpDownPrice
+ //
+ numericUpDownPrice.DecimalPlaces = 2;
+ numericUpDownPrice.Location = new Point(120, 118);
+ numericUpDownPrice.Maximum = new decimal(new int[] { 39999, 0, 0, 131072 });
+ numericUpDownPrice.Minimum = new decimal(new int[] { 39999, 0, 0, 131072 });
+ numericUpDownPrice.Name = "numericUpDownPrice";
+ numericUpDownPrice.Size = new Size(150, 27);
+ numericUpDownPrice.TabIndex = 3;
+ numericUpDownPrice.Value = new decimal(new int[] { 39999, 0, 0, 131072 });
+ //
+ // buttonSave
+ //
+ buttonSave.Location = new Point(48, 206);
+ buttonSave.Name = "buttonSave";
+ buttonSave.Size = new Size(94, 29);
+ buttonSave.TabIndex = 4;
+ buttonSave.Text = "Сохранить";
+ buttonSave.UseVisualStyleBackColor = true;
+ buttonSave.Click += ButtonSave_Click;
+ //
+ // buttonCancel
+ //
+ buttonCancel.Location = new Point(176, 206);
+ buttonCancel.Name = "buttonCancel";
+ buttonCancel.Size = new Size(94, 29);
+ buttonCancel.TabIndex = 5;
+ buttonCancel.Text = "Отмена";
+ buttonCancel.UseVisualStyleBackColor = true;
+ buttonCancel.Click += ButtonCancel_Click;
+ //
+ // groupBox1
+ //
+ groupBox1.Controls.Add(dataGridView1);
+ groupBox1.Location = new Point(323, 23);
+ groupBox1.Name = "groupBox1";
+ groupBox1.Size = new Size(251, 227);
+ groupBox1.TabIndex = 6;
+ groupBox1.TabStop = false;
+ groupBox1.Text = "Ткани";
+ //
+ // dataGridView1
+ //
+ dataGridView1.AllowUserToOrderColumns = true;
+ dataGridView1.AllowUserToResizeColumns = false;
+ dataGridView1.AllowUserToResizeRows = false;
+ dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView1.Columns.AddRange(new DataGridViewColumn[] { ColumnFabric, ColumnCount });
+ dataGridView1.Dock = DockStyle.Fill;
+ dataGridView1.Location = new Point(3, 23);
+ dataGridView1.Name = "dataGridView1";
+ dataGridView1.RowHeadersVisible = false;
+ dataGridView1.RowHeadersWidth = 51;
+ dataGridView1.RowTemplate.Height = 29;
+ dataGridView1.Size = new Size(245, 201);
+ dataGridView1.TabIndex = 0;
+ //
+ // ColumnFabric
+ //
+ ColumnFabric.HeaderText = "Ткань";
+ ColumnFabric.MinimumWidth = 6;
+ ColumnFabric.Name = "ColumnFabric";
+ ColumnFabric.Resizable = DataGridViewTriState.True;
+ ColumnFabric.SortMode = DataGridViewColumnSortMode.Automatic;
+ //
+ // ColumnCount
+ //
+ ColumnCount.HeaderText = "Количество";
+ ColumnCount.MinimumWidth = 6;
+ ColumnCount.Name = "ColumnCount";
+ ColumnCount.Resizable = DataGridViewTriState.True;
+ ColumnCount.SortMode = DataGridViewColumnSortMode.NotSortable;
+ //
+ // FormModel
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(619, 284);
+ Controls.Add(groupBox1);
+ Controls.Add(buttonCancel);
+ Controls.Add(buttonSave);
+ Controls.Add(numericUpDownPrice);
+ Controls.Add(comboBoxModel);
+ Controls.Add(labelPrice);
+ Controls.Add(labelModel);
+ Name = "FormModel";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Модель";
+ ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit();
+ groupBox1.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private Label labelModel;
+ private Label labelPrice;
+ private ComboBox comboBoxModel;
+ private NumericUpDown numericUpDownPrice;
+ private Button buttonSave;
+ private Button buttonCancel;
+ private GroupBox groupBox1;
+ private DataGridView dataGridView1;
+ private DataGridViewComboBoxColumn ColumnFabric;
+ private DataGridViewTextBoxColumn ColumnCount;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormModel.cs b/Atelier/Atelier/Forms/FormModel.cs
new file mode 100644
index 0000000..0de2b46
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormModel.cs
@@ -0,0 +1,101 @@
+using Microsoft.VisualBasic.FileIO;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Reflection.Metadata.Ecma335;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Atelier.Forms
+{
+ public partial class FormModel : Form
+ {
+ private readonly IModelRepository _modelRepository;
+ private int? _modelId;
+ public int Id
+ {
+ set
+ {
+ try
+ {
+ var model = _modelRepository.ReadModelById(value);
+ if (model == null)
+ {
+ throw new
+ InvalidDataException(nameof(model));
+ }
+ comboBoxModel.SelectedItem = model.ModelType;
+ numericUpDownPrice.Value = (decimal)model.Price;
+ _modelId = value;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+ }
+ public FormModel(IModelRepository modelRepository, IFabricRepository fabricRepository)
+ {
+ InitializeComponent();
+ _modelRepository = modelRepository ??
+ throw new ArgumentNullException(nameof(modelRepository));
+ comboBoxModel.DataSource = Enum.GetValues(typeof(ModelType));
+ ColumnFabric.DataSource = fabricRepository.ReadFabrics();
+ ColumnFabric.DisplayMember = "FabricType";
+ ColumnFabric.ValueMember = "Id";
+
+ }
+ private void ButtonSave_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (comboBoxModel.SelectedIndex < 399.99 || dataGridView1.RowCount < 1)
+ {
+ throw new Exception("Имеются незаполненные поля");
+ }
+ if (_modelId.HasValue)
+ {
+ _modelRepository.UpdateModel(CreateModel(_modelId.Value));
+ }
+ else
+ {
+ _modelRepository.CreateModel(CreateModel(0));
+ }
+ Close();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при сохранении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonCancel_Click(object sender, EventArgs e) => Close();
+
+
+ private Model CreateModel(int id)
+ {
+ List fabricModels = new List();
+
+ foreach (DataGridViewRow row in dataGridView1.Rows)
+ {
+ if (row.Cells["ColumnFabric"].Value == null || row.Cells["ColumnCount"].Value == null || !(bool)row.Cells["CheckBoxColumn"].Value)
+ {
+ continue;
+ }
+
+ int fabricId = Convert.ToInt32(row.Cells["ColumnFabric"].Value);
+ int count = Convert.ToInt32(row.Cells["ColumnCount"].Value);
+
+ fabricModels.Add(FabricModel.CreateElement(0, fabricId, count));
+ }
+
+ return Model.CreateEntity(id, (ModelType)comboBoxModel.SelectedItem!, Convert.ToDouble(numericUpDownPrice.Value), fabricModels);
+ }
+ }
+}
+
diff --git a/Atelier/Atelier/Forms/FormModel.resx b/Atelier/Atelier/Forms/FormModel.resx
new file mode 100644
index 0000000..d668d73
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormModel.resx
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ True
+
+
+ True
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormModels.Designer.cs b/Atelier/Atelier/Forms/FormModels.Designer.cs
new file mode 100644
index 0000000..0aecfba
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormModels.Designer.cs
@@ -0,0 +1,128 @@
+namespace Atelier.Forms
+{
+ partial class FormModels
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormModels));
+ dataGridView1 = new DataGridView();
+ panel1 = new Panel();
+ buttonDel = new Button();
+ buttonUpd = new Button();
+ buttonAdd = new Button();
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
+ panel1.SuspendLayout();
+ SuspendLayout();
+ //
+ // dataGridView1
+ //
+ dataGridView1.AllowUserToAddRows = false;
+ dataGridView1.AllowUserToDeleteRows = false;
+ dataGridView1.AllowUserToResizeColumns = false;
+ dataGridView1.AllowUserToResizeRows = false;
+ dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView1.Dock = DockStyle.Fill;
+ dataGridView1.Location = new Point(0, 0);
+ dataGridView1.MultiSelect = false;
+ dataGridView1.Name = "dataGridView1";
+ dataGridView1.ReadOnly = true;
+ dataGridView1.RowHeadersVisible = false;
+ dataGridView1.RowHeadersWidth = 51;
+ dataGridView1.RowTemplate.Height = 29;
+ dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
+ dataGridView1.Size = new Size(1001, 604);
+ dataGridView1.TabIndex = 0;
+ //
+ // panel1
+ //
+ panel1.Controls.Add(buttonDel);
+ panel1.Controls.Add(buttonUpd);
+ panel1.Controls.Add(buttonAdd);
+ panel1.Dock = DockStyle.Right;
+ panel1.Location = new Point(1001, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(133, 604);
+ panel1.TabIndex = 1;
+ //
+ // buttonDel
+ //
+ buttonDel.Image = (Image)resources.GetObject("buttonDel.Image");
+ buttonDel.Location = new Point(14, 204);
+ buttonDel.Name = "buttonDel";
+ buttonDel.Size = new Size(107, 88);
+ buttonDel.TabIndex = 2;
+ buttonDel.UseVisualStyleBackColor = true;
+ buttonDel.Click += ButtonDel_Click;
+ //
+ // buttonUpd
+ //
+ buttonUpd.Image = (Image)resources.GetObject("buttonUpd.Image");
+ buttonUpd.Location = new Point(14, 107);
+ buttonUpd.Name = "buttonUpd";
+ buttonUpd.Size = new Size(107, 91);
+ buttonUpd.TabIndex = 1;
+ buttonUpd.UseVisualStyleBackColor = true;
+ buttonUpd.Click += ButtonUpd_Click;
+ //
+ // buttonAdd
+ //
+ buttonAdd.Image = (Image)resources.GetObject("buttonAdd.Image");
+ buttonAdd.Location = new Point(14, 12);
+ buttonAdd.Name = "buttonAdd";
+ buttonAdd.Size = new Size(107, 89);
+ buttonAdd.TabIndex = 0;
+ buttonAdd.UseVisualStyleBackColor = true;
+ buttonAdd.Click += ButtonAdd_Click;
+ //
+ // FormModels
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(1134, 604);
+ Controls.Add(dataGridView1);
+ Controls.Add(panel1);
+ Name = "FormModels";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Модели";
+ Load += FormModels_Load;
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
+ panel1.ResumeLayout(false);
+ ResumeLayout(false);
+ }
+
+
+
+ #endregion
+
+ private DataGridView dataGridView1;
+ private Panel panel1;
+ private Button buttonDel;
+ private Button buttonUpd;
+ private Button buttonAdd;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormModels.cs b/Atelier/Atelier/Forms/FormModels.cs
new file mode 100644
index 0000000..1d9d3d1
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormModels.cs
@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Unity;
+
+namespace Atelier.Forms
+{
+ public partial class FormModels : Form
+ {
+ private readonly IUnityContainer _container;
+ private readonly IModelRepository _modelRepository;
+ public FormModels(IUnityContainer container, IModelRepository modelRepository)
+ {
+ InitializeComponent();
+ _container = container ??
+ throw new ArgumentNullException(nameof(container));
+ _modelRepository = modelRepository ??
+ throw new
+ ArgumentNullException(nameof(modelRepository));
+
+ }
+ private void FormModels_Load(object sender, EventArgs e)
+ {
+ try
+ {
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonAdd_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при добавлении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonUpd_Click(object sender, EventArgs e)
+ {
+ if (!TryGetIdentifierFromSelectedRow(out var findId))
+ {
+ return;
+ }
+ try
+ {
+ var form = _container.Resolve();
+ form.Id = findId;
+ form.ShowDialog();
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при изменении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonDel_Click(object sender, EventArgs e)
+ {
+ if (!TryGetIdentifierFromSelectedRow(out var findId))
+ {
+ return;
+ }
+ if (MessageBox.Show("Удалить запись?", "Удаление",
+ MessageBoxButtons.YesNo) != DialogResult.Yes)
+ {
+ return;
+ }
+ try
+ {
+ _modelRepository.DeleteModel(findId);
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при удалении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void LoadList() => dataGridView1.DataSource = _modelRepository.ReadModels();
+ private bool TryGetIdentifierFromSelectedRow(out int id)
+ {
+ id = 0;
+ if (dataGridView1.SelectedRows.Count < 1)
+ {
+ MessageBox.Show("Нет выбранной записи", "Ошибка",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
+ }
+ id =
+ Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Id"].Value);
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormModels.resx b/Atelier/Atelier/Forms/FormModels.resx
new file mode 100644
index 0000000..ad98e8b
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormModels.resx
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DgAACw4BQL7hQQAABNVJREFUeF7tnL9uXHUQhZ2OKk8ANRJ5AHipNInXgCFKyuD1H/ECZJ11Eh7AViCP
+ ELeJaCgQHV2gIIULc0cZ0KfRaDTaO2Ph63ukrzg+oxnOzxvT7dasWbNmzbpafX93fXtve/XTcnt1sVwc
+ X47iw46XslPXT1/LxerbvcXqxcOHTz7SH20s2TE84o9728cP9EfT1/B4b5f3n36udrQOdp58sbc4/kXt
+ tPV4Z3VnKPv75dblLf3RaMmu4Zfy2/L++jP90XQ1/L16NPz921dbpuHPwoHsVjtdVf/z/Vf/63/G+/d+
+ +ORo99nL/Z31+//+7zdRpOPQ9efvFutPtf44yeMdfn3y7vTF+cWb8z8uf33716SRjmdD1/0vn/4p3fUZ
+ Npd88mShd2zKnD4/vzjaPTnTZ9hcB8NH+iZ88izSefgUvtdn2Fzyd8E7cBOQ7voMm2t+wJGaH3CkZMlN
+ Rp+hTrLU+21NgZYHs5ofcKTmBxyp+QFHyj5g9KDZx97kl1Kx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8o
+ PYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3Z
+ J+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZ
+ eK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U
+ 7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpI
+ do5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0
+ JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWaf
+ vKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bi
+ tWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx
+ 22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZ
+ OVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKT
+ KCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3y
+ jtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nX
+ mn3apOx1YX7AkVzJA8q3m03xq6DevJavelr/rTX7dLh78kq+mMv7j7jOnD5/fXH0zbNTrdkn+V49+Wo4
+ ecQpfBLlkyePd/jV+t3jnfXHWrNXH76Q8eRMvt1M/m5cZ6SDfPKu7PFmzZo1azLa2voHHNxQxvmbf3YA
+ AAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DgAACw4BQL7hQQAAB1ZJREFUeF7tmllPG1cUx+nePrXqB6j60OdK/QRVK/Wx6lPfKlVVpUiNbZakJKSp
+ SpSoNE1sszsZsGfwQqEGQmIWB0zYkhAgDklYTIBAAgRQtlZN1QRSKafn3LkzDOMxmCiNl/hIfwnP2Mz5
+ /e+9557xOCsTmchESobV4v7IahJzrGapwGap+QSy4CV+Kr3D/6X/FZtZcqBAK6tJCh3eIbzN35aeIcOL
+ HgIusUgQ3OWEblSFWXzCjRhMWxO08KWoifxquF8gMC3sqYJqiyjPBpMYtuVVv8s/lh5B8DjFvUbwRiZg
+ XbiU8ibYTK5v7GapzWoWf0DVEVgZKpJfFQWvaGFvFVRl85mQysvBZpIOcAhVsUZer5SfCSo8FrnfhD4o
+ zvM+ptdVFtfMXQNgI2lnAm6VQykzE7QjXy+eg/5LK3C6c1o1QbS4xp7WhOIc6R1+meQM/bRv8FxgBjAT
+ QusmSNniRNqZoIcXDp2E3sFF1YBnZQJuoz2FhYUv88smR2Bi+Sw5XPOSNQjuko6N8GEunQkui2t8OyaU
+ WcRH9Dn7TvELfunER2Gh/3WruYYBNdUOr0NzdfXfgMr9fqguCqjHmAm5ak2IxGtCMLd6iRltlo7yyyc+
+ aDriHn+PEvNWhNSRJp05dxMq9tWzqes63KoeV03QzIQ7BsB6NeQ6J+n9uDUW8csnPugODlvXZkqM5NOY
+ cKLuIjsmHGyGnqGN9YCZ0Dml3R0im5mAzdMTvM4qu47F9TG/fGKD4LEyl1JSJTk1TFoTei8uQ6D5KvQO
+ L6nQ3efnobF2CLoHZEPiMYE6R7tZXKP3UDvNL5/Y0MNPDQzD9HAYSnLdzARvWSf0hZdVcAXe8WMjO08m
+ KMe1fYIz2zWpNWESO8dikySPvElsLbWUvsFTSFwYwT/+c46JTCiNYQIVQjpOJpAZyvFYJmyEl5qEHcJr
+ PIXEhR5+evCiCq+agMeU5eAtX68JPkcPM0EPr0i7HASLa67YLMnT3iyeSEp47cjrNX0+hDNBLoweg+VA
+ 6sFewXm4Rd4ilT5BMxOYUmnkVd0egLXFEzDV8zuUZMsg2plAosIoHDzJzlGfoD0nzwSPbIJJ3MdTSFxE
+ jXwc8IpimdASGGPHygvqoatvToVXVO88y85j9Q/yNBITBI/9dxmDx+K2HXgjE5Qtsi+8BM0NI6xZUqBp
+ VjT6BsHvHsC9Xq4hVlPNDp7K84+okb8QDb84dhVaqtrg7rU+Q3hFUyGPWhO8ZR1RNYHgq4ta2HmNEtfy
+ xjPyC6NXoOJ7L0t29HS9ITjp0YwXHo4dg8lWAY3kM6G8c8O695SGtOC09n/hqTz/iIIfCkfB35oYhcp8
+ GT5Q4YNH802bwiuKZYJoC6YO/N3ZCJTv9rBkW4/Vwup8NDhpdcazAd7IBCqMTXjPYOdrPunhSUuRUVYT
+ 2oXY8PqR1+pW33FcOsoXHBolO/zq/Vn5b6z2/8wZT3nSVvCVHB4L7AW85ordIq3hTc5+nsrzj3jgqdof
+ K/BB0GkMrWgb8B22PP9bdO2Ednp6+OkY8Eq173LXRkHTMhhoqIPxduM1T1rsFVR41OnCr6U3eQqJC4LH
+ qVceL3yg0he15uk1FUI67z4gpha8OvIxevuliau41flY4qcMtjqCbzsuny/fJcKNLsEYPl8ucjTt0xRe
+ ghtnjOBxzXN4VLqO/IsO33V8U3gr3s1l4BMd/0fBu7nFtH/x4Hs01T7d4JV9fjN4tbc3ie0Z+GQIurOi
+ pOg7+pnhp+vwWhyyOQS4gKB6eDpWsZtPe5MUoAel/PKJDdvO6g8wKfl3dxYJXAfqoUVog6HWfpgbGWHa
+ Er5SHnmCp1GOhsdb2mSEp7CZXV9RYuUIST0+M8JAW8FTUaPKvhk8LrNTSQVPgT33Lkquuy4Eq/dm2Vof
+ 6TwHQSkINYf8LHHHXncc8JuPfFLCU9Dzc0pwINAXtfbX7s9CaZ6HLY2/ZtaLHsErBY/u3OjePRp+veDh
+ NdqS4kGlUeDICJTk5dD5KANItb82MYhwoA4eXG9i8LQc6JgjH+H7o+HnWcFTq31zUo68EvQ8jRK9FuPZ
+ XZevUwYh4Uxw7JG/kEwLeAqsyr2U7M0rlw0N+GN+EjrcHeD5uQGKsUdQzDCq9vPdtOaVaZ8kT2m3Ckx0
+ nBK+MzNuaIBWD+9cB0+R/KMF/V6fkvAUWANuU9IPlqcNofXq9HQwyLC/SoXfUO2T5RF1PCH/aktij5aX
+ J8cMgfW60jXAQNsrnAyeWl5qfekYjnxjysBTlGS732OjhnLs9cHKta1NWJ4cZe+XfqKWd33kUw6e4qhZ
+ /FQxQDVhanMTqFmiewZ7tnzTwz5rkhpSDp6CnqdrDdCa8PfKNNybi7DOcDZ8CSL9Q6xDpIapco/cBzAh
+ PC6lV/m/TK3ANviIFn67ws87UxaeAiH8eigmk/Qv7Q64riP4+iz18VgsRQS2YnOzD499e+S7mg/5v0nd
+ sFvEzxGmhZ74oEwI+FlxjvR+0v3EPBOZyMSziays/wB+daIEvDXupgAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DgAACw4BQL7hQQAACDBJREFUeF7tXFlTFFcU9inbQ5JfkOU9eyqVPGT7B6kk5UsEZmkYfMFUCpnunkE2
+ Uy6pCotCEKa3ARQliklYRWMEyvigErSMmriRlMlDSpGSmaFUoHO/yaUmNncchpnunhnmq/qqKObc7VR3
+ n3PPPeeuyyOPtQtPW/VTjgD/YaFUsdGpCM3Fmu8k4ZRbFf5xKnzYEfDOg/gb/8NvkIFsUcBbWihXfIA+
+ aHdrA4527ztEKVtLgv5zTtl7b9P+upnagYZw46isq6f36z0Xvtd7L/Xr/VeG9eEbx6LE3/gffoMMZGtI
+ m03ddTPogyh10inxdQVy+dt0mNxCQXv5i0WKt5Y8RX9v7Npyd/tIy/3gxAF98NqIPjL1Y0pEH9rZA/o2
+ 0mdpZ+Usp4p/OWS+xqHyL9DhsxeOgPAmWdCwWxUjW4ea5vadP8RUQjq579whvW5w15xbFubcqn9wg1Lx
+ Bp1O9gCKc6niaLHqDzWNygvpeNKSJcYkr/piseaPcKpvrFDiX6fTy1w41M+fdSuCRJ66cPO4tjB8/Shz
+ cVYSc9g1pi5ymjjHKb52Txv/DJ1uZsEpCeuJ8u7UDDRF+shHn7UYO/nD70N6dX9jBHN0SPyndNr2w6FW
+ P+GShYAnWBnaO2n+Ny5VdpE5lnZUhl3kaSxrKnucLsMewLq6VOGycPirUP/VzHvq4hFuEX94Z8StCZds
+ s9YFMv+qSxGnG0el+SNTx5gTzWRizg2j0gOyhttFgc2v0GVZA+wAyG5gtu1U1yJrctlErMFF1lIk8e/T
+ 5ZkLKI+8tmE4wqwJZSPhiGNNpiuR7ElfJv7dXQzImkg2s2PiWx1PoqN982t0uelF1GCQb14uvLbx+N/r
+ LN5Ou2GBq+JWxN9gMFgD5xJhWMjW82JaXRzsLry9O8PZaG2TJdZI3LKwWxPb6PJTA3YYHuJ4ZpOflyrh
+ J3qC/nCRvPljqobVge5t72TDDiPd7PrlIDEq4nRKe2e8ujWDTRHWAGbTCJaM2awaaIgQJbZSdSQHGsuz
+ LTBgBEvGbPZdGdIRy1yVa8Np4njzuGaby2IES8YK7h5TF4hB+YmqZWVA8LFY80WGbIznGcGSsYKIJ3Ka
+ L4w3kqonMTjVP4xIMqtDq2gES8YqEt9wvlj1DVD1PBrYceC9tyMM/38awZKxigNXR3ScsXwmlT9P1RQf
+ OD3bOtg0x+rIShrBkrGSdQNNcw7Vu4WqKT5wLNh9vpfZiZU0giVjJeELu1XhJlUTGzj0xrktqwOraQRL
+ xkpii1faUTnrbBPeoupaDqfEf7njaMt9VgdW0wiWjNXcPtJyzxHga6i6lgPpFpkSKDWCJWM11TP79WLN
+ f5aq62EgSQd5JnZb3yUawZKxmrDG0NH6ni+epGqLAVlSSPRhNbSDRrBk7GBZd+0MM/SPFDNkSbEa2UEj
+ WDJ2sLqvMVQoeUuo2mJwyXwL0sZYjeygESwZO1h/Qloke+MmqrYYkLiIjySrkR00giVjB5XT3ToxtmNU
+ bTFwqu8PJDCyGtlBI1gydvDAhe+IJfbdoGqLgVN8t3ov9zMb2UEjWDJ2EJmySDemaovBqQhhnAWwGiXD
+ TAdrzskQWV44P6Zqi8EheeeRj8xqlAwzHaw5J0PEB4tk7wOqthjyClwZ4yow/wqvjHFf4bwRWRnjGhFi
+ mqfybkxixnVjoo706bwjnYhyPEc6upUj2xRWIztoBEvGDsbdyuWDCStj3GACMk/LuvPhrEQs21c3s6G9
+ 4j2qthjyAdXEHLx2JH5AFSCGZDJT0neNYMlYTUSrSoK+M1Rdy4EyVFRSshpbTSNYMlZz25Hme07JW03V
+ tRyot0XJKKux1TSCJWMlcazp6aicTZgjw6niTSvKUhPRCJaMldw7eVDnNPFPqqb4QLFyPrVjOWsHGuec
+ El9J1RQfSPHPJxc9zKXkosI2/jmqpkfDrYhDjWP2ljQYwZKxivUnAvOcIvZT9SQGUlo5zRcZvG7fU2gE
+ S8YKIskUCZZJXx3Aqb7R3WOabUmWRrBkrOCuMWWBGI8fqVpWDqT54luIACKrY7NpBEvGbGLt5HMWWXU5
+ rFMR2mr67QkwGMGSMZtV/Q0Rlyq2UHUkDxSZoNAGZfKsAXKZnZOo3hSnN3SWPU3VsToUBryfeIKVaTkv
+ yRaiNsbT4Q8XtvMfUTWkBpcitHsPraViwx0h8uZ9Q5efOlD6STq8hFJQ1qC5xK+PBx6Q796F9T3Vj9Hl
+ pwfYobhk8VbbqS5b60fM5J6fOxeJ1b214h1HsiiQyl/K1ZL/4ERP9LwXt5HQ5ZoDZGfigoZcUmL00glF
+ CBfK/Lt0meYC5RBkwLutJ4M5cO1J5wLeKuY5h5mAd44LGmBYstE6Y84wGPjm4dNEl2UtooZFFS7yvTtD
+ 2eQnws/jD++IuDXfr6YZjJUCLo5LFvbg8jGUybMmnEnEDqMk6I+4NH9r2l2VVIALGrD1wRVzqPRmTd5O
+ IjBQ1VcfIa7YdNp2GOkG9s4uTWxFFAeV3nYWbC8RMU2EpBBVwe4i5b2tFUBAlnwbj3OqGIKRQUictTgz
+ iTHrRwPznOrDFaDHLb+hLR2AIos13wDOE1Bva/b1KbCsOD3DARDGJIrrM90xtgKo9HYE+CocmaJkdNuR
+ 5vs45U/Hk4k+0BcOvXFui6NHh+zdYrt1NQuot3VKQjV5MieQZ4Las+q+hlDjqBQtYkECY7yLuPEb8vMa
+ Tsg62iDRB32ggtIl81VJXQyRC0CSDraGjkCFBzl3RKnjXNB3HSm0yNleugqeuEkh/A+/IbkRsmiD3UPc
+ RJ888lgDWLfuXyHjrOzkVJ7gAAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormOrder.Designer.cs b/Atelier/Atelier/Forms/FormOrder.Designer.cs
new file mode 100644
index 0000000..c936c59
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormOrder.Designer.cs
@@ -0,0 +1,183 @@
+namespace Atelier.Forms
+{
+ partial class FormOrder
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ dateTimePicker1 = new DateTimePicker();
+ groupBox1 = new GroupBox();
+ dataGridView1 = new DataGridView();
+ ColumnModel = new DataGridViewComboBoxColumn();
+ ColumnCount = new DataGridViewTextBoxColumn();
+ labelClient = new Label();
+ comboBoxClient = new ComboBox();
+ comboBoxStatus = new ComboBox();
+ labelStatus = new Label();
+ buttonSave = new Button();
+ buttonCancel = new Button();
+ groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
+ SuspendLayout();
+ //
+ // dateTimePicker1
+ //
+ dateTimePicker1.Enabled = false;
+ dateTimePicker1.Location = new Point(20, 12);
+ dateTimePicker1.Name = "dateTimePicker1";
+ dateTimePicker1.Size = new Size(250, 27);
+ dateTimePicker1.TabIndex = 0;
+ //
+ // groupBox1
+ //
+ groupBox1.Controls.Add(dataGridView1);
+ groupBox1.Location = new Point(302, 12);
+ groupBox1.Name = "groupBox1";
+ groupBox1.Size = new Size(223, 176);
+ groupBox1.TabIndex = 1;
+ groupBox1.TabStop = false;
+ groupBox1.Text = "Модели";
+ //
+ // dataGridView1
+ //
+ dataGridView1.AllowUserToResizeColumns = false;
+ dataGridView1.AllowUserToResizeRows = false;
+ dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView1.Columns.AddRange(new DataGridViewColumn[] { ColumnModel, ColumnCount });
+ dataGridView1.Dock = DockStyle.Fill;
+ dataGridView1.Location = new Point(3, 23);
+ dataGridView1.Name = "dataGridView1";
+ dataGridView1.RowHeadersVisible = false;
+ dataGridView1.RowHeadersWidth = 51;
+ dataGridView1.RowTemplate.Height = 29;
+ dataGridView1.Size = new Size(217, 150);
+ dataGridView1.TabIndex = 0;
+ //
+ // ColumnModel
+ //
+ ColumnModel.HeaderText = "Модель";
+ ColumnModel.MinimumWidth = 6;
+ ColumnModel.Name = "ColumnModel";
+ //
+ // ColumnCount
+ //
+ ColumnCount.HeaderText = "Количество";
+ ColumnCount.MinimumWidth = 6;
+ ColumnCount.Name = "ColumnCount";
+ //
+ // labelClient
+ //
+ labelClient.AutoSize = true;
+ labelClient.Location = new Point(20, 79);
+ labelClient.Name = "labelClient";
+ labelClient.Size = new Size(61, 20);
+ labelClient.TabIndex = 2;
+ labelClient.Text = "Клиент:";
+ //
+ // comboBoxClient
+ //
+ comboBoxClient.FormattingEnabled = true;
+ comboBoxClient.Location = new Point(95, 79);
+ comboBoxClient.Name = "comboBoxClient";
+ comboBoxClient.Size = new Size(151, 28);
+ comboBoxClient.TabIndex = 3;
+ //
+ // comboBoxStatus
+ //
+ comboBoxStatus.FormattingEnabled = true;
+ comboBoxStatus.Location = new Point(95, 139);
+ comboBoxStatus.Name = "comboBoxStatus";
+ comboBoxStatus.Size = new Size(151, 28);
+ comboBoxStatus.TabIndex = 6;
+ //
+ // labelStatus
+ //
+ labelStatus.AutoSize = true;
+ labelStatus.Location = new Point(26, 142);
+ labelStatus.Name = "labelStatus";
+ labelStatus.Size = new Size(55, 20);
+ labelStatus.TabIndex = 7;
+ labelStatus.Text = "Статус:";
+ //
+ // buttonSave
+ //
+ buttonSave.Location = new Point(152, 231);
+ buttonSave.Name = "buttonSave";
+ buttonSave.Size = new Size(94, 29);
+ buttonSave.TabIndex = 8;
+ buttonSave.Text = "Сохранить";
+ buttonSave.UseVisualStyleBackColor = true;
+ buttonSave.Click += ButtonSave_Click;
+ //
+ // buttonCancel
+ //
+ buttonCancel.Location = new Point(302, 231);
+ buttonCancel.Name = "buttonCancel";
+ buttonCancel.Size = new Size(94, 29);
+ buttonCancel.TabIndex = 9;
+ buttonCancel.Text = "Отмена";
+ buttonCancel.UseVisualStyleBackColor = true;
+ buttonCancel.Click += ButtonCancel_Click;
+ //
+ // FormOrder
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(556, 298);
+ Controls.Add(buttonCancel);
+ Controls.Add(buttonSave);
+ Controls.Add(labelStatus);
+ Controls.Add(comboBoxStatus);
+ Controls.Add(comboBoxClient);
+ Controls.Add(labelClient);
+ Controls.Add(groupBox1);
+ Controls.Add(dateTimePicker1);
+ Name = "FormOrder";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Заказ";
+ groupBox1.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+
+ #endregion
+
+ private DateTimePicker dateTimePicker1;
+ private GroupBox groupBox1;
+ private DataGridView dataGridView1;
+ private DataGridViewComboBoxColumn ColumnModel;
+ private DataGridViewTextBoxColumn ColumnCount;
+ private Label labelClient;
+ private ComboBox comboBoxClient;
+ private ComboBox comboBoxStatus;
+ private Label labelStatus;
+ private Button buttonSave;
+ private Button buttonCancel;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormOrder.cs b/Atelier/Atelier/Forms/FormOrder.cs
new file mode 100644
index 0000000..b30a73d
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormOrder.cs
@@ -0,0 +1,72 @@
+using Microsoft.VisualBasic.FileIO;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Atelier.Forms
+{
+ public partial class FormOrder : Form
+ {
+ private readonly IOrderRepository _orderRepository;
+ public FormOrder(IOrderRepository orderRepository, IModelRepository modelRepository, IClientRepository clientRepository)
+ {
+ InitializeComponent();
+ _orderRepository = orderRepository ??
+ throw new
+ ArgumentNullException(nameof(orderRepository));
+ comboBoxClient.DataSource = clientRepository.ReadClients();
+ comboBoxClient.DisplayMember = "FirstName";
+ comboBoxClient.ValueMember = "Id";
+ comboBoxStatus.DataSource = orderRepository.ReadOrders();
+ comboBoxStatus.DataSource = Enum.GetValues(typeof(Status));
+ ColumnModel.DataSource = modelRepository.ReadModels();
+ ColumnModel.DisplayMember = "ModelType";
+ ColumnModel.ValueMember = "Id";
+ }
+ private void ButtonSave_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (dataGridView1.RowCount < 1 || comboBoxClient.SelectedIndex < 0 || comboBoxStatus.SelectedIndex < 0)
+ {
+ throw new Exception("Имеются незаполненные поля");
+ }
+
+
+ _orderRepository.CreateOrder(Order.CreateOperation(0, dateTimePicker1.Value, (Status)comboBoxStatus.SelectedValue,
+ (int)comboBoxClient.SelectedValue, CreateListModelOrderFromDataGrid()));
+ Close();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при сохранении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonCancel_Click(object sender, EventArgs e) =>
+ Close();
+ private List
+ CreateListModelOrderFromDataGrid()
+ {
+ var list = new List();
+ foreach (DataGridViewRow row in dataGridView1.Rows)
+ {
+ if (row.Cells["ColumnModel"].Value == null ||
+ row.Cells["ColumnCount"].Value == null)
+ {
+ continue;
+ }
+ list.Add(ModelOrder.CreateElement(0,
+ Convert.ToInt32(row.Cells["ColumnFeed"].Value),
+ Convert.ToInt32(row.Cells["ColumnCount"].Value)));
+ }
+ return list;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormOrder.resx b/Atelier/Atelier/Forms/FormOrder.resx
new file mode 100644
index 0000000..472458a
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormOrder.resx
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormOrders.Designer.cs b/Atelier/Atelier/Forms/FormOrders.Designer.cs
new file mode 100644
index 0000000..b63c573
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormOrders.Designer.cs
@@ -0,0 +1,113 @@
+namespace Atelier.Forms
+{
+ partial class FormOrders
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormOrders));
+ dataGridView1 = new DataGridView();
+ panel1 = new Panel();
+ buttonDel = new Button();
+ buttonAdd = new Button();
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
+ panel1.SuspendLayout();
+ SuspendLayout();
+ //
+ // dataGridView1
+ //
+ dataGridView1.AllowUserToAddRows = false;
+ dataGridView1.AllowUserToDeleteRows = false;
+ dataGridView1.AllowUserToResizeColumns = false;
+ dataGridView1.AllowUserToResizeRows = false;
+ dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView1.Dock = DockStyle.Fill;
+ dataGridView1.Location = new Point(0, 0);
+ dataGridView1.MultiSelect = false;
+ dataGridView1.Name = "dataGridView1";
+ dataGridView1.ReadOnly = true;
+ dataGridView1.RowHeadersVisible = false;
+ dataGridView1.RowHeadersWidth = 51;
+ dataGridView1.RowTemplate.Height = 29;
+ dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
+ dataGridView1.Size = new Size(1001, 604);
+ dataGridView1.TabIndex = 0;
+ //
+ // panel1
+ //
+ panel1.Controls.Add(buttonDel);
+ panel1.Controls.Add(buttonAdd);
+ panel1.Dock = DockStyle.Right;
+ panel1.Location = new Point(1001, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(133, 604);
+ panel1.TabIndex = 1;
+ //
+ // buttonDel
+ //
+ buttonDel.Image = (Image)resources.GetObject("buttonDel.Image");
+ buttonDel.Location = new Point(14, 204);
+ buttonDel.Name = "buttonDel";
+ buttonDel.Size = new Size(107, 88);
+ buttonDel.TabIndex = 2;
+ buttonDel.UseVisualStyleBackColor = true;
+ buttonDel.Click += ButtonDel_Click;
+ //
+ // buttonAdd
+ //
+ buttonAdd.Image = (Image)resources.GetObject("buttonAdd.Image");
+ buttonAdd.Location = new Point(14, 12);
+ buttonAdd.Name = "buttonAdd";
+ buttonAdd.Size = new Size(107, 89);
+ buttonAdd.TabIndex = 0;
+ buttonAdd.UseVisualStyleBackColor = true;
+ buttonAdd.Click += ButtonAdd_Click;
+ //
+ // FormOrders
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(1134, 604);
+ Controls.Add(dataGridView1);
+ Controls.Add(panel1);
+ Name = "FormOrders";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Заказы";
+ Load += FormOrders_Load;
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
+ panel1.ResumeLayout(false);
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private DataGridView dataGridView1;
+ private Panel panel1;
+ private Button buttonDel;
+ private Button buttonAdd;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormOrders.cs b/Atelier/Atelier/Forms/FormOrders.cs
new file mode 100644
index 0000000..bc9fb9e
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormOrders.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Unity;
+using static Atelier.Forms.FormOrders;
+
+namespace Atelier.Forms
+{
+ public partial class FormOrders : Form
+ {
+ private readonly IUnityContainer _container;
+ private readonly IOrderRepository _orderRepository;
+ public FormOrders(IUnityContainer container,
+ IOrderRepository orderRepository)
+ {
+ InitializeComponent();
+ _container = container ??
+ throw new ArgumentNullException(nameof(container));
+ _orderRepository = orderRepository ??
+ throw new
+ ArgumentNullException(nameof(orderRepository));
+ }
+ private void FormOrders_Load(object sender, EventArgs e)
+ {
+ try
+ {
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonAdd_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при добавлении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonDel_Click(object sender, EventArgs e)
+ {
+ if (!TryGetIdentifierFromSelectedRow(out var findId))
+ {
+ return;
+ }
+ if (MessageBox.Show("Удалить запись?", "Удаление",
+ MessageBoxButtons.YesNo) != DialogResult.Yes)
+ {
+ return;
+ }
+ try
+ {
+ _orderRepository.DeleteOrder(findId);
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при удалении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void LoadList() => dataGridView1.DataSource = _orderRepository.ReadOrders();
+ private bool TryGetIdentifierFromSelectedRow(out int id)
+ {
+ id = 0;
+ if (dataGridView1.SelectedRows.Count < 1)
+ {
+ MessageBox.Show("Нет выбранной записи", "Ошибка",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
+ }
+ id =
+ Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Id"].Value);
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormOrders.resx b/Atelier/Atelier/Forms/FormOrders.resx
new file mode 100644
index 0000000..079c320
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormOrders.resx
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DAAACwwBP0AiyAAABNVJREFUeF7tnL9uXHUQhZ2OKk8ANRJ5AHipNInXgCFKyuD1H/ECZJ11Eh7AViCP
+ ELeJaCgQHV2gIIULc0cZ0KfRaDTaO2Ph63ukrzg+oxnOzxvT7dasWbNmzbpafX93fXtve/XTcnt1sVwc
+ X47iw46XslPXT1/LxerbvcXqxcOHTz7SH20s2TE84o9728cP9EfT1/B4b5f3n36udrQOdp58sbc4/kXt
+ tPV4Z3VnKPv75dblLf3RaMmu4Zfy2/L++jP90XQ1/L16NPz921dbpuHPwoHsVjtdVf/z/Vf/63/G+/d+
+ +ORo99nL/Z31+//+7zdRpOPQ9efvFutPtf44yeMdfn3y7vTF+cWb8z8uf33716SRjmdD1/0vn/4p3fUZ
+ Npd88mShd2zKnD4/vzjaPTnTZ9hcB8NH+iZ88izSefgUvtdn2Fzyd8E7cBOQ7voMm2t+wJGaH3CkZMlN
+ Rp+hTrLU+21NgZYHs5ofcKTmBxyp+QFHyj5g9KDZx97kl1Kx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8o
+ PYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3Z
+ J+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZ
+ eK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U
+ 7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpI
+ do5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0
+ JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWaf
+ vKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bi
+ tWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx
+ 22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZ
+ OVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKT
+ KCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3y
+ jtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nX
+ mn3apOx1YX7AkVzJA8q3m03xq6DevJavelr/rTX7dLh78kq+mMv7j7jOnD5/fXH0zbNTrdkn+V49+Wo4
+ ecQpfBLlkyePd/jV+t3jnfXHWrNXH76Q8eRMvt1M/m5cZ6SDfPKu7PFmzZo1azLa2voHHNxQxvmbf3YA
+ AAAASUVORK5CYII=
+
+
+
+
+ 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
+
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormStorage.Designer.cs b/Atelier/Atelier/Forms/FormStorage.Designer.cs
new file mode 100644
index 0000000..628053c
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormStorage.Designer.cs
@@ -0,0 +1,122 @@
+namespace Atelier.Forms
+{
+ partial class FormStorage
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ comboBoxFabric = new ComboBox();
+ numericUpDownMetrage = new NumericUpDown();
+ labelFabric = new Label();
+ labelMetrage = new Label();
+ buttonSave = new Button();
+ buttonCancel = new Button();
+ ((System.ComponentModel.ISupportInitialize)numericUpDownMetrage).BeginInit();
+ SuspendLayout();
+ //
+ // comboBoxFabric
+ //
+ comboBoxFabric.FormattingEnabled = true;
+ comboBoxFabric.Location = new Point(130, 22);
+ comboBoxFabric.Name = "comboBoxFabric";
+ comboBoxFabric.Size = new Size(151, 28);
+ comboBoxFabric.TabIndex = 0;
+ //
+ // numericUpDownMetrage
+ //
+ numericUpDownMetrage.DecimalPlaces = 2;
+ numericUpDownMetrage.Location = new Point(131, 81);
+ numericUpDownMetrage.Name = "numericUpDownMetrage";
+ numericUpDownMetrage.Size = new Size(150, 27);
+ numericUpDownMetrage.TabIndex = 1;
+ //
+ // labelFabric
+ //
+ labelFabric.AutoSize = true;
+ labelFabric.Location = new Point(40, 30);
+ labelFabric.Name = "labelFabric";
+ labelFabric.Size = new Size(52, 20);
+ labelFabric.TabIndex = 2;
+ labelFabric.Text = "Ткань:";
+ //
+ // labelMetrage
+ //
+ labelMetrage.AutoSize = true;
+ labelMetrage.Location = new Point(40, 88);
+ labelMetrage.Name = "labelMetrage";
+ labelMetrage.Size = new Size(67, 20);
+ labelMetrage.TabIndex = 3;
+ labelMetrage.Text = "Метраж:";
+ //
+ // buttonSave
+ //
+ buttonSave.Location = new Point(50, 148);
+ buttonSave.Name = "buttonSave";
+ buttonSave.Size = new Size(94, 29);
+ buttonSave.TabIndex = 4;
+ buttonSave.Text = "Сохранить";
+ buttonSave.UseVisualStyleBackColor = true;
+ buttonSave.Click += ButtonSave_Click;
+ //
+ // buttonCancel
+ //
+ buttonCancel.Location = new Point(171, 148);
+ buttonCancel.Name = "buttonCancel";
+ buttonCancel.Size = new Size(94, 29);
+ buttonCancel.TabIndex = 5;
+ buttonCancel.Text = "Отмена";
+ buttonCancel.UseVisualStyleBackColor = true;
+ buttonCancel.Click += ButtonCancel_Click;
+ //
+ // FormStorage
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(320, 213);
+ Controls.Add(buttonCancel);
+ Controls.Add(buttonSave);
+ Controls.Add(labelMetrage);
+ Controls.Add(labelFabric);
+ Controls.Add(numericUpDownMetrage);
+ Controls.Add(comboBoxFabric);
+ Name = "FormStorage";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Склад";
+ ((System.ComponentModel.ISupportInitialize)numericUpDownMetrage).EndInit();
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private ComboBox comboBoxFabric;
+ private NumericUpDown numericUpDownMetrage;
+ private Label labelFabric;
+ private Label labelMetrage;
+ private Button buttonSave;
+ private Button buttonCancel;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormStorage.cs b/Atelier/Atelier/Forms/FormStorage.cs
new file mode 100644
index 0000000..6e10460
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormStorage.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Unity;
+
+namespace Atelier.Forms
+{
+ public partial class FormStorage : Form
+ {
+ private readonly IStorageRepository _storageRepository;
+ public FormStorage(IStorageRepository storageRepository, IFabricRepository fabricRepository)
+ {
+ InitializeComponent();
+ _storageRepository = storageRepository ??
+ throw new
+ ArgumentNullException(nameof(storageRepository));
+ comboBoxFabric.DataSource = fabricRepository.ReadFabrics();
+ comboBoxFabric.DisplayMember = "FabricType";
+ comboBoxFabric.ValueMember = "Id";
+ }
+
+
+ private void ButtonSave_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (comboBoxFabric.SelectedIndex < 0)
+ {
+ throw new Exception("Имеются незаполненные поля");
+ }
+ _storageRepository.CreateStorage(Storage.CreateOperation(0, (int)comboBoxFabric.SelectedValue!, Convert.ToInt32(numericUpDownMetrage.Value)));
+ Close();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при сохранении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonCancel_Click(object sender, EventArgs e) => Close();
+ }
+}
diff --git a/Atelier/Atelier/Forms/FormStorage.resx b/Atelier/Atelier/Forms/FormStorage.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormStorage.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormStorages.Designer.cs b/Atelier/Atelier/Forms/FormStorages.Designer.cs
new file mode 100644
index 0000000..a9cd81a
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormStorages.Designer.cs
@@ -0,0 +1,113 @@
+namespace Atelier.Forms
+{
+ partial class FormStorages
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormStorages));
+ dataGridView1 = new DataGridView();
+ panel1 = new Panel();
+ buttonDel = new Button();
+ buttonAdd = new Button();
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
+ panel1.SuspendLayout();
+ SuspendLayout();
+ //
+ // dataGridView1
+ //
+ dataGridView1.AllowUserToAddRows = false;
+ dataGridView1.AllowUserToDeleteRows = false;
+ dataGridView1.AllowUserToResizeColumns = false;
+ dataGridView1.AllowUserToResizeRows = false;
+ dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView1.Dock = DockStyle.Fill;
+ dataGridView1.Location = new Point(0, 0);
+ dataGridView1.MultiSelect = false;
+ dataGridView1.Name = "dataGridView1";
+ dataGridView1.ReadOnly = true;
+ dataGridView1.RowHeadersVisible = false;
+ dataGridView1.RowHeadersWidth = 51;
+ dataGridView1.RowTemplate.Height = 29;
+ dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
+ dataGridView1.Size = new Size(1001, 604);
+ dataGridView1.TabIndex = 0;
+ //
+ // panel1
+ //
+ panel1.Controls.Add(buttonDel);
+ panel1.Controls.Add(buttonAdd);
+ panel1.Dock = DockStyle.Right;
+ panel1.Location = new Point(1001, 0);
+ panel1.Name = "panel1";
+ panel1.Size = new Size(133, 604);
+ panel1.TabIndex = 1;
+ //
+ // buttonDel
+ //
+ buttonDel.Image = (Image)resources.GetObject("buttonDel.Image");
+ buttonDel.Location = new Point(14, 204);
+ buttonDel.Name = "buttonDel";
+ buttonDel.Size = new Size(107, 88);
+ buttonDel.TabIndex = 2;
+ buttonDel.UseVisualStyleBackColor = true;
+ buttonDel.Click += ButtonDel_Click;
+ //
+ // buttonAdd
+ //
+ buttonAdd.Image = (Image)resources.GetObject("buttonAdd.Image");
+ buttonAdd.Location = new Point(14, 12);
+ buttonAdd.Name = "buttonAdd";
+ buttonAdd.Size = new Size(107, 89);
+ buttonAdd.TabIndex = 0;
+ buttonAdd.UseVisualStyleBackColor = true;
+ buttonAdd.Click += ButtonAdd_Click;
+ //
+ // FormStorages
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(1134, 604);
+ Controls.Add(dataGridView1);
+ Controls.Add(panel1);
+ Name = "FormStorages";
+ StartPosition = FormStartPosition.CenterParent;
+ Text = "Склады";
+ Load += FormStorages_Load;
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
+ panel1.ResumeLayout(false);
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private DataGridView dataGridView1;
+ private Panel panel1;
+ private Button buttonDel;
+ private Button buttonAdd;
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormStorages.cs b/Atelier/Atelier/Forms/FormStorages.cs
new file mode 100644
index 0000000..57df5e5
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormStorages.cs
@@ -0,0 +1,91 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Unity;
+
+
+namespace Atelier.Forms
+{
+ public partial class FormStorages : Form
+ {
+ private readonly IUnityContainer _container;
+ private readonly IStorageRepository _storageRepository;
+ public FormStorages(IUnityContainer container, IStorageRepository storageRepository)
+ {
+ InitializeComponent();
+ _container = container ??
+ throw new ArgumentNullException(nameof(container));
+ _storageRepository = storageRepository ??
+ throw new
+ ArgumentNullException(nameof(storageRepository));
+ }
+ private void FormStorages_Load(object sender, EventArgs e)
+ {
+ try
+ {
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при загрузке",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonAdd_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при добавлении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void ButtonDel_Click(object sender, EventArgs e)
+ {
+ if (!TryGetIdentifierFromSelectedRow(out var findId))
+ {
+ return;
+ }
+ if (MessageBox.Show("Удалить запись?", "Удаление",
+ MessageBoxButtons.YesNo) != DialogResult.Yes)
+ {
+ return;
+ }
+ try
+ {
+ _storageRepository.DeleteStorage(findId);
+ LoadList();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при удалении",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ private void LoadList() => dataGridView1.DataSource =
+ _storageRepository.ReadStorage();
+ private bool TryGetIdentifierFromSelectedRow(out int id)
+ {
+ id = 0;
+ if (dataGridView1.SelectedRows.Count < 1)
+ {
+ MessageBox.Show("Нет выбранной записи", "Ошибка",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return false;
+ }
+ id =
+ Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Id"].Value);
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Forms/FormStorages.resx b/Atelier/Atelier/Forms/FormStorages.resx
new file mode 100644
index 0000000..9dbe4d9
--- /dev/null
+++ b/Atelier/Atelier/Forms/FormStorages.resx
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DgAACw4BQL7hQQAABNVJREFUeF7tnL9uXHUQhZ2OKk8ANRJ5AHipNInXgCFKyuD1H/ECZJ11Eh7AViCP
+ ELeJaCgQHV2gIIULc0cZ0KfRaDTaO2Ph63ukrzg+oxnOzxvT7dasWbNmzbpafX93fXtve/XTcnt1sVwc
+ X47iw46XslPXT1/LxerbvcXqxcOHTz7SH20s2TE84o9728cP9EfT1/B4b5f3n36udrQOdp58sbc4/kXt
+ tPV4Z3VnKPv75dblLf3RaMmu4Zfy2/L++jP90XQ1/L16NPz921dbpuHPwoHsVjtdVf/z/Vf/63/G+/d+
+ +ORo99nL/Z31+//+7zdRpOPQ9efvFutPtf44yeMdfn3y7vTF+cWb8z8uf33716SRjmdD1/0vn/4p3fUZ
+ Npd88mShd2zKnD4/vzjaPTnTZ9hcB8NH+iZ88izSefgUvtdn2Fzyd8E7cBOQ7voMm2t+wJGaH3CkZMlN
+ Rp+hTrLU+21NgZYHs5ofcKTmBxyp+QFHyj5g9KDZx97kl1Kx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8o
+ PYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3Z
+ J+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZ
+ eK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpIdo5U
+ 7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0JMpI
+ do5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWafvKP0
+ JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bitWaf
+ vKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx22bi
+ tWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZOVKx
+ 22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKTKCPZ
+ OVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3yjtKT
+ KCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nXmn3y
+ jtKTKCPZOVKx22bitWafvKP0JMpIdo5U7LaZeK3ZJ+8oPYkykp0jFbttJl5r9sk7Sk+ijGTnSMVum4nX
+ mn3apOx1YX7AkVzJA8q3m03xq6DevJavelr/rTX7dLh78kq+mMv7j7jOnD5/fXH0zbNTrdkn+V49+Wo4
+ ecQpfBLlkyePd/jV+t3jnfXHWrNXH76Q8eRMvt1M/m5cZ6SDfPKu7PFmzZo1azLa2voHHNxQxvmbf3YA
+ AAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAYAAACOEfKtAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+ DgAACw4BQL7hQQAACDBJREFUeF7tXFlTFFcU9inbQ5JfkOU9eyqVPGT7B6kk5UsEZmkYfMFUCpnunkE2
+ Uy6pCotCEKa3ARQliklYRWMEyvigErSMmriRlMlDSpGSmaFUoHO/yaUmNncchpnunhnmq/qqKObc7VR3
+ n3PPPeeuyyOPtQtPW/VTjgD/YaFUsdGpCM3Fmu8k4ZRbFf5xKnzYEfDOg/gb/8NvkIFsUcBbWihXfIA+
+ aHdrA4527ztEKVtLgv5zTtl7b9P+upnagYZw46isq6f36z0Xvtd7L/Xr/VeG9eEbx6LE3/gffoMMZGtI
+ m03ddTPogyh10inxdQVy+dt0mNxCQXv5i0WKt5Y8RX9v7Npyd/tIy/3gxAF98NqIPjL1Y0pEH9rZA/o2
+ 0mdpZ+Usp4p/OWS+xqHyL9DhsxeOgPAmWdCwWxUjW4ea5vadP8RUQjq579whvW5w15xbFubcqn9wg1Lx
+ Bp1O9gCKc6niaLHqDzWNygvpeNKSJcYkr/piseaPcKpvrFDiX6fTy1w41M+fdSuCRJ66cPO4tjB8/Shz
+ cVYSc9g1pi5ymjjHKb52Txv/DJ1uZsEpCeuJ8u7UDDRF+shHn7UYO/nD70N6dX9jBHN0SPyndNr2w6FW
+ P+GShYAnWBnaO2n+Ny5VdpE5lnZUhl3kaSxrKnucLsMewLq6VOGycPirUP/VzHvq4hFuEX94Z8StCZds
+ s9YFMv+qSxGnG0el+SNTx5gTzWRizg2j0gOyhttFgc2v0GVZA+wAyG5gtu1U1yJrctlErMFF1lIk8e/T
+ 5ZkLKI+8tmE4wqwJZSPhiGNNpiuR7ElfJv7dXQzImkg2s2PiWx1PoqN982t0uelF1GCQb14uvLbx+N/r
+ LN5Ou2GBq+JWxN9gMFgD5xJhWMjW82JaXRzsLry9O8PZaG2TJdZI3LKwWxPb6PJTA3YYHuJ4ZpOflyrh
+ J3qC/nCRvPljqobVge5t72TDDiPd7PrlIDEq4nRKe2e8ujWDTRHWAGbTCJaM2awaaIgQJbZSdSQHGsuz
+ LTBgBEvGbPZdGdIRy1yVa8Np4njzuGaby2IES8YK7h5TF4hB+YmqZWVA8LFY80WGbIznGcGSsYKIJ3Ka
+ L4w3kqonMTjVP4xIMqtDq2gES8YqEt9wvlj1DVD1PBrYceC9tyMM/38awZKxigNXR3ScsXwmlT9P1RQf
+ OD3bOtg0x+rIShrBkrGSdQNNcw7Vu4WqKT5wLNh9vpfZiZU0giVjJeELu1XhJlUTGzj0xrktqwOraQRL
+ xkpii1faUTnrbBPeoupaDqfEf7njaMt9VgdW0wiWjNXcPtJyzxHga6i6lgPpFpkSKDWCJWM11TP79WLN
+ f5aq62EgSQd5JnZb3yUawZKxmrDG0NH6ni+epGqLAVlSSPRhNbSDRrBk7GBZd+0MM/SPFDNkSbEa2UEj
+ WDJ2sLqvMVQoeUuo2mJwyXwL0sZYjeygESwZO1h/Qloke+MmqrYYkLiIjySrkR00giVjB5XT3ToxtmNU
+ bTFwqu8PJDCyGtlBI1gydvDAhe+IJfbdoGqLgVN8t3ov9zMb2UEjWDJ2EJmySDemaovBqQhhnAWwGiXD
+ TAdrzskQWV44P6Zqi8EheeeRj8xqlAwzHaw5J0PEB4tk7wOqthjyClwZ4yow/wqvjHFf4bwRWRnjGhFi
+ mqfybkxixnVjoo706bwjnYhyPEc6upUj2xRWIztoBEvGDsbdyuWDCStj3GACMk/LuvPhrEQs21c3s6G9
+ 4j2qthjyAdXEHLx2JH5AFSCGZDJT0neNYMlYTUSrSoK+M1Rdy4EyVFRSshpbTSNYMlZz25Hme07JW03V
+ tRyot0XJKKux1TSCJWMlcazp6aicTZgjw6niTSvKUhPRCJaMldw7eVDnNPFPqqb4QLFyPrVjOWsHGuec
+ El9J1RQfSPHPJxc9zKXkosI2/jmqpkfDrYhDjWP2ljQYwZKxivUnAvOcIvZT9SQGUlo5zRcZvG7fU2gE
+ S8YKIskUCZZJXx3Aqb7R3WOabUmWRrBkrOCuMWWBGI8fqVpWDqT54luIACKrY7NpBEvGbGLt5HMWWXU5
+ rFMR2mr67QkwGMGSMZtV/Q0Rlyq2UHUkDxSZoNAGZfKsAXKZnZOo3hSnN3SWPU3VsToUBryfeIKVaTkv
+ yRaiNsbT4Q8XtvMfUTWkBpcitHsPraViwx0h8uZ9Q5efOlD6STq8hFJQ1qC5xK+PBx6Q796F9T3Vj9Hl
+ pwfYobhk8VbbqS5b60fM5J6fOxeJ1b214h1HsiiQyl/K1ZL/4ERP9LwXt5HQ5ZoDZGfigoZcUmL00glF
+ CBfK/Lt0meYC5RBkwLutJ4M5cO1J5wLeKuY5h5mAd44LGmBYstE6Y84wGPjm4dNEl2UtooZFFS7yvTtD
+ 2eQnws/jD++IuDXfr6YZjJUCLo5LFvbg8jGUybMmnEnEDqMk6I+4NH9r2l2VVIALGrD1wRVzqPRmTd5O
+ IjBQ1VcfIa7YdNp2GOkG9s4uTWxFFAeV3nYWbC8RMU2EpBBVwe4i5b2tFUBAlnwbj3OqGIKRQUictTgz
+ iTHrRwPznOrDFaDHLb+hLR2AIos13wDOE1Bva/b1KbCsOD3DARDGJIrrM90xtgKo9HYE+CocmaJkdNuR
+ 5vs45U/Hk4k+0BcOvXFui6NHh+zdYrt1NQuot3VKQjV5MieQZ4Las+q+hlDjqBQtYkECY7yLuPEb8vMa
+ Tsg62iDRB32ggtIl81VJXQyRC0CSDraGjkCFBzl3RKnjXNB3HSm0yNleugqeuEkh/A+/IbkRsmiD3UPc
+ RJ888lgDWLfuXyHjrOzkVJ7gAAAAAElFTkSuQmCC
+
+
+
\ No newline at end of file
diff --git a/Atelier/Atelier/Program.cs b/Atelier/Atelier/Program.cs
index 579bec7..1b4db83 100644
--- a/Atelier/Atelier/Program.cs
+++ b/Atelier/Atelier/Program.cs
@@ -1,6 +1,8 @@
-namespace Atelier
-{
- internal static class Program
+using Atelier;
+using Unity;
+using Unity.Lifetime;
+
+internal static class Program
{
///
/// The main entry point for the application.
@@ -11,7 +13,16 @@ namespace Atelier
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
- Application.Run(new Form1());
+ Application.Run(CreateContainer().Resolve());
}
+ private static IUnityContainer CreateContainer()
+ {
+ var container = new UnityContainer();
+ container.RegisterType(new TransientLifetimeManager());
+ container.RegisterType(new TransientLifetimeManager());
+ container.RegisterType(new TransientLifetimeManager());
+ container.RegisterType(new TransientLifetimeManager());
+ container.RegisterType(new TransientLifetimeManager());
+ return container;
}
-}
\ No newline at end of file
+}
diff --git a/Atelier/Atelier/Properties/Resources.Designer.cs b/Atelier/Atelier/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..12c5263
--- /dev/null
+++ b/Atelier/Atelier/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// Этот код создан программой.
+// Исполняемая версия:4.0.30319.42000
+//
+// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
+// повторной генерации кода.
+//
+//------------------------------------------------------------------------------
+
+namespace Atelier.Properties {
+ using System;
+
+
+ ///
+ /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
+ ///
+ // Этот класс создан автоматически классом StronglyTypedResourceBuilder
+ // с помощью такого средства, как ResGen или Visual Studio.
+ // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
+ // с параметром /str или перестройте свой проект VS.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Atelier.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Перезаписывает свойство CurrentUICulture текущего потока для всех
+ /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/Atelier/Atelier/Form1.resx b/Atelier/Atelier/Properties/Resources.resx
similarity index 100%
rename from Atelier/Atelier/Form1.resx
rename to Atelier/Atelier/Properties/Resources.resx
diff --git a/Atelier/Atelier/Repositories/IClientRepository.cs b/Atelier/Atelier/Repositories/IClientRepository.cs
new file mode 100644
index 0000000..f1ab940
--- /dev/null
+++ b/Atelier/Atelier/Repositories/IClientRepository.cs
@@ -0,0 +1,9 @@
+public interface IClientRepository
+{
+ IEnumerable ReadClients();
+ Client ReadClientById(int id);
+ void CreateClient(Client client);
+ void UpdateClient(Client client);
+ void DeleteClient(int id);
+
+}
diff --git a/Atelier/Atelier/Repositories/IFabricRepository.cs b/Atelier/Atelier/Repositories/IFabricRepository.cs
new file mode 100644
index 0000000..6086934
--- /dev/null
+++ b/Atelier/Atelier/Repositories/IFabricRepository.cs
@@ -0,0 +1,9 @@
+public interface IFabricRepository
+{
+ IEnumerable ReadFabrics();
+ Fabric ReadFabricById(int id);
+ void CreateFabric(Fabric fabric);
+ void UpdateFabric(Fabric fabric);
+ void DeleteFabric(int id);
+
+}
diff --git a/Atelier/Atelier/Repositories/IModelRepository.cs b/Atelier/Atelier/Repositories/IModelRepository.cs
new file mode 100644
index 0000000..def0969
--- /dev/null
+++ b/Atelier/Atelier/Repositories/IModelRepository.cs
@@ -0,0 +1,9 @@
+public interface IModelRepository
+{
+ IEnumerable ReadModels();
+ Model ReadModelById(int id);
+ void CreateModel(Model model);
+ void UpdateModel(Model model);
+ void DeleteModel(int id);
+
+}
diff --git a/Atelier/Atelier/Repositories/IOrderRepository.cs b/Atelier/Atelier/Repositories/IOrderRepository.cs
new file mode 100644
index 0000000..d41795b
--- /dev/null
+++ b/Atelier/Atelier/Repositories/IOrderRepository.cs
@@ -0,0 +1,7 @@
+public interface IOrderRepository
+{
+ IEnumerable ReadOrders(int? id = null, DateTime? dateFrom = null, DateTime? dateTo = null,
+ Status? status = null, int? clientId = null);
+ void CreateOrder(Order order);
+ void DeleteOrder(int id);
+}
diff --git a/Atelier/Atelier/Repositories/IStorageRepository.cs b/Atelier/Atelier/Repositories/IStorageRepository.cs
new file mode 100644
index 0000000..e5db76d
--- /dev/null
+++ b/Atelier/Atelier/Repositories/IStorageRepository.cs
@@ -0,0 +1,6 @@
+public interface IStorageRepository
+{
+ IEnumerable ReadStorage(double? minStockMetrage = null, double? maxStockMetrage = null, int? fabricId = null);
+ void CreateStorage(Storage storage);
+ void DeleteStorage(int id);
+}
diff --git a/Atelier/Atelier/Repositories/Implementations/ClientRepository.cs b/Atelier/Atelier/Repositories/Implementations/ClientRepository.cs
new file mode 100644
index 0000000..3b2c222
--- /dev/null
+++ b/Atelier/Atelier/Repositories/Implementations/ClientRepository.cs
@@ -0,0 +1,23 @@
+using Microsoft.VisualBasic.FileIO;
+
+internal class ClientRepository : IClientRepository
+{
+ public void CreateClient(Client client)
+ {
+ }
+ public void DeleteClient(int id)
+ {
+ }
+ public Client ReadClientById(int id)
+ {
+
+ return Client.CreateEntity(0, string.Empty, string.Empty, string.Empty);
+ }
+ public IEnumerable ReadClients()
+ {
+ return [];
+ }
+ public void UpdateClient(Client client)
+ {
+ }
+}
\ No newline at end of file
diff --git a/Atelier/Atelier/Repositories/Implementations/FabricRepository.cs b/Atelier/Atelier/Repositories/Implementations/FabricRepository.cs
new file mode 100644
index 0000000..375cdbe
--- /dev/null
+++ b/Atelier/Atelier/Repositories/Implementations/FabricRepository.cs
@@ -0,0 +1,20 @@
+internal class FabricRepository : IFabricRepository
+{
+ public void CreateFabric(Fabric fabric)
+ {
+ }
+ public void DeleteFabric(int id)
+ {
+ }
+ public Fabric ReadFabricById(int id)
+ {
+ return Fabric.CreateEntity(0, FabricType.None, Color.None, 0);
+ }
+ public IEnumerable ReadFabrics()
+ {
+ return [];
+ }
+ public void UpdateFabric(Fabric fabric)
+ {
+ }
+}
diff --git a/Atelier/Atelier/Repositories/Implementations/ModelRepository.cs b/Atelier/Atelier/Repositories/Implementations/ModelRepository.cs
new file mode 100644
index 0000000..0277982
--- /dev/null
+++ b/Atelier/Atelier/Repositories/Implementations/ModelRepository.cs
@@ -0,0 +1,20 @@
+internal class ModelRepository : IModelRepository
+{
+ public void CreateModel(Model model)
+ {
+ }
+ public void DeleteModel(int id)
+ {
+ }
+ public Model ReadModelById(int id)
+ {
+ return Model.CreateEntity(0, ModelType.None, 0, Enumerable.Empty());
+ }
+ public IEnumerable ReadModels()
+ {
+ return [];
+ }
+ public void UpdateModel(Model model)
+ {
+ }
+}
diff --git a/Atelier/Atelier/Repositories/Implementations/OrderRepository.cs b/Atelier/Atelier/Repositories/Implementations/OrderRepository.cs
new file mode 100644
index 0000000..46ce36d
--- /dev/null
+++ b/Atelier/Atelier/Repositories/Implementations/OrderRepository.cs
@@ -0,0 +1,14 @@
+internal class OrderRepository : IOrderRepository
+{
+ public void CreateOrder(Order order)
+ {
+ }
+ public void DeleteOrder(int id)
+ {
+ }
+ public IEnumerable ReadOrders(int? id = null, DateTime?dateForm = null, DateTime? dateTo = null,
+ Status? status = null, int? clientId = null)
+ {
+ return [];
+ }
+}
diff --git a/Atelier/Atelier/Repositories/Implementations/StorageRepository.cs b/Atelier/Atelier/Repositories/Implementations/StorageRepository.cs
new file mode 100644
index 0000000..a1bd1bf
--- /dev/null
+++ b/Atelier/Atelier/Repositories/Implementations/StorageRepository.cs
@@ -0,0 +1,16 @@
+internal class StorageRepository : IStorageRepository
+{
+ public void CreateStorage(Storage storage)
+ {
+ }
+ public void UpdateStorage(Storage storage)
+ {
+ }
+ public void DeleteStorage(int id)
+ {
+ }
+ public IEnumerable ReadStorage(double? minStockMetrage = null, double? maxStockMetrage = null, int? fabricId = null)
+ {
+ return [];
+ }
+}