Compare commits

...

1 Commits

Author SHA1 Message Date
930a6448ab 1 лаба 2024-12-10 20:13:54 +04:00
63 changed files with 5622 additions and 77 deletions

View File

@ -0,0 +1,20 @@
namespace ProjectConfectFactory.Entities;
public class Component
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public string Unit { get; private set; } = string.Empty;
public decimal Count { get; private set; }
public static Component CreateEntity(int id, string name, string unit, decimal count)
{
return new Component
{
Id = id,
Name = name ?? string.Empty,
Unit = unit ?? string.Empty,
Count = count
};
}
}

View File

@ -0,0 +1,12 @@
namespace ProjectConfectFactory.Entities.Enums;
public enum DeliveryType
{
None = 0,
Express = 1, // 1-2 дня
Middle = 2, // 3-5 дней
Long = 3 // 6-10 дней
}

View File

@ -0,0 +1,19 @@
namespace ProjectConfectFactory.Entities.Enums;
[Flags]
public enum ProductType
{
None = 0,
Dark = 1, // горький шоколад
White = 2, // белый шоколад
Nut = 4, // ореховый
Fondant = 8, // с помадкой
Alcohol = 16 // с алкоголем
}

View File

@ -0,0 +1,23 @@
namespace ProjectConfectFactory.Entities;
// заказ
public class Order
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public string Phone { get; private set; } = string.Empty;
public IEnumerable<OrderProducts> OrderProducts { get; private set;} = [];
public DateTime DateTime { get; private set; }
public static Order CreateOpeartion(int id, string name, string phone, IEnumerable<OrderProducts> orderProducts)
{
return new Order
{
Id = id,
Name = name ?? string.Empty,
Phone = phone ?? string.Empty,
OrderProducts = orderProducts,
DateTime = DateTime.Now
};
}
}

View File

@ -0,0 +1,21 @@
namespace ProjectConfectFactory.Entities;
// класс продукт в заказе
public class OrderProducts
{
public int Id { get; private set; }
public int ProductId { get; private set; }
public int Count { get; private set; }
public decimal Price { get; private set; }
public static OrderProducts CreateElement(int id, int productId, int count, decimal price)
{
return new OrderProducts
{
Id = id,
ProductId = productId,
Count = count,
Price = price
};
}
}

View File

@ -0,0 +1,24 @@
using ProjectConfectFactory.Entities.Enums;
namespace ProjectConfectFactory.Entities;
public class Product
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public ProductType ProductType { get; private set; }
public IEnumerable<Recipe> Recipe { get; private set; } = [];
public decimal Price { get; private set; }
public static Product CreateEntity(int id, string name, ProductType productType, IEnumerable<Recipe> recipe, decimal price)
{
return new Product
{
Id = id,
Name = name ?? string.Empty,
ProductType = productType,
Recipe = recipe,
Price = price
};
}
}

View File

@ -0,0 +1,21 @@
namespace ProjectConfectFactory.Entities;
//Закупка
public class Purchase
{
public int Id { get; private set; }
public DateTime DateTime { get; private set; }
public int SellerId { get; private set; }
public int ComponentId { get; private set; }
public static Purchase CreateOpeartion(int id, int sellerId, int componentId)
{
return new Purchase
{
Id = id,
DateTime = DateTime.Now,
SellerId = sellerId,
ComponentId = componentId
};
}
}

View File

@ -0,0 +1,19 @@
namespace ProjectConfectFactory.Entities;
// класс компонент в продукте (рецепт)
public class Recipe
{
public int Id { get; private set; }
public int ComponentId { get; private set; }
public double CountComponent { get; private set; }
public static Recipe CreateElement(int id, int componentId, double countComponent)
{
return new Recipe
{
Id = id,
ComponentId = componentId,
CountComponent = countComponent
};
}
}

View File

@ -0,0 +1,22 @@
using ProjectConfectFactory.Entities.Enums;
namespace ProjectConfectFactory.Entities;
public class Seller
{
public int Id { get; private set; }
public string Name { get; private set; } = string.Empty;
public string Phone { get; private set; } = string.Empty;
public DeliveryType DeliveryTime { get; private set; }
public static Seller CreateEntity(int id, string name, string phone, DeliveryType deliveryTime)
{
return new Seller
{
Id = id,
Name = name ?? string.Empty,
Phone = phone ?? string.Empty,
DeliveryTime = deliveryTime
};
}
}

View File

@ -1,39 +0,0 @@
namespace ProjectConfectFactory
{
partial class Form1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Text = "Form1";
}
#endregion
}
}

View File

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

View File

@ -0,0 +1,139 @@
namespace ProjectConfectFactory
{
partial class FormConFactory
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
menuStripTool = new MenuStrip();
справочникиToolStripMenuItem = new ToolStripMenuItem();
ProductToolStripMenuItem = new ToolStripMenuItem();
SellerToolStripMenuItem = new ToolStripMenuItem();
ComponentToolStripMenuItem = new ToolStripMenuItem();
операцииToolStripMenuItem = new ToolStripMenuItem();
OrderToolStripMenuItem = new ToolStripMenuItem();
PurchaseToolStripMenuItem = new ToolStripMenuItem();
ReportToolStripMenuItem = new ToolStripMenuItem();
menuStripTool.SuspendLayout();
SuspendLayout();
//
// menuStripTool
//
menuStripTool.BackColor = Color.Bisque;
menuStripTool.ImageScalingSize = new Size(20, 20);
menuStripTool.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, операцииToolStripMenuItem, ReportToolStripMenuItem });
menuStripTool.Location = new Point(0, 0);
menuStripTool.Name = "menuStripTool";
menuStripTool.Size = new Size(862, 28);
menuStripTool.TabIndex = 0;
menuStripTool.Text = "menuStrip1";
//
// справочникиToolStripMenuItem
//
справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ProductToolStripMenuItem, SellerToolStripMenuItem, ComponentToolStripMenuItem });
справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
справочникиToolStripMenuItem.Size = new Size(117, 24);
справочникиToolStripMenuItem.Text = "Справочники";
//
// ProductToolStripMenuItem
//
ProductToolStripMenuItem.Name = "ProductToolStripMenuItem";
ProductToolStripMenuItem.Size = new Size(182, 26);
ProductToolStripMenuItem.Text = "Продукты";
ProductToolStripMenuItem.Click += ProductToolStripMenuItem_Click;
//
// SellerToolStripMenuItem
//
SellerToolStripMenuItem.Name = "SellerToolStripMenuItem";
SellerToolStripMenuItem.Size = new Size(182, 26);
SellerToolStripMenuItem.Text = "Поставщики";
SellerToolStripMenuItem.Click += SellerToolStripMenuItem_Click;
//
// ComponentToolStripMenuItem
//
ComponentToolStripMenuItem.Name = "ComponentToolStripMenuItem";
ComponentToolStripMenuItem.Size = new Size(182, 26);
ComponentToolStripMenuItem.Text = "Компоненты";
ComponentToolStripMenuItem.Click += ComponentToolStripMenuItem_Click;
//
// операцииToolStripMenuItem
//
операцииToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { OrderToolStripMenuItem, PurchaseToolStripMenuItem });
операцииToolStripMenuItem.Name = "операцииToolStripMenuItem";
операцииToolStripMenuItem.Size = new Size(95, 24);
операцииToolStripMenuItem.Text = "Операции";
//
// OrderToolStripMenuItem
//
OrderToolStripMenuItem.Name = "OrderToolStripMenuItem";
OrderToolStripMenuItem.Size = new Size(156, 26);
OrderToolStripMenuItem.Text = "Заказ";
OrderToolStripMenuItem.Click += OrderToolStripMenuItem_Click;
//
// PurchaseToolStripMenuItem
//
PurchaseToolStripMenuItem.Name = "PurchaseToolStripMenuItem";
PurchaseToolStripMenuItem.Size = new Size(156, 26);
PurchaseToolStripMenuItem.Text = "Поставка";
PurchaseToolStripMenuItem.Click += PurchaseToolStripMenuItem_Click;
//
// ReportToolStripMenuItem
//
ReportToolStripMenuItem.Name = "ReportToolStripMenuItem";
ReportToolStripMenuItem.Size = new Size(73, 24);
ReportToolStripMenuItem.Text = "Отчёты";
//
// FormConFactory
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackgroundImage = Properties.Resources.Фон;
BackgroundImageLayout = ImageLayout.Stretch;
ClientSize = new Size(862, 453);
Controls.Add(menuStripTool);
MainMenuStrip = menuStripTool;
Name = "FormConFactory";
StartPosition = FormStartPosition.CenterParent;
Text = "\"Кондитерская фабрика\"";
menuStripTool.ResumeLayout(false);
menuStripTool.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
private MenuStrip menuStripTool;
private ToolStripMenuItem справочникиToolStripMenuItem;
private ToolStripMenuItem ProductToolStripMenuItem;
private ToolStripMenuItem SellerToolStripMenuItem;
private ToolStripMenuItem ComponentToolStripMenuItem;
private ToolStripMenuItem операцииToolStripMenuItem;
private ToolStripMenuItem OrderToolStripMenuItem;
private ToolStripMenuItem PurchaseToolStripMenuItem;
private ToolStripMenuItem ReportToolStripMenuItem;
}
}

View File

@ -0,0 +1,85 @@
namespace ProjectConfectFactory;
using ProjectConfectFactory.Forms;
using Unity;
public partial class FormConFactory : Form
{
private readonly IUnityContainer _container;
public FormConFactory(IUnityContainer container)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
}
private void ProductToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormProducts>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void SellerToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormSellers>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ComponentToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
_container.Resolve<FormComponents>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void OrderToolStripMenuItem_Click(object sender, EventArgs e)
{
{
try
{
_container.Resolve<FormOrders>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void PurchaseToolStripMenuItem_Click(object sender, EventArgs e)
{
{
try
{
_container.Resolve<FormPurchases>().ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при загрузке",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

View File

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

View File

@ -0,0 +1,161 @@
namespace ProjectConfectFactory.Forms
{
partial class FormComponent
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
buttonBack = new Button();
ButtonSave = new Button();
label4 = new Label();
label3 = new Label();
label2 = new Label();
label1 = new Label();
textBoxComponentUnit = new TextBox();
textBoxComponentName = new TextBox();
numericUpDownComponentCount = new NumericUpDown();
((System.ComponentModel.ISupportInitialize)numericUpDownComponentCount).BeginInit();
SuspendLayout();
//
// buttonBack
//
buttonBack.Location = new Point(291, 245);
buttonBack.Name = "buttonBack";
buttonBack.Size = new Size(94, 29);
buttonBack.TabIndex = 17;
buttonBack.Text = "Отмена";
buttonBack.UseVisualStyleBackColor = true;
buttonBack.Click += buttonBack_Click;
//
// ButtonSave
//
ButtonSave.Location = new Point(67, 245);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(94, 29);
ButtonSave.TabIndex = 16;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(22, 191);
label4.Name = "label4";
label4.Size = new Size(112, 20);
label4.TabIndex = 15;
label4.Text = "Кол-во сейчас:";
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(22, 131);
label3.Name = "label3";
label3.Size = new Size(113, 20);
label3.TabIndex = 14;
label3.Text = "Ед. измерения:";
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(22, 67);
label2.Name = "label2";
label2.Size = new Size(119, 20);
label2.TabIndex = 13;
label2.Text = "Наименование:";
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Font = new Font("Segoe UI", 10F);
label1.Location = new Point(169, 9);
label1.Name = "label1";
label1.Size = new Size(102, 23);
label1.TabIndex = 12;
label1.Text = "Компонент:";
//
// textBoxComponentUnit
//
textBoxComponentUnit.Location = new Point(206, 124);
textBoxComponentUnit.Name = "textBoxComponentUnit";
textBoxComponentUnit.Size = new Size(218, 27);
textBoxComponentUnit.TabIndex = 10;
//
// textBoxComponentName
//
textBoxComponentName.Location = new Point(206, 60);
textBoxComponentName.Name = "textBoxComponentName";
textBoxComponentName.Size = new Size(218, 27);
textBoxComponentName.TabIndex = 9;
//
// numericUpDownComponentCount
//
numericUpDownComponentCount.Location = new Point(206, 184);
numericUpDownComponentCount.Maximum = new decimal(new int[] { 10000, 0, 0, 0 });
numericUpDownComponentCount.Name = "numericUpDownComponentCount";
numericUpDownComponentCount.Size = new Size(218, 27);
numericUpDownComponentCount.TabIndex = 18;
//
// FormComponent
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(482, 303);
Controls.Add(numericUpDownComponentCount);
Controls.Add(buttonBack);
Controls.Add(ButtonSave);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(textBoxComponentUnit);
Controls.Add(textBoxComponentName);
Name = "FormComponent";
StartPosition = FormStartPosition.CenterParent;
Text = "Компонент";
((System.ComponentModel.ISupportInitialize)numericUpDownComponentCount).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Button buttonBack;
private Button ButtonSave;
private Label label4;
private Label label3;
private Label label2;
private Label label1;
private TextBox textBoxComponentUnit;
private TextBox textBoxComponentName;
private NumericUpDown numericUpDownComponentCount;
}
}

View File

@ -0,0 +1,74 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Repositories;
namespace ProjectConfectFactory.Forms;
public partial class FormComponent : Form
{
private readonly IComponentRepository _componentRepository;
private int? _componentId;
public int Id
{
set
{
try
{
var component = _componentRepository.ReadComponentById(value);
if (component == null)
{
throw new InvalidDataException(nameof(component));
}
textBoxComponentName.Text = component.Name;
textBoxComponentUnit.Text = component.Unit;
numericUpDownComponentCount.Value = (decimal)component.Count;
_componentId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormComponent(IComponentRepository componentRepository, IPurchaseRepository purchaseRepository)
{
InitializeComponent();
_componentRepository = componentRepository ?? throw new ArgumentNullException(nameof(componentRepository));
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxComponentName.Text) || string.IsNullOrWhiteSpace(textBoxComponentUnit.Text) || numericUpDownComponentCount.Value == 0)
{
throw new Exception("Имеются незаполненные поля");
}
if (_componentId.HasValue)
{
_componentRepository.UpdateComponent(CreateComponent(_componentId.Value));
}
else
{
_componentRepository.CreateComponent(CreateComponent(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonBack_Click(object sender, EventArgs e) => Close();
private Component CreateComponent(int id) => Component.CreateEntity(id, textBoxComponentName.Text, textBoxComponentUnit.Text,
Convert.ToDecimal(numericUpDownComponentCount.Value));
}

View File

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

View File

@ -0,0 +1,130 @@
namespace ProjectConfectFactory.Forms
{
partial class FormComponents
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormComponents));
panel1 = new Panel();
buttonUpd = new Button();
buttonDel = new Button();
buttonAdd = new Button();
dataGridViewComponents = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewComponents).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonUpd);
panel1.Controls.Add(buttonDel);
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(657, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 450);
panel1.TabIndex = 1;
//
// buttonUpd
//
buttonUpd.BackgroundImage = (Image)resources.GetObject("buttonUpd.BackgroundImage");
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(27, 339);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(95, 90);
buttonUpd.TabIndex = 4;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonDel
//
buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage");
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(27, 134);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(95, 90);
buttonDel.TabIndex = 3;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridViewComponents
//
dataGridViewComponents.AllowUserToAddRows = false;
dataGridViewComponents.AllowUserToDeleteRows = false;
dataGridViewComponents.AllowUserToResizeColumns = false;
dataGridViewComponents.AllowUserToResizeRows = false;
dataGridViewComponents.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewComponents.BackgroundColor = Color.Bisque;
dataGridViewComponents.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewComponents.Dock = DockStyle.Fill;
dataGridViewComponents.GridColor = Color.Bisque;
dataGridViewComponents.Location = new Point(0, 0);
dataGridViewComponents.MultiSelect = false;
dataGridViewComponents.Name = "dataGridViewComponents";
dataGridViewComponents.ReadOnly = true;
dataGridViewComponents.RowHeadersVisible = false;
dataGridViewComponents.RowHeadersWidth = 51;
dataGridViewComponents.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewComponents.Size = new Size(657, 450);
dataGridViewComponents.TabIndex = 2;
//
// FormComponents
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridViewComponents);
Controls.Add(panel1);
Name = "FormComponents";
Text = "Компоненты";
Load += FormComponents_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewComponents).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button buttonUpd;
private Button buttonDel;
private Button buttonAdd;
private DataGridView dataGridViewComponents;
}
}

View File

@ -0,0 +1,110 @@

using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormComponents : Form
{
private readonly IUnityContainer _container;
private readonly IComponentRepository _componentRepository;
public FormComponents(IUnityContainer container, IComponentRepository componentRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_componentRepository = componentRepository ??
throw new ArgumentNullException(nameof(componentRepository));
}
private void FormComponents_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<FormComponent>().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
{
_componentRepository.DeleteComponent(findId);
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<FormComponent>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewComponents.DataSource = _componentRepository.ReadComponents();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewComponents.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewComponents.SelectedRows[0].Cells["Id"].Value);
return true;
}
}

View File

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

View File

@ -0,0 +1,218 @@
namespace ProjectConfectFactory.Forms
{
partial class FormOrder
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
label3 = new Label();
label2 = new Label();
label1 = new Label();
textBoxOrderPhone = new TextBox();
textBoxOrderName = new TextBox();
dateTimePickerOrder = new DateTimePicker();
label4 = new Label();
groupBoxListProducts = new GroupBox();
dataGridViewProducts = new DataGridView();
ColumnProduct = new DataGridViewComboBoxColumn();
ColumnCount = new DataGridViewTextBoxColumn();
ColumnPrice = new DataGridViewTextBoxColumn();
buttonBack = new Button();
ButtonSave = new Button();
groupBoxListProducts.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewProducts).BeginInit();
SuspendLayout();
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(92, 112);
label3.Name = "label3";
label3.Size = new Size(72, 20);
label3.TabIndex = 10;
label3.Text = "Телефон:";
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(92, 62);
label2.Name = "label2";
label2.Size = new Size(115, 20);
label2.TabIndex = 9;
label2.Text = "Имя заказчика:";
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Font = new Font("Segoe UI", 10F);
label1.Location = new Point(245, 11);
label1.Name = "label1";
label1.Size = new Size(57, 23);
label1.TabIndex = 8;
label1.Text = "Заказ:";
//
// textBoxOrderPhone
//
textBoxOrderPhone.Location = new Point(284, 105);
textBoxOrderPhone.Name = "textBoxOrderPhone";
textBoxOrderPhone.Size = new Size(250, 27);
textBoxOrderPhone.TabIndex = 7;
//
// textBoxOrderName
//
textBoxOrderName.Location = new Point(284, 55);
textBoxOrderName.Name = "textBoxOrderName";
textBoxOrderName.Size = new Size(250, 27);
textBoxOrderName.TabIndex = 6;
//
// dateTimePickerOrder
//
dateTimePickerOrder.Enabled = false;
dateTimePickerOrder.Location = new Point(284, 156);
dateTimePickerOrder.Name = "dateTimePickerOrder";
dateTimePickerOrder.Size = new Size(250, 27);
dateTimePickerOrder.TabIndex = 11;
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(92, 163);
label4.Name = "label4";
label4.Size = new Size(44, 20);
label4.TabIndex = 12;
label4.Text = "Дата:";
//
// groupBoxListProducts
//
groupBoxListProducts.Controls.Add(dataGridViewProducts);
groupBoxListProducts.Location = new Point(27, 209);
groupBoxListProducts.Name = "groupBoxListProducts";
groupBoxListProducts.Size = new Size(570, 292);
groupBoxListProducts.TabIndex = 26;
groupBoxListProducts.TabStop = false;
groupBoxListProducts.Text = "Список продуктов:";
//
// dataGridViewProducts
//
dataGridViewProducts.BackgroundColor = Color.Bisque;
dataGridViewProducts.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewProducts.Columns.AddRange(new DataGridViewColumn[] { ColumnProduct, ColumnCount, ColumnPrice });
dataGridViewProducts.Dock = DockStyle.Fill;
dataGridViewProducts.Location = new Point(3, 23);
dataGridViewProducts.Name = "dataGridViewProducts";
dataGridViewProducts.RowHeadersVisible = false;
dataGridViewProducts.RowHeadersWidth = 51;
dataGridViewProducts.Size = new Size(564, 266);
dataGridViewProducts.TabIndex = 27;
//
// ColumnProduct
//
ColumnProduct.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
ColumnProduct.HeaderText = "Продукт";
ColumnProduct.MinimumWidth = 6;
ColumnProduct.Name = "ColumnProduct";
//
// ColumnCount
//
ColumnCount.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
ColumnCount.HeaderText = "Кол-во";
ColumnCount.MinimumWidth = 6;
ColumnCount.Name = "ColumnCount";
//
// ColumnPrice
//
ColumnPrice.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
ColumnPrice.HeaderText = "Общая цена";
ColumnPrice.MinimumWidth = 6;
ColumnPrice.Name = "ColumnPrice";
//
// buttonBack
//
buttonBack.Location = new Point(406, 521);
buttonBack.Name = "buttonBack";
buttonBack.Size = new Size(100, 30);
buttonBack.TabIndex = 25;
buttonBack.Text = "Отмена";
buttonBack.UseVisualStyleBackColor = true;
buttonBack.Click += buttonBack_Click;
//
// ButtonSave
//
ButtonSave.Location = new Point(92, 521);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(100, 30);
ButtonSave.TabIndex = 24;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// FormOrder
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.Linen;
ClientSize = new Size(631, 563);
Controls.Add(groupBoxListProducts);
Controls.Add(buttonBack);
Controls.Add(ButtonSave);
Controls.Add(label4);
Controls.Add(dateTimePickerOrder);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(textBoxOrderPhone);
Controls.Add(textBoxOrderName);
Name = "FormOrder";
StartPosition = FormStartPosition.CenterParent;
Text = "Заказ";
groupBoxListProducts.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewProducts).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label3;
private Label label2;
private Label label1;
private TextBox textBoxOrderPhone;
private TextBox textBoxOrderName;
private DateTimePicker dateTimePickerOrder;
private Label label4;
private GroupBox groupBoxListProducts;
private DataGridView dataGridViewProducts;
private Button buttonBack;
private Button ButtonSave;
private DataGridViewComboBoxColumn ColumnProduct;
private DataGridViewTextBoxColumn ColumnCount;
private DataGridViewTextBoxColumn ColumnPrice;
}
}

View File

@ -0,0 +1,61 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Repositories;
namespace ProjectConfectFactory.Forms;
public partial class FormOrder : Form
{
private readonly IOrderRepository _orderRepository;
public FormOrder(IOrderRepository orderRepository, IProductRepository productRepository)
{
InitializeComponent();
_orderRepository = orderRepository ??
throw new ArgumentNullException(nameof(orderRepository));
ColumnProduct.DataSource = productRepository.ReadProducts();
ColumnProduct.DisplayMember = "Name";
ColumnProduct.ValueMember = "Id";
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (dataGridViewProducts.RowCount < 2 || string.IsNullOrWhiteSpace(textBoxOrderName.Text) || string.IsNullOrWhiteSpace(textBoxOrderPhone.Text))
{
throw new Exception("Имеются незаполненные поля");
}
_orderRepository.CreateOrder(Order.CreateOpeartion(0, textBoxOrderName.Text, textBoxOrderPhone.Text, CreateListOrderProductsFromDataGrid()));
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonBack_Click(object sender, EventArgs e) => Close();
private List<OrderProducts> CreateListOrderProductsFromDataGrid()
{
var list = new List<OrderProducts>();
foreach (DataGridViewRow row in dataGridViewProducts.Rows)
{
if (row.Cells["ColumnProduct"].Value == null ||
row.Cells["ColumnCount"].Value == null ||
row.Cells["ColumnPrice"].Value == null)
{
continue;
}
list.Add(OrderProducts.CreateElement(0, Convert.ToInt32(row.Cells["ColumnProduct"].Value), Convert.ToInt32(row.Cells["ColumnCount"].Value), Convert.ToDecimal(row.Cells["ColumnPrice"].Value)));
}
return list;
}
}

View File

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

View File

@ -0,0 +1,117 @@
namespace ProjectConfectFactory.Forms
{
partial class FormOrders
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormOrders));
panel1 = new Panel();
buttonDel = new Button();
buttonAdd = new Button();
dataGridViewOrders = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewOrders).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonDel);
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(657, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 450);
panel1.TabIndex = 1;
//
// buttonDel
//
buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage");
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(27, 134);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(95, 90);
buttonDel.TabIndex = 3;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridViewOrders
//
dataGridViewOrders.AllowUserToAddRows = false;
dataGridViewOrders.AllowUserToDeleteRows = false;
dataGridViewOrders.AllowUserToResizeColumns = false;
dataGridViewOrders.AllowUserToResizeRows = false;
dataGridViewOrders.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewOrders.BackgroundColor = Color.Bisque;
dataGridViewOrders.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewOrders.Dock = DockStyle.Fill;
dataGridViewOrders.GridColor = Color.Bisque;
dataGridViewOrders.Location = new Point(0, 0);
dataGridViewOrders.MultiSelect = false;
dataGridViewOrders.Name = "dataGridViewOrders";
dataGridViewOrders.ReadOnly = true;
dataGridViewOrders.RowHeadersVisible = false;
dataGridViewOrders.RowHeadersWidth = 51;
dataGridViewOrders.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewOrders.Size = new Size(657, 450);
dataGridViewOrders.TabIndex = 2;
//
// FormOrders
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridViewOrders);
Controls.Add(panel1);
Name = "FormOrders";
StartPosition = FormStartPosition.CenterParent;
Text = "Заказы";
Load += FormOrders_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewOrders).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button buttonDel;
private Button buttonAdd;
private DataGridView dataGridViewOrders;
}
}

View File

@ -0,0 +1,89 @@
using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.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<FormOrder>().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() => dataGridViewOrders.DataSource = _orderRepository.ReadOrder();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewOrders.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewOrders.SelectedRows[0].Cells["Id"].Value);
return true;
}
}

View File

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

View File

@ -0,0 +1,213 @@
namespace ProjectConfectFactory.Forms
{
partial class FormProduct
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
label2 = new Label();
textBoxProductName = new TextBox();
label1 = new Label();
numericUpDownProductPrice = new NumericUpDown();
label4 = new Label();
buttonBack = new Button();
ButtonSave = new Button();
groupBoxRecipe = new GroupBox();
dataGridViewRecipe = new DataGridView();
ColumnComponent = new DataGridViewComboBoxColumn();
ColumnCount = new DataGridViewTextBoxColumn();
label3 = new Label();
checkedListBoxProductType = new CheckedListBox();
((System.ComponentModel.ISupportInitialize)numericUpDownProductPrice).BeginInit();
groupBoxRecipe.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewRecipe).BeginInit();
SuspendLayout();
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(43, 73);
label2.Name = "label2";
label2.Size = new Size(119, 20);
label2.TabIndex = 15;
label2.Text = "Наименование:";
//
// textBoxProductName
//
textBoxProductName.Location = new Point(195, 66);
textBoxProductName.Name = "textBoxProductName";
textBoxProductName.Size = new Size(182, 27);
textBoxProductName.TabIndex = 14;
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Font = new Font("Segoe UI", 10F);
label1.Location = new Point(299, 20);
label1.Name = "label1";
label1.Size = new Size(78, 23);
label1.TabIndex = 16;
label1.Text = "Продукт:";
//
// numericUpDownProductPrice
//
numericUpDownProductPrice.Location = new Point(484, 66);
numericUpDownProductPrice.Maximum = new decimal(new int[] { 10000, 0, 0, 0 });
numericUpDownProductPrice.Name = "numericUpDownProductPrice";
numericUpDownProductPrice.Size = new Size(152, 27);
numericUpDownProductPrice.TabIndex = 20;
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(407, 73);
label4.Name = "label4";
label4.Size = new Size(48, 20);
label4.TabIndex = 19;
label4.Text = "Цена:";
//
// buttonBack
//
buttonBack.Location = new Point(435, 498);
buttonBack.Name = "buttonBack";
buttonBack.Size = new Size(100, 30);
buttonBack.TabIndex = 22;
buttonBack.Text = "Отмена";
buttonBack.UseVisualStyleBackColor = true;
buttonBack.Click += buttonBack_Click;
//
// ButtonSave
//
ButtonSave.Location = new Point(129, 498);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(100, 30);
ButtonSave.TabIndex = 21;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// groupBoxRecipe
//
groupBoxRecipe.Controls.Add(dataGridViewRecipe);
groupBoxRecipe.Location = new Point(43, 242);
groupBoxRecipe.Name = "groupBoxRecipe";
groupBoxRecipe.Size = new Size(596, 230);
groupBoxRecipe.TabIndex = 23;
groupBoxRecipe.TabStop = false;
groupBoxRecipe.Text = "Рецепт:";
//
// dataGridViewRecipe
//
dataGridViewRecipe.BackgroundColor = Color.Bisque;
dataGridViewRecipe.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewRecipe.Columns.AddRange(new DataGridViewColumn[] { ColumnComponent, ColumnCount });
dataGridViewRecipe.Dock = DockStyle.Fill;
dataGridViewRecipe.Location = new Point(3, 23);
dataGridViewRecipe.Name = "dataGridViewRecipe";
dataGridViewRecipe.RowHeadersVisible = false;
dataGridViewRecipe.RowHeadersWidth = 51;
dataGridViewRecipe.Size = new Size(590, 204);
dataGridViewRecipe.TabIndex = 27;
//
// ColumnComponent
//
ColumnComponent.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
ColumnComponent.HeaderText = "Компонент";
ColumnComponent.MinimumWidth = 6;
ColumnComponent.Name = "ColumnComponent";
//
// ColumnCount
//
ColumnCount.HeaderText = "Кол-во";
ColumnCount.MinimumWidth = 6;
ColumnCount.Name = "ColumnCount";
ColumnCount.Width = 250;
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(43, 111);
label3.Name = "label3";
label3.Size = new Size(105, 20);
label3.TabIndex = 25;
label3.Text = "Тип продукта:";
//
// checkedListBoxProductType
//
checkedListBoxProductType.FormattingEnabled = true;
checkedListBoxProductType.Location = new Point(43, 151);
checkedListBoxProductType.MultiColumn = true;
checkedListBoxProductType.Name = "checkedListBoxProductType";
checkedListBoxProductType.Size = new Size(596, 70);
checkedListBoxProductType.TabIndex = 28;
//
// FormProduct
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(691, 553);
Controls.Add(checkedListBoxProductType);
Controls.Add(label3);
Controls.Add(groupBoxRecipe);
Controls.Add(buttonBack);
Controls.Add(ButtonSave);
Controls.Add(numericUpDownProductPrice);
Controls.Add(label4);
Controls.Add(label1);
Controls.Add(label2);
Controls.Add(textBoxProductName);
Name = "FormProduct";
StartPosition = FormStartPosition.CenterParent;
Text = "Продукт";
((System.ComponentModel.ISupportInitialize)numericUpDownProductPrice).EndInit();
groupBoxRecipe.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewRecipe).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label2;
private TextBox textBoxProductName;
private Label label1;
private NumericUpDown numericUpDownProductPrice;
private Label label4;
private Button buttonBack;
private Button ButtonSave;
private GroupBox groupBoxRecipe;
private Label label3;
private DataGridView dataGridViewRecipe;
private CheckedListBox checkedListBoxProductType;
private DataGridViewComboBoxColumn ColumnComponent;
private DataGridViewTextBoxColumn ColumnCount;
}
}

View File

@ -0,0 +1,123 @@
using ProjectConfectFactory.Entities.Enums;
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Repositories;
namespace ProjectConfectFactory.Forms;
public partial class FormProduct : Form
{
private readonly IProductRepository _productRepository;
private int? _productId;
public FormProduct(IProductRepository productRepository, IComponentRepository componentRepository)
{
InitializeComponent();
_productRepository = productRepository ??
throw new ArgumentNullException(nameof(productRepository));
foreach (var elem in Enum.GetValues(typeof(ProductType)))
{
checkedListBoxProductType.Items.Add(elem);
}
ColumnComponent.DataSource = componentRepository.ReadComponents();
ColumnComponent.DisplayMember = "Name";
ColumnComponent.ValueMember = "Id";
}
public int Id
{
set
{
try
{
var product = _productRepository.ReadProductById(value);
if (product == null)
{
throw new InvalidDataException(nameof(product));
}
foreach (ProductType elem in Enum.GetValues(typeof(ProductType)))
{
if ((elem & product.ProductType) != 0)
{
checkedListBoxProductType.SetItemChecked(checkedListBoxProductType.Items.IndexOf(elem), true);
}
}
textBoxProductName.Text = product.Name;
numericUpDownProductPrice.Value = (decimal)product.Price;
_productId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (dataGridViewRecipe.RowCount < 1 || string.IsNullOrWhiteSpace(textBoxProductName.Text) ||
checkedListBoxProductType.CheckedItems.Count == 0)
{
throw new Exception("Имеются незаполненные поля");
}
if (_productId.HasValue)
{
_productRepository.UpdateProduct(CreateProduct(_productId.Value));
}
else
{
_productRepository.CreateProduct(CreateProduct(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonBack_Click(object sender, EventArgs e) => Close();
private List<Recipe> CreateListRecipeFromDataGrid()
{
var list = new List<Recipe>();
foreach (DataGridViewRow row in dataGridViewRecipe.Rows)
{
if (row.Cells["ColumnComponent"].Value == null ||
row.Cells["ColumnCount"].Value == null)
{
continue;
}
list.Add(Recipe.CreateElement(0, Convert.ToInt32(row.Cells["ColumnComponent"].Value), Convert.ToInt32(row.Cells["ColumnCount"].Value)));
}
return list;
}
private Product CreateProduct(int id)
{
ProductType productType = ProductType.None;
foreach (var elem in checkedListBoxProductType.CheckedItems)
{
productType |= (ProductType)elem;
}
return Product.CreateEntity(id, textBoxProductName.Text, productType, CreateListRecipeFromDataGrid(), Convert.ToInt32(numericUpDownProductPrice.Value));
}
}

View File

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

View File

@ -0,0 +1,131 @@
namespace ProjectConfectFactory.Forms
{
partial class FormProducts
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormProducts));
panel1 = new Panel();
buttonUpd = new Button();
buttonDel = new Button();
buttonAdd = new Button();
dataGridViewProducts = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewProducts).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonUpd);
panel1.Controls.Add(buttonDel);
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(780, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 450);
panel1.TabIndex = 2;
//
// buttonUpd
//
buttonUpd.BackgroundImage = (Image)resources.GetObject("buttonUpd.BackgroundImage");
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(27, 339);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(95, 90);
buttonUpd.TabIndex = 4;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += buttonUpd_Click;
//
// buttonDel
//
buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage");
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(27, 134);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(95, 90);
buttonDel.TabIndex = 3;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += buttonDel_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridViewProducts
//
dataGridViewProducts.AllowUserToAddRows = false;
dataGridViewProducts.AllowUserToDeleteRows = false;
dataGridViewProducts.AllowUserToResizeColumns = false;
dataGridViewProducts.AllowUserToResizeRows = false;
dataGridViewProducts.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewProducts.BackgroundColor = Color.Bisque;
dataGridViewProducts.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewProducts.Dock = DockStyle.Fill;
dataGridViewProducts.GridColor = Color.Bisque;
dataGridViewProducts.Location = new Point(0, 0);
dataGridViewProducts.MultiSelect = false;
dataGridViewProducts.Name = "dataGridViewProducts";
dataGridViewProducts.ReadOnly = true;
dataGridViewProducts.RowHeadersVisible = false;
dataGridViewProducts.RowHeadersWidth = 51;
dataGridViewProducts.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewProducts.Size = new Size(780, 450);
dataGridViewProducts.TabIndex = 3;
//
// FormProducts
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(923, 450);
Controls.Add(dataGridViewProducts);
Controls.Add(panel1);
Name = "FormProducts";
StartPosition = FormStartPosition.CenterParent;
Text = "Продукты";
Load += FormProducts_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewProducts).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button buttonUpd;
private Button buttonDel;
private Button buttonAdd;
private DataGridView dataGridViewProducts;
}
}

View File

@ -0,0 +1,110 @@
using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormProducts : Form
{
private readonly IUnityContainer _container;
private readonly IProductRepository _productRepository;
public FormProducts(IUnityContainer container, IProductRepository productRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_productRepository = productRepository ??
throw new ArgumentNullException(nameof(productRepository));
}
private void FormProducts_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<FormProduct>().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
{
_productRepository.DeleteProduct(findId);
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<FormProduct>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewProducts.DataSource = _productRepository.ReadProducts();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewProducts.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewProducts.SelectedRows[0].Cells["Id"].Value);
return true;
}
}

View File

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

View File

@ -0,0 +1,161 @@
namespace ProjectConfectFactory.Forms
{
partial class FormPurchase
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
label4 = new Label();
dateTimePickerPruchase = new DateTimePicker();
label1 = new Label();
label2 = new Label();
comboBoxComponent = new ComboBox();
comboBoxSellerName = new ComboBox();
label3 = new Label();
buttonBack = new Button();
ButtonSave = new Button();
SuspendLayout();
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(37, 143);
label4.Name = "label4";
label4.Size = new Size(44, 20);
label4.TabIndex = 14;
label4.Text = "Дата:";
//
// dateTimePickerPruchase
//
dateTimePickerPruchase.Enabled = false;
dateTimePickerPruchase.Location = new Point(171, 136);
dateTimePickerPruchase.Name = "dateTimePickerPruchase";
dateTimePickerPruchase.Size = new Size(250, 27);
dateTimePickerPruchase.TabIndex = 13;
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Location = new Point(37, 88);
label1.Name = "label1";
label1.Size = new Size(89, 20);
label1.TabIndex = 15;
label1.Text = "Поставщик:";
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Font = new Font("Segoe UI", 10F);
label2.Location = new Point(151, 27);
label2.Name = "label2";
label2.Size = new Size(86, 23);
label2.TabIndex = 16;
label2.Text = "Поставка:";
//
// comboBoxComponent
//
comboBoxComponent.FormattingEnabled = true;
comboBoxComponent.Location = new Point(171, 187);
comboBoxComponent.Name = "comboBoxComponent";
comboBoxComponent.Size = new Size(250, 28);
comboBoxComponent.TabIndex = 17;
//
// comboBoxSellerName
//
comboBoxSellerName.FormattingEnabled = true;
comboBoxSellerName.Location = new Point(171, 80);
comboBoxSellerName.Name = "comboBoxSellerName";
comboBoxSellerName.Size = new Size(250, 28);
comboBoxSellerName.TabIndex = 18;
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(37, 195);
label3.Name = "label3";
label3.Size = new Size(91, 20);
label3.TabIndex = 19;
label3.Text = "Компонент:";
//
// buttonBack
//
buttonBack.Location = new Point(272, 252);
buttonBack.Name = "buttonBack";
buttonBack.Size = new Size(100, 30);
buttonBack.TabIndex = 27;
buttonBack.Text = "Отмена";
buttonBack.UseVisualStyleBackColor = true;
buttonBack.Click += buttonBack_Click;
//
// ButtonSave
//
ButtonSave.Location = new Point(68, 252);
ButtonSave.Name = "ButtonSave";
ButtonSave.Size = new Size(100, 30);
ButtonSave.TabIndex = 26;
ButtonSave.Text = "Сохранить";
ButtonSave.UseVisualStyleBackColor = true;
ButtonSave.Click += ButtonSave_Click;
//
// FormPurchase
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(449, 308);
Controls.Add(buttonBack);
Controls.Add(ButtonSave);
Controls.Add(label3);
Controls.Add(comboBoxSellerName);
Controls.Add(comboBoxComponent);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(label4);
Controls.Add(dateTimePickerPruchase);
Name = "FormPurchase";
StartPosition = FormStartPosition.CenterParent;
Text = "Поставка";
ResumeLayout(false);
PerformLayout();
}
#endregion
private Label label4;
private DateTimePicker dateTimePickerPruchase;
private Label label1;
private Label label2;
private ComboBox comboBoxComponent;
private ComboBox comboBoxSellerName;
private Label label3;
private Button buttonBack;
private Button ButtonSave;
}
}

View File

@ -0,0 +1,48 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Repositories;
namespace ProjectConfectFactory.Forms;
public partial class FormPurchase : Form
{
private readonly IPurchaseRepository _purchaseRepository;
public FormPurchase(IPurchaseRepository purchaseRepository,
ISellerRepository sellerRepository, IComponentRepository componentRepository)
{
InitializeComponent();
_purchaseRepository = purchaseRepository ?? throw new ArgumentNullException(nameof(purchaseRepository));
comboBoxSellerName.DataSource = sellerRepository.ReadSellers();
comboBoxSellerName.DisplayMember = "Name";
comboBoxSellerName.ValueMember = "Id";
comboBoxComponent.ValueMember = "ComponentId";
comboBoxComponent.DataSource = componentRepository.ReadComponents();
comboBoxComponent.DisplayMember = "Name";
comboBoxComponent.ValueMember = "Id";
}
private void ButtonSave_Click(object sender, EventArgs e)
{
try
{
if (comboBoxSellerName.SelectedIndex < 0 || comboBoxComponent.SelectedIndex < 0)
{
throw new Exception("Имеются незаполненные поля");
}
_purchaseRepository.CreatePurchase(Purchase.CreateOpeartion(0, (int)comboBoxSellerName.SelectedValue!, (int)comboBoxComponent.SelectedValue!));
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonBack_Click(object sender, EventArgs e) => Close();
}

View File

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

View File

@ -0,0 +1,102 @@
namespace ProjectConfectFactory.Forms
{
partial class FormPurchases
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
panel1 = new Panel();
buttonAdd = new Button();
dataGridViewPurchases = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewPurchases).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(657, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 450);
panel1.TabIndex = 2;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += buttonAdd_Click;
//
// dataGridViewPurchases
//
dataGridViewPurchases.AllowUserToAddRows = false;
dataGridViewPurchases.AllowUserToDeleteRows = false;
dataGridViewPurchases.AllowUserToResizeColumns = false;
dataGridViewPurchases.AllowUserToResizeRows = false;
dataGridViewPurchases.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewPurchases.BackgroundColor = Color.Bisque;
dataGridViewPurchases.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewPurchases.Dock = DockStyle.Fill;
dataGridViewPurchases.GridColor = Color.Bisque;
dataGridViewPurchases.Location = new Point(0, 0);
dataGridViewPurchases.MultiSelect = false;
dataGridViewPurchases.Name = "dataGridViewPurchases";
dataGridViewPurchases.ReadOnly = true;
dataGridViewPurchases.RowHeadersVisible = false;
dataGridViewPurchases.RowHeadersWidth = 51;
dataGridViewPurchases.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewPurchases.Size = new Size(657, 450);
dataGridViewPurchases.TabIndex = 3;
//
// FormPurchases
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(dataGridViewPurchases);
Controls.Add(panel1);
Name = "FormPurchases";
StartPosition = FormStartPosition.CenterParent;
Text = "Поставки";
Load += FormPurchases_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewPurchases).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private Button buttonAdd;
private DataGridView dataGridViewPurchases;
}
}

View File

@ -0,0 +1,49 @@
using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormPurchases : Form
{
private readonly IUnityContainer _container;
private readonly IPurchaseRepository _purchaseRepository;
public FormPurchases(IUnityContainer container, IPurchaseRepository purchaseRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_purchaseRepository = purchaseRepository ??
throw new ArgumentNullException(nameof(purchaseRepository));
}
private void FormPurchases_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<FormPurchase>().ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при добавлении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewPurchases.DataSource = _purchaseRepository.ReadPurchases();
}

View File

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

View File

@ -0,0 +1,160 @@
namespace ProjectConfectFactory.Forms
{
partial class FormSeller
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
textBoxSellerName = new TextBox();
textBoxSellerPhone = new TextBox();
comboBoxSellerDelivTime = new ComboBox();
label1 = new Label();
label2 = new Label();
label3 = new Label();
label4 = new Label();
ButtonSellerSave = new Button();
ButtonSellerBack = new Button();
SuspendLayout();
//
// textBoxSellerName
//
textBoxSellerName.Location = new Point(230, 66);
textBoxSellerName.Name = "textBoxSellerName";
textBoxSellerName.Size = new Size(218, 27);
textBoxSellerName.TabIndex = 0;
//
// textBoxSellerPhone
//
textBoxSellerPhone.Location = new Point(230, 130);
textBoxSellerPhone.Name = "textBoxSellerPhone";
textBoxSellerPhone.Size = new Size(218, 27);
textBoxSellerPhone.TabIndex = 1;
//
// comboBoxSellerDelivTime
//
comboBoxSellerDelivTime.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxSellerDelivTime.FormattingEnabled = true;
comboBoxSellerDelivTime.Location = new Point(230, 189);
comboBoxSellerDelivTime.Name = "comboBoxSellerDelivTime";
comboBoxSellerDelivTime.Size = new Size(218, 28);
comboBoxSellerDelivTime.TabIndex = 2;
//
// label1
//
label1.AutoSize = true;
label1.BackColor = Color.Bisque;
label1.Font = new Font("Segoe UI", 10F);
label1.Location = new Point(172, 19);
label1.Name = "label1";
label1.Size = new Size(101, 23);
label1.TabIndex = 3;
label1.Text = "Поставщик:";
//
// label2
//
label2.AutoSize = true;
label2.BackColor = Color.Bisque;
label2.Location = new Point(46, 73);
label2.Name = "label2";
label2.Size = new Size(119, 20);
label2.TabIndex = 4;
label2.Text = "Наименование:";
//
// label3
//
label3.AutoSize = true;
label3.BackColor = Color.Bisque;
label3.Location = new Point(46, 137);
label3.Name = "label3";
label3.Size = new Size(72, 20);
label3.TabIndex = 5;
label3.Text = "Телефон:";
//
// label4
//
label4.AutoSize = true;
label4.BackColor = Color.Bisque;
label4.Location = new Point(46, 197);
label4.Name = "label4";
label4.Size = new Size(104, 20);
label4.TabIndex = 6;
label4.Text = "Тип доставки:";
//
// ButtonSellerSave
//
ButtonSellerSave.Location = new Point(71, 251);
ButtonSellerSave.Name = "ButtonSellerSave";
ButtonSellerSave.Size = new Size(94, 29);
ButtonSellerSave.TabIndex = 7;
ButtonSellerSave.Text = "Сохранить";
ButtonSellerSave.UseVisualStyleBackColor = true;
ButtonSellerSave.Click += ButtonSellerSave_Click;
//
// ButtonSellerBack
//
ButtonSellerBack.Location = new Point(315, 251);
ButtonSellerBack.Name = "ButtonSellerBack";
ButtonSellerBack.Size = new Size(94, 29);
ButtonSellerBack.TabIndex = 8;
ButtonSellerBack.Text = "Отмена";
ButtonSellerBack.UseVisualStyleBackColor = true;
ButtonSellerBack.Click += ButtonSellerBack_Click;
//
// FormSeller
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
BackColor = Color.AntiqueWhite;
ClientSize = new Size(482, 303);
Controls.Add(ButtonSellerBack);
Controls.Add(ButtonSellerSave);
Controls.Add(label4);
Controls.Add(label3);
Controls.Add(label2);
Controls.Add(label1);
Controls.Add(comboBoxSellerDelivTime);
Controls.Add(textBoxSellerPhone);
Controls.Add(textBoxSellerName);
Name = "FormSeller";
StartPosition = FormStartPosition.CenterParent;
Text = "Поставщик";
ResumeLayout(false);
PerformLayout();
}
#endregion
private TextBox textBoxSellerName;
private TextBox textBoxSellerPhone;
private ComboBox comboBoxSellerDelivTime;
private Label label1;
private Label label2;
private Label label3;
private Label label4;
private Button ButtonSellerSave;
private Button ButtonSellerBack;
}
}

View File

@ -0,0 +1,77 @@
using ProjectConfectFactory.Repositories;
using ProjectConfectFactory.Entities.Enums;
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Forms;
public partial class FormSeller : Form
{
private readonly ISellerRepository _sellerRepository;
private int? _sellerId;
public int Id
{
set
{
try
{
var seller = _sellerRepository.ReadSellerById(value);
if (seller == null)
{
throw new InvalidDataException(nameof(seller));
}
textBoxSellerName.Text = seller.Name;
textBoxSellerPhone.Text = seller.Phone;
comboBoxSellerDelivTime.SelectedItem = seller.DeliveryTime;
_sellerId = value;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
}
public FormSeller(ISellerRepository sellerRepository)
{
InitializeComponent();
_sellerRepository = sellerRepository ??
throw new ArgumentNullException(nameof(sellerRepository));
comboBoxSellerDelivTime.DataSource = Enum.GetValues(typeof(DeliveryType));
}
private void ButtonSellerSave_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(textBoxSellerName.Text) || string.IsNullOrWhiteSpace(textBoxSellerPhone.Text) || comboBoxSellerDelivTime.SelectedIndex < 1)
{
throw new Exception("Имеются незаполненные поля");
}
if (_sellerId.HasValue)
{
_sellerRepository.UpdateSeller(CreateSeller(_sellerId.Value));
}
else
{
_sellerRepository.CreateSeller(CreateSeller(0));
}
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonSellerBack_Click(object sender, EventArgs e) => Close();
private Seller CreateSeller(int id) => Seller.CreateEntity(id, textBoxSellerName.Text, textBoxSellerPhone.Text,
(DeliveryType)comboBoxSellerDelivTime.SelectedItem!);
}

View File

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

View File

@ -0,0 +1,131 @@
namespace ProjectConfectFactory.Forms
{
partial class FormSellers
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSellers));
panel1 = new Panel();
buttonUpd = new Button();
buttonDel = new Button();
buttonAdd = new Button();
dataGridViewSellers = new DataGridView();
panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridViewSellers).BeginInit();
SuspendLayout();
//
// panel1
//
panel1.BackColor = Color.Linen;
panel1.Controls.Add(buttonUpd);
panel1.Controls.Add(buttonDel);
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(789, 0);
panel1.Name = "panel1";
panel1.Size = new Size(143, 453);
panel1.TabIndex = 0;
//
// buttonUpd
//
buttonUpd.BackgroundImage = (Image)resources.GetObject("buttonUpd.BackgroundImage");
buttonUpd.BackgroundImageLayout = ImageLayout.Stretch;
buttonUpd.Location = new Point(27, 339);
buttonUpd.Name = "buttonUpd";
buttonUpd.Size = new Size(95, 90);
buttonUpd.TabIndex = 4;
buttonUpd.UseVisualStyleBackColor = true;
buttonUpd.Click += ButtonUpd_Click;
//
// buttonDel
//
buttonDel.BackgroundImage = (Image)resources.GetObject("buttonDel.BackgroundImage");
buttonDel.BackgroundImageLayout = ImageLayout.Stretch;
buttonDel.Location = new Point(27, 134);
buttonDel.Name = "buttonDel";
buttonDel.Size = new Size(95, 90);
buttonDel.TabIndex = 3;
buttonDel.UseVisualStyleBackColor = true;
buttonDel.Click += ButtonDel_Click;
//
// buttonAdd
//
buttonAdd.BackgroundImage = Properties.Resources.add;
buttonAdd.BackgroundImageLayout = ImageLayout.Stretch;
buttonAdd.Location = new Point(27, 24);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(95, 90);
buttonAdd.TabIndex = 0;
buttonAdd.UseVisualStyleBackColor = true;
buttonAdd.Click += ButtonAdd_Click;
//
// dataGridViewSellers
//
dataGridViewSellers.AllowUserToAddRows = false;
dataGridViewSellers.AllowUserToDeleteRows = false;
dataGridViewSellers.AllowUserToResizeColumns = false;
dataGridViewSellers.AllowUserToResizeRows = false;
dataGridViewSellers.Anchor = AnchorStyles.Left | AnchorStyles.Right;
dataGridViewSellers.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dataGridViewSellers.BackgroundColor = Color.Bisque;
dataGridViewSellers.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridViewSellers.GridColor = Color.Bisque;
dataGridViewSellers.Location = new Point(0, 0);
dataGridViewSellers.MultiSelect = false;
dataGridViewSellers.Name = "dataGridViewSellers";
dataGridViewSellers.ReadOnly = true;
dataGridViewSellers.RowHeadersVisible = false;
dataGridViewSellers.RowHeadersWidth = 51;
dataGridViewSellers.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridViewSellers.Size = new Size(789, 453);
dataGridViewSellers.TabIndex = 1;
//
// FormSellers
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(932, 453);
Controls.Add(dataGridViewSellers);
Controls.Add(panel1);
Name = "FormSellers";
StartPosition = FormStartPosition.CenterParent;
Text = "Поставщики";
Load += FormSellers_Load;
panel1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridViewSellers).EndInit();
ResumeLayout(false);
}
#endregion
private Panel panel1;
private DataGridView dataGridViewSellers;
private Button buttonUpd;
private Button buttonDel;
private Button buttonAdd;
}
}

View File

@ -0,0 +1,109 @@
using ProjectConfectFactory.Repositories;
using Unity;
namespace ProjectConfectFactory.Forms;
public partial class FormSellers : Form
{
private readonly IUnityContainer _container;
private readonly ISellerRepository _sellerRepository;
public FormSellers(IUnityContainer container, ISellerRepository sellerRepository)
{
InitializeComponent();
_container = container ??
throw new ArgumentNullException(nameof(container));
_sellerRepository = sellerRepository ??
throw new ArgumentNullException(nameof(sellerRepository));
}
private void FormSellers_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<FormSeller>().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
{
_sellerRepository.DeleteSeller(findId);
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<FormSeller>();
form.Id = findId;
form.ShowDialog();
LoadList();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка при изменении",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridViewSellers.DataSource = _sellerRepository.ReadSellers();
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;
if (dataGridViewSellers.SelectedRows.Count < 1)
{
MessageBox.Show("Нет выбранной записи", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
id = Convert.ToInt32(dataGridViewSellers.SelectedRows[0].Cells["Id"].Value);
return true;
}
}

View File

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

View File

@ -1,3 +1,8 @@
using ProjectConfectFactory.Repositories.Implementations;
using ProjectConfectFactory.Repositories;
using Unity;
using Unity.Lifetime;
namespace ProjectConfectFactory
{
internal static class Program
@ -11,7 +16,20 @@ namespace ProjectConfectFactory
// 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<FormConFactory>());
}
private static IUnityContainer CreateContainer()
{
var container = new UnityContainer();
container.RegisterType<IOrderRepository, OrderRepository>(new TransientLifetimeManager());
container.RegisterType<IProductRepository, MyProductRepository>(new TransientLifetimeManager());
container.RegisterType<IComponentRepository, ComponentRepository>(new TransientLifetimeManager());
container.RegisterType<IPurchaseRepository, PurchaseRepository>(new TransientLifetimeManager());
container.RegisterType<ISellerRepository, SellerRepository>(new TransientLifetimeManager());
return container;
}
}
}

View File

@ -8,4 +8,23 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Unity" Version="5.11.10" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

View File

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

View File

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

View File

@ -0,0 +1,16 @@
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories;
public interface IComponentRepository
{
IEnumerable<Component> ReadComponents();
Component ReadComponentById(int id);
void CreateComponent(Component component);
void UpdateComponent(Component component);
void DeleteComponent(int id);
}

View File

@ -0,0 +1,11 @@
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories;
public interface IOrderRepository
{
IEnumerable<Order> ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null, int? ProductId = null);
void CreateOrder(Order order);
void DeleteOrder(int id);
}

View File

@ -0,0 +1,23 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Entities.Enums;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectConfectFactory.Repositories;
public interface IProductRepository
{
void CreateProduct(Product product);
void UpdateProduct(Product product);
Product ReadProductById(int id);
IEnumerable<Product> ReadProducts();
void DeleteProduct(int id);
}

View File

@ -0,0 +1,16 @@
using ProjectConfectFactory.Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectConfectFactory.Repositories;
public interface IPurchaseRepository
{
IEnumerable<Purchase> ReadPurchases(DateTime? dateForm = null, DateTime? dateTo = null, int? SellerId = null, int? ComponentId = null);
void CreatePurchase(Purchase purchase);
}

View File

@ -0,0 +1,16 @@
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories;
public interface ISellerRepository
{
void CreateSeller(Seller seller);
void DeleteSeller(int id);
Seller ReadSellerById(int id);
IEnumerable<Seller> ReadSellers();
void UpdateSeller(Seller seller);
}

View File

@ -0,0 +1,28 @@
using ProjectConfectFactory.Entities;
namespace ProjectConfectFactory.Repositories.Implementations;
public class ComponentRepository : IComponentRepository
{
public void CreateComponent(Component component)
{
}
public void DeleteComponent(int id)
{
}
public Component ReadComponentById(int id)
{
return Component.CreateEntity(0, string.Empty, string.Empty, 0);
}
public IEnumerable<Component> ReadComponents()
{
return [];
}
public void UpdateComponent(Component component)
{
}
}

View File

@ -0,0 +1,29 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Entities.Enums;
namespace ProjectConfectFactory.Repositories.Implementations;
public class MyProductRepository : IProductRepository
{
public void CreateProduct(Product product)
{
}
public void DeleteProduct(int id)
{
}
public Product ReadProductById(int id)
{
return Product.CreateEntity(0, string.Empty, ProductType.None, [] ,0); ;
}
public IEnumerable<Product> ReadProducts()
{
return [];
}
public void UpdateProduct(Product product)
{
}
}

View File

@ -0,0 +1,24 @@
using ProjectConfectFactory.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectConfectFactory.Repositories.Implementations;
public class OrderRepository : IOrderRepository
{
public void CreateOrder(Order order)
{
}
public void DeleteOrder(int id)
{
}
public IEnumerable<Order> ReadOrder(DateTime? dateForm = null, DateTime? dateTo = null, int? ProductId = null)
{
return [];
}
}

View File

@ -0,0 +1,20 @@
using ProjectConfectFactory.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectConfectFactory.Repositories.Implementations;
public class PurchaseRepository : IPurchaseRepository
{
public void CreatePurchase(Purchase purchase)
{
}
public IEnumerable<Purchase> ReadPurchases(DateTime? dateForm = null, DateTime? dateTo = null, int? SellerId = null, int? ComponentId = null)
{
return [];
}
}

View File

@ -0,0 +1,35 @@
using ProjectConfectFactory.Entities;
using ProjectConfectFactory.Entities.Enums;
using Microsoft.VisualBasic.FileIO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectConfectFactory.Repositories.Implementations;
public class SellerRepository : ISellerRepository
{
public void CreateSeller(Seller seller)
{
}
public void DeleteSeller(int id)
{
}
public Seller ReadSellerById(int id)
{
return Seller.CreateEntity(0, string.Empty, string.Empty, DeliveryType.None); ;
}
public IEnumerable<Seller> ReadSellers()
{
return [];
}
public void UpdateSeller(Seller seller)
{
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB