From 70a1bc084044ad591a3a0173914a5acd3678a0b8 Mon Sep 17 00:00:00 2001 From: Pyro <732603@gmail.com> Date: Fri, 15 Nov 2024 06:54:37 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D1=8B=20?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D1=8B=20=D0=BF=D0=BE=D0=B4=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=B6=D0=B4=D1=83=D1=8E=20=D1=81=D1=83=D1=89=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Forms/FormClient.Designer.cs | 163 +++++++++++++++ .../Forms/FormClient.cs | 72 +++++++ .../Forms/FormClient.resx | 120 +++++++++++ .../Forms/FormClients.Designer.cs | 122 +++++++++++ .../Forms/FormClients.cs | 80 +++++++ .../Forms/FormClients.resx | 120 +++++++++++ .../Forms/FormComponent.Designer.cs | 114 +++++----- .../Forms/FormComponent.cs | 70 ++++++- .../Forms/FormComponents.Designer.cs | 126 +++++++++++ .../Forms/FormComponents.cs | 80 +++++++ .../Forms/FormComponents.resx | 120 +++++++++++ .../Forms/FormOrder.Designer.cs | 143 +++++++++++++ .../Forms/FormOrder.cs | 70 +++++++ .../Forms/FormOrder.resx | 120 +++++++++++ .../Forms/FormOrders.Designer.cs | 122 +++++++++++ .../Forms/FormOrders.cs | 80 +++++++ .../Forms/FormOrders.resx | 120 +++++++++++ .../Forms/FormProduct.Designer.cs | 145 +++++++++++++ .../Forms/FormProduct.cs | 94 +++++++++ .../Forms/FormProduct.resx | 120 +++++++++++ .../Forms/FormProducts.Designer.cs | 123 +++++++++++ .../Forms/FormProducts.cs | 80 +++++++ .../Forms/FormProducts.resx | 120 +++++++++++ .../Forms/FormSupplier.Designer.cs | 141 +++++++++++++ .../Forms/FormSupplier.cs | 70 +++++++ .../Forms/FormSupplier.resx | 120 +++++++++++ .../Forms/FormSuppliers.Designer.cs | 122 +++++++++++ .../Forms/FormSuppliers.cs | 80 +++++++ .../Forms/FormSuppliers.resx | 120 +++++++++++ .../Forms/FormSupply.Designer.cs | 196 ++++++++++++++++++ .../Forms/FormSupply.cs | 76 +++++++ .../Forms/FormSupply.resx | 120 +++++++++++ .../Forms/FormSupplys.Designer.cs | 122 +++++++++++ .../Forms/FormSupplys.cs | 80 +++++++ .../Forms/FormSupplys.resx | 120 +++++++++++ .../ProjectConfectionaryFactory.csproj | 4 - .../Properties/Resources.Designer.cs | 30 +++ .../Properties/Resources.resx | 9 + .../Resources/Add.png | Bin 0 -> 13400 bytes .../Resources/Delete.png | Bin 0 -> 8706 bytes .../Resources/Update.png | Bin 0 -> 9089 bytes 41 files changed, 3863 insertions(+), 71 deletions(-) create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.Designer.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.cs create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.resx create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Resources/Add.png create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Resources/Delete.png create mode 100644 ProjectConfectionaryFactory/ProjectConfectionaryFactory/Resources/Update.png diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.Designer.cs new file mode 100644 index 0000000..db53746 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.Designer.cs @@ -0,0 +1,163 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormClient + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonCancel = new Button(); + buttonSave = new Button(); + textBoxClientName = new TextBox(); + label3 = new Label(); + label2 = new Label(); + label1 = new Label(); + textBoxClientSurname = new TextBox(); + label4 = new Label(); + textBoxAddress = new TextBox(); + maskedTextBoxPhone = new MaskedTextBox(); + SuspendLayout(); + // + // buttonCancel + // + buttonCancel.Location = new Point(297, 216); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 15; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSave + // + buttonSave.Location = new Point(216, 216); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 14; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // textBoxClientName + // + textBoxClientName.Location = new Point(115, 30); + textBoxClientName.Name = "textBoxClientName"; + textBoxClientName.Size = new Size(207, 23); + textBoxClientName.TabIndex = 11; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(66, 161); + label3.Name = "label3"; + label3.Size = new Size(43, 15); + label3.TabIndex = 10; + label3.Text = "Адрес:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(51, 117); + label2.Name = "label2"; + label2.Size = new Size(58, 15); + label2.TabIndex = 9; + label2.Text = "Телефон:"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(75, 33); + label1.Name = "label1"; + label1.Size = new Size(34, 15); + label1.TabIndex = 8; + label1.Text = "Имя:"; + // + // textBoxClientSurname + // + textBoxClientSurname.Location = new Point(115, 71); + textBoxClientSurname.Name = "textBoxClientSurname"; + textBoxClientSurname.Size = new Size(207, 23); + textBoxClientSurname.TabIndex = 17; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(48, 74); + label4.Name = "label4"; + label4.Size = new Size(61, 15); + label4.TabIndex = 16; + label4.Text = "Фамилия:"; + // + // textBoxAddress + // + textBoxAddress.Location = new Point(115, 158); + textBoxAddress.Name = "textBoxAddress"; + textBoxAddress.Size = new Size(207, 23); + textBoxAddress.TabIndex = 18; + // + // maskedTextBoxPhone + // + maskedTextBoxPhone.Location = new Point(115, 114); + maskedTextBoxPhone.Mask = "+7 (999) 000-0000"; + maskedTextBoxPhone.Name = "maskedTextBoxPhone"; + maskedTextBoxPhone.Size = new Size(207, 23); + maskedTextBoxPhone.TabIndex = 19; + // + // FormClient + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(384, 251); + Controls.Add(maskedTextBoxPhone); + Controls.Add(textBoxAddress); + Controls.Add(textBoxClientSurname); + Controls.Add(label4); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxClientName); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Name = "FormClient"; + StartPosition = FormStartPosition.CenterParent; + Text = "Клиент"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button buttonCancel; + private Button buttonSave; + private TextBox textBoxClientName; + private Label label3; + private Label label2; + private Label label1; + private TextBox textBoxClientSurname; + private Label label4; + private TextBox textBoxAddress; + private MaskedTextBox maskedTextBoxPhone; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.cs new file mode 100644 index 0000000..76bbdf9 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.cs @@ -0,0 +1,72 @@ +using ProjectConfectionaryFactory.Entities; +using ProjectConfectionaryFactory.Repositories; + +namespace ProjectConfectionaryFactory.Forms +{ + public partial class FormClient : Form + { + private readonly IClientRepository _clientRepository; + + private int? _clientId; + + public int Id + { + set + { + try + { + var client = _clientRepository.ReadClientById(value); + if (client == null) + { + throw new InvalidDataException(nameof(client)); + } + textBoxClientName.Text = client.Name; + textBoxClientSurname.Text = client.Surname; + maskedTextBoxPhone.Text = client.Phone.ToString(); + textBoxAddress.Text = client.Address; + _clientId = value; + } + catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } + } + } + + public FormClient(IClientRepository clientRepository) + { + InitializeComponent(); + _clientRepository = clientRepository ?? throw new ArgumentNullException(nameof(clientRepository)); + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxClientName.Text) || string.IsNullOrWhiteSpace(textBoxClientSurname.Text) || string.IsNullOrWhiteSpace(maskedTextBoxPhone.Text) || string.IsNullOrWhiteSpace(textBoxAddress.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_clientId.HasValue) + { + _clientRepository.UpdateClient(CreateClient(_clientId.Value)); + } + else + { + _clientRepository.CreateClient(CreateClient(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Client CreateClient(int id) => Client.CreateEntity( + id, + textBoxClientName.Text, + textBoxClientSurname.Text, + Double.Parse(maskedTextBoxPhone.Text), + textBoxAddress.Text); + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClient.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.Designer.cs new file mode 100644 index 0000000..16b9ef2 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.Designer.cs @@ -0,0 +1,122 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormClients + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridViewData = new DataGridView(); + buttonUpdate = new Button(); + buttonDelete = new Button(); + buttonAdd = new Button(); + panel1 = new Panel(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(709, 450); + dataGridViewData.TabIndex = 3; + // + // buttonUpdate + // + buttonUpdate.BackgroundImage = Properties.Resources.Update; + buttonUpdate.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdate.Location = new Point(14, 83); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(65, 65); + buttonUpdate.TabIndex = 1; + buttonUpdate.UseVisualStyleBackColor = true; + // + // buttonDelete + // + buttonDelete.BackgroundImage = Properties.Resources.Delete; + buttonDelete.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelete.Location = new Point(14, 154); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(65, 65); + buttonDelete.TabIndex = 1; + buttonDelete.UseVisualStyleBackColor = true; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(14, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + // + // panel1 + // + panel1.Controls.Add(buttonUpdate); + panel1.Controls.Add(buttonDelete); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(709, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(91, 450); + panel1.TabIndex = 2; + // + // FormClients + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewData); + Controls.Add(panel1); + Name = "FormClients"; + StartPosition = FormStartPosition.CenterParent; + Text = "Клиенты"; + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridViewData; + private Button buttonUpdate; + private Button buttonDelete; + private Button buttonAdd; + private Panel panel1; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.cs new file mode 100644 index 0000000..0ff1f81 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.cs @@ -0,0 +1,80 @@ +using ProjectConfectionaryFactory.Repositories; +using Unity; + +namespace ProjectConfectionaryFactory.Forms +{ + public partial class FormClients : Form + { + private readonly IUnityContainer _container; + private readonly IClientRepository _clientRepository; + public FormClients(IUnityContainer container, IClientRepository clientRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _clientRepository = clientRepository ?? throw new ArgumentNullException(nameof(clientRepository)); + } + private void FormClients_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonUpdate_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) { return; } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonDelete_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) { return; } + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; } + try + { + _clientRepository.DeleteClient(findId); LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridViewData.DataSource = _clientRepository.ReadClients(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormClients.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponent.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponent.Designer.cs index 7858d60..cc06aeb 100644 --- a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponent.Designer.cs +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponent.Designer.cs @@ -31,13 +31,13 @@ label1 = new Label(); label2 = new Label(); label3 = new Label(); - textBox1 = new TextBox(); - numericUpDown1 = new NumericUpDown(); - numericUpDown2 = new NumericUpDown(); - button1 = new Button(); - button2 = new Button(); - ((System.ComponentModel.ISupportInitialize)numericUpDown1).BeginInit(); - ((System.ComponentModel.ISupportInitialize)numericUpDown2).BeginInit(); + textBoxComponentName = new TextBox(); + numericUpDownPrice = new NumericUpDown(); + numericUpDownWeight = new NumericUpDown(); + buttonSave = new Button(); + buttonCancel = new Button(); + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownWeight).BeginInit(); SuspendLayout(); // // label1 @@ -48,7 +48,6 @@ label1.Size = new Size(132, 15); label1.TabIndex = 0; label1.Text = "Название компонента:"; - label1.Click += this.label1_Click; // // label2 // @@ -68,70 +67,71 @@ label3.TabIndex = 2; label3.Text = "Вес:"; // - // textBox1 + // textBoxComponentName // - textBox1.Location = new Point(150, 35); - textBox1.Name = "textBox1"; - textBox1.Size = new Size(207, 23); - textBox1.TabIndex = 3; + textBoxComponentName.Location = new Point(150, 35); + textBoxComponentName.Name = "textBoxComponentName"; + textBoxComponentName.Size = new Size(207, 23); + textBoxComponentName.TabIndex = 3; // - // numericUpDown1 + // numericUpDownPrice // - numericUpDown1.DecimalPlaces = 2; - numericUpDown1.Location = new Point(150, 82); - numericUpDown1.Maximum = new decimal(new int[] { 100000, 0, 0, 0 }); - numericUpDown1.Name = "numericUpDown1"; - numericUpDown1.Size = new Size(96, 23); - numericUpDown1.TabIndex = 4; - numericUpDown1.Value = new decimal(new int[] { 1, 0, 0, 131072 }); + numericUpDownPrice.DecimalPlaces = 2; + numericUpDownPrice.Location = new Point(150, 82); + numericUpDownPrice.Maximum = new decimal(new int[] { 100000, 0, 0, 0 }); + numericUpDownPrice.Name = "numericUpDownPrice"; + numericUpDownPrice.Size = new Size(96, 23); + numericUpDownPrice.TabIndex = 4; + numericUpDownPrice.Value = new decimal(new int[] { 1, 0, 0, 131072 }); // - // numericUpDown2 + // numericUpDownWeight // - numericUpDown2.DecimalPlaces = 3; - numericUpDown2.Location = new Point(150, 128); - numericUpDown2.Maximum = new decimal(new int[] { 100000, 0, 0, 0 }); - numericUpDown2.Name = "numericUpDown2"; - numericUpDown2.Size = new Size(96, 23); - numericUpDown2.TabIndex = 5; - numericUpDown2.Value = new decimal(new int[] { 1, 0, 0, 196608 }); + numericUpDownWeight.DecimalPlaces = 3; + numericUpDownWeight.Location = new Point(150, 128); + numericUpDownWeight.Maximum = new decimal(new int[] { 100000, 0, 0, 0 }); + numericUpDownWeight.Name = "numericUpDownWeight"; + numericUpDownWeight.Size = new Size(96, 23); + numericUpDownWeight.TabIndex = 5; + numericUpDownWeight.Value = new decimal(new int[] { 1, 0, 0, 196608 }); // - // button1 + // buttonSave // - button1.Location = new Point(211, 200); - button1.Name = "button1"; - button1.Size = new Size(75, 23); - button1.TabIndex = 6; - button1.Text = "Сохранить"; - button1.UseVisualStyleBackColor = true; - button1.Click += this.button1_Click; + buttonSave.Location = new Point(211, 200); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 6; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; // - // button2 + // buttonCancel // - button2.Location = new Point(292, 200); - button2.Name = "button2"; - button2.Size = new Size(75, 23); - button2.TabIndex = 7; - button2.Text = "Отмена"; - button2.UseVisualStyleBackColor = true; + buttonCancel.Location = new Point(292, 200); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 7; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; // // FormComponent // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(379, 235); - Controls.Add(button2); - Controls.Add(button1); - Controls.Add(numericUpDown2); - Controls.Add(numericUpDown1); - Controls.Add(textBox1); + ClientSize = new Size(384, 236); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(numericUpDownWeight); + Controls.Add(numericUpDownPrice); + Controls.Add(textBoxComponentName); Controls.Add(label3); Controls.Add(label2); Controls.Add(label1); Name = "FormComponent"; StartPosition = FormStartPosition.CenterParent; Text = "Компонент"; - ((System.ComponentModel.ISupportInitialize)numericUpDown1).EndInit(); - ((System.ComponentModel.ISupportInitialize)numericUpDown2).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit(); + ((System.ComponentModel.ISupportInitialize)numericUpDownWeight).EndInit(); ResumeLayout(false); PerformLayout(); } @@ -141,10 +141,10 @@ private Label label1; private Label label2; private Label label3; - private TextBox textBox1; - private NumericUpDown numericUpDown1; - private NumericUpDown numericUpDown2; - private Button button1; - private Button button2; + private TextBox textBoxComponentName; + private NumericUpDown numericUpDownPrice; + private NumericUpDown numericUpDownWeight; + private Button buttonSave; + private Button buttonCancel; } } \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponent.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponent.cs index bae89e1..7bc34f8 100644 --- a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponent.cs +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponent.cs @@ -1,20 +1,70 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; +using ProjectConfectionaryFactory.Entities; +using ProjectConfectionaryFactory.Repositories; namespace ProjectConfectionaryFactory.Forms { public partial class FormComponent : Form { - public FormComponent() + 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; + numericUpDownPrice.Value = (decimal)component.Price; + numericUpDownWeight.Value = (decimal)component.Weight; + _componentId = value; + } + catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } + } + } + + public FormComponent(IComponentRepository componentRepository) { InitializeComponent(); + _componentRepository = componentRepository ?? throw new ArgumentNullException(nameof(componentRepository)); } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxComponentName.Text)) + { + 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 ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Component CreateComponent(int id) => Component.CreateEntity( + id, + textBoxComponentName.Text, + Convert.ToInt32(numericUpDownPrice.Value), + Convert.ToDouble(numericUpDownWeight.Value)); } } diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.Designer.cs new file mode 100644 index 0000000..31db440 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.Designer.cs @@ -0,0 +1,126 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormComponents + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + panel1 = new Panel(); + buttonUpdate = new Button(); + buttonDelete = new Button(); + buttonAdd = new Button(); + dataGridViewData = new DataGridView(); + panel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + SuspendLayout(); + // + // panel1 + // + panel1.Controls.Add(buttonUpdate); + panel1.Controls.Add(buttonDelete); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(709, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(91, 450); + panel1.TabIndex = 0; + // + // buttonUpdate + // + buttonUpdate.BackgroundImage = Properties.Resources.Update; + buttonUpdate.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdate.Location = new Point(14, 83); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(65, 65); + buttonUpdate.TabIndex = 1; + buttonUpdate.UseVisualStyleBackColor = true; + buttonUpdate.Click += ButtonUpdate_Click; + // + // buttonDelete + // + buttonDelete.BackgroundImage = Properties.Resources.Delete; + buttonDelete.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelete.Location = new Point(14, 154); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(65, 65); + buttonDelete.TabIndex = 1; + buttonDelete.UseVisualStyleBackColor = true; + buttonDelete.Click += ButtonDelete_Click; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(14, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(709, 450); + dataGridViewData.TabIndex = 1; + // + // FormComponents + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewData); + Controls.Add(panel1); + Name = "FormComponents"; + StartPosition = FormStartPosition.CenterParent; + Text = "Компоненты"; + Load += FormComponents_Load; + panel1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel panel1; + private Button buttonAdd; + private Button buttonUpdate; + private Button buttonDelete; + private DataGridView dataGridViewData; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.cs new file mode 100644 index 0000000..60d9995 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.cs @@ -0,0 +1,80 @@ +using ProjectConfectionaryFactory.Repositories; +using Unity; + +namespace ProjectConfectionaryFactory.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().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonUpdate_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) { return; } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonDelete_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 LoadList() => dataGridViewData.DataSource = _componentRepository.ReadComponents(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormComponents.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.Designer.cs new file mode 100644 index 0000000..1f80d67 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.Designer.cs @@ -0,0 +1,143 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormOrder + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + label4 = new Label(); + label1 = new Label(); + checkBoxCompleted = new CheckBox(); + comboBoxClient = new ComboBox(); + buttonCancel = new Button(); + buttonSave = new Button(); + label2 = new Label(); + dateTimePicker1 = new DateTimePicker(); + SuspendLayout(); + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(49, 64); + label4.Name = "label4"; + label4.Size = new Size(67, 15); + label4.TabIndex = 18; + label4.Text = "Выполнен:"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(67, 24); + label1.Name = "label1"; + label1.Size = new Size(49, 15); + label1.TabIndex = 17; + label1.Text = "Клиент:"; + // + // checkBoxCompleted + // + checkBoxCompleted.AutoSize = true; + checkBoxCompleted.Location = new Point(122, 65); + checkBoxCompleted.Name = "checkBoxCompleted"; + checkBoxCompleted.Size = new Size(15, 14); + checkBoxCompleted.TabIndex = 19; + checkBoxCompleted.UseVisualStyleBackColor = true; + // + // comboBoxClient + // + comboBoxClient.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxClient.FormattingEnabled = true; + comboBoxClient.Location = new Point(122, 21); + comboBoxClient.Name = "comboBoxClient"; + comboBoxClient.Size = new Size(210, 23); + comboBoxClient.TabIndex = 20; + // + // buttonCancel + // + buttonCancel.Location = new Point(297, 150); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 22; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + // + // buttonSave + // + buttonSave.Location = new Point(216, 150); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 21; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(81, 104); + label2.Name = "label2"; + label2.Size = new Size(35, 15); + label2.TabIndex = 23; + label2.Text = "Дата:"; + // + // dateTimePicker1 + // + dateTimePicker1.Enabled = false; + dateTimePicker1.Location = new Point(122, 98); + dateTimePicker1.Name = "dateTimePicker1"; + dateTimePicker1.Size = new Size(200, 23); + dateTimePicker1.TabIndex = 24; + // + // FormOrder + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(384, 185); + Controls.Add(dateTimePicker1); + Controls.Add(label2); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(comboBoxClient); + Controls.Add(checkBoxCompleted); + Controls.Add(label4); + Controls.Add(label1); + Name = "FormOrder"; + StartPosition = FormStartPosition.CenterParent; + Text = "Заказ"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label label4; + private Label label1; + private CheckBox checkBoxCompleted; + private ComboBox comboBoxClient; + private Button buttonCancel; + private Button buttonSave; + private Label label2; + private DateTimePicker dateTimePicker1; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.cs new file mode 100644 index 0000000..b5ad9ce --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.cs @@ -0,0 +1,70 @@ +using ProjectConfectionaryFactory.Entities; +using ProjectConfectionaryFactory.Repositories; + +namespace ProjectConfectionaryFactory.Forms +{ + public partial class FormOrder : Form + { + private readonly IOrderRepository _orderRepository; + + private int? _orderId; + + public int Id + { + set + { + try + { + var order = _orderRepository.ReadOrderById(value); + if (order == null) + { + throw new InvalidDataException(nameof(order)); + } + checkBoxCompleted.Enabled = order.Completed; + _orderId = value; + } + catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } + } + } + + public FormOrder(IOrderRepository orderRepository, IClientRepository clientRepository) + { + InitializeComponent(); + _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); + comboBoxClient.DataSource = clientRepository.ReadClients(); + comboBoxClient.DisplayMember = "FirstName"; + comboBoxClient.ValueMember = "Id"; + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (comboBoxClient.SelectedIndex < 0 || !checkBoxCompleted.Checked) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_orderId.HasValue) + { + _orderRepository.UpdateOrder(CreateOrder(_orderId.Value)); + } + else + { + _orderRepository.CreateOrder(CreateOrder(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Order CreateOrder(int id) => Order.CreateEntity( + id, + (int)comboBoxClient.SelectedValue!, + checkBoxCompleted.Checked); + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrder.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.Designer.cs new file mode 100644 index 0000000..e9bed20 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.Designer.cs @@ -0,0 +1,122 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormOrders + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonAdd = new Button(); + dataGridViewData = new DataGridView(); + buttonUpdate = new Button(); + buttonDelete = new Button(); + panel1 = new Panel(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(14, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(709, 450); + dataGridViewData.TabIndex = 5; + // + // buttonUpdate + // + buttonUpdate.BackgroundImage = Properties.Resources.Update; + buttonUpdate.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdate.Location = new Point(14, 83); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(65, 65); + buttonUpdate.TabIndex = 1; + buttonUpdate.UseVisualStyleBackColor = true; + // + // buttonDelete + // + buttonDelete.BackgroundImage = Properties.Resources.Delete; + buttonDelete.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelete.Location = new Point(14, 154); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(65, 65); + buttonDelete.TabIndex = 1; + buttonDelete.UseVisualStyleBackColor = true; + // + // panel1 + // + panel1.Controls.Add(buttonUpdate); + panel1.Controls.Add(buttonDelete); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(709, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(91, 450); + panel1.TabIndex = 4; + // + // FormOrders + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewData); + Controls.Add(panel1); + Name = "FormOrders"; + StartPosition = FormStartPosition.CenterParent; + Text = "FormOrders"; + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private Button buttonAdd; + private DataGridView dataGridViewData; + private Button buttonUpdate; + private Button buttonDelete; + private Panel panel1; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.cs new file mode 100644 index 0000000..c0df07b --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.cs @@ -0,0 +1,80 @@ +using ProjectConfectionaryFactory.Repositories; +using Unity; + +namespace ProjectConfectionaryFactory.Forms +{ + public partial class FormOrders : Form + { + private readonly IUnityContainer _container; + private readonly IOrderRepository _orderRepository; + public FormOrders(IUnityContainer container, IOrderRepository orderRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); + } + private void FormOrders_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonUpdate_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) { return; } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonDelete_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() => dataGridViewData.DataSource = _orderRepository.ReadOrders(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormOrders.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.Designer.cs new file mode 100644 index 0000000..b3b02f5 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.Designer.cs @@ -0,0 +1,145 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormProduct + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + numericUpDownPrice = new NumericUpDown(); + textBoxProductName = new TextBox(); + label2 = new Label(); + label1 = new Label(); + label3 = new Label(); + buttonCancel = new Button(); + buttonSave = new Button(); + checkedListBoxConfectionaryType = new CheckedListBox(); + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).BeginInit(); + SuspendLayout(); + // + // numericUpDownPrice + // + numericUpDownPrice.DecimalPlaces = 2; + numericUpDownPrice.Location = new Point(150, 208); + numericUpDownPrice.Maximum = new decimal(new int[] { 100000, 0, 0, 0 }); + numericUpDownPrice.Name = "numericUpDownPrice"; + numericUpDownPrice.Size = new Size(96, 23); + numericUpDownPrice.TabIndex = 8; + numericUpDownPrice.Value = new decimal(new int[] { 1, 0, 0, 131072 }); + // + // textBoxProductName + // + textBoxProductName.Location = new Point(150, 161); + textBoxProductName.Name = "textBoxProductName"; + textBoxProductName.Size = new Size(207, 23); + textBoxProductName.TabIndex = 7; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(106, 210); + label2.Name = "label2"; + label2.Size = new Size(38, 15); + label2.TabIndex = 6; + label2.Text = "Цена:"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(29, 164); + label1.Name = "label1"; + label1.Size = new Size(115, 15); + label1.TabIndex = 5; + label1.Text = "Название продукта:"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(61, 31); + label3.Name = "label3"; + label3.Size = new Size(83, 15); + label3.TabIndex = 9; + label3.Text = "Вид продукта:"; + // + // buttonCancel + // + buttonCancel.Location = new Point(297, 286); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 11; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSave + // + buttonSave.Location = new Point(216, 286); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 10; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // checkedListBoxConfectionaryType + // + checkedListBoxConfectionaryType.FormattingEnabled = true; + checkedListBoxConfectionaryType.Location = new Point(150, 31); + checkedListBoxConfectionaryType.Name = "checkedListBoxConfectionaryType"; + checkedListBoxConfectionaryType.Size = new Size(207, 112); + checkedListBoxConfectionaryType.TabIndex = 12; + // + // FormProduct + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(384, 321); + Controls.Add(checkedListBoxConfectionaryType); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(label3); + Controls.Add(numericUpDownPrice); + Controls.Add(textBoxProductName); + Controls.Add(label2); + Controls.Add(label1); + Name = "FormProduct"; + StartPosition = FormStartPosition.CenterParent; + Text = "FormProduct"; + ((System.ComponentModel.ISupportInitialize)numericUpDownPrice).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + private NumericUpDown numericUpDownPrice; + private TextBox textBoxProductName; + private Label label2; + private Label label1; + private Label label3; + private Button buttonCancel; + private Button buttonSave; + private CheckedListBox checkedListBoxConfectionaryType; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.cs new file mode 100644 index 0000000..5853ed5 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.cs @@ -0,0 +1,94 @@ +using Microsoft.VisualBasic.FileIO; +using ProjectConfectionaryFactory.Entities; +using ProjectConfectionaryFactory.Entities.Enums; +using ProjectConfectionaryFactory.Repositories; + +namespace ProjectConfectionaryFactory.Forms +{ + public partial class FormProduct : Form + { + private readonly IProductRepository _productRepository; + + private int? _productId; + + public int Id + { + set + { + try + { + var product = _productRepository.ReadProductById(value); + if (product == null) + { + throw new InvalidDataException(nameof(product)); + } + foreach (ConfectionaryType elem in Enum.GetValues(typeof(ConfectionaryType))) + { + if ((elem & product.ConfectionaryType) != 0) + { + checkedListBoxConfectionaryType.SetItemChecked(checkedListBoxConfectionaryType.Items.IndexOf(elem), true); + } + } + textBoxProductName.Text = product.Name; + numericUpDownPrice.Value = (decimal)product.Price; + _productId = value; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + } + + public FormProduct(IProductRepository productRepository) + { + InitializeComponent(); + _productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository)); + foreach (var elem in Enum.GetValues(typeof(ConfectionaryType))) + { + checkedListBoxConfectionaryType.Items.Add(elem); + } + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (checkedListBoxConfectionaryType.CheckedItems.Count == 0 || string.IsNullOrWhiteSpace(textBoxProductName.Text)) + { + 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 ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Product CreateProduct(int id) + { + ConfectionaryType confectionaryType = ConfectionaryType.None; + foreach (var elem in checkedListBoxConfectionaryType.CheckedItems) + { + confectionaryType |= (ConfectionaryType)elem; + } + return Product.CreateEntity( + id, + confectionaryType, + textBoxProductName.Text, + (double)numericUpDownPrice.Value); + } + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProduct.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.Designer.cs new file mode 100644 index 0000000..2e20dff --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.Designer.cs @@ -0,0 +1,123 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormProducts + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonUpdate = new Button(); + buttonDelete = new Button(); + buttonAdd = new Button(); + dataGridViewData = new DataGridView(); + panel1 = new Panel(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // buttonUpdate + // + buttonUpdate.BackgroundImage = Properties.Resources.Update; + buttonUpdate.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdate.Location = new Point(14, 83); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(65, 65); + buttonUpdate.TabIndex = 1; + buttonUpdate.UseVisualStyleBackColor = true; + // + // buttonDelete + // + buttonDelete.BackgroundImage = Properties.Resources.Delete; + buttonDelete.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelete.Location = new Point(14, 154); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(65, 65); + buttonDelete.TabIndex = 1; + buttonDelete.UseVisualStyleBackColor = true; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(14, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(709, 450); + dataGridViewData.TabIndex = 3; + // + // panel1 + // + panel1.Controls.Add(buttonUpdate); + panel1.Controls.Add(buttonDelete); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(709, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(91, 450); + panel1.TabIndex = 2; + // + // FormProducts + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewData); + Controls.Add(panel1); + Name = "FormProducts"; + StartPosition = FormStartPosition.CenterParent; + Text = "FormProducts"; + Load += FormProducts_Load; + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private Button buttonUpdate; + private Button buttonDelete; + private Button buttonAdd; + private DataGridView dataGridViewData; + private Panel panel1; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.cs new file mode 100644 index 0000000..7119186 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.cs @@ -0,0 +1,80 @@ +using ProjectConfectionaryFactory.Repositories; +using Unity; + +namespace ProjectConfectionaryFactory.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().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonUpdate_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) { return; } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonDelete_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 LoadList() => dataGridViewData.DataSource = _productRepository.ReadProducts(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormProducts.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.Designer.cs new file mode 100644 index 0000000..aa89789 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.Designer.cs @@ -0,0 +1,141 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormSupplier + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + maskedTextBoxPhone = new MaskedTextBox(); + textBoxAddress = new TextBox(); + buttonCancel = new Button(); + buttonSave = new Button(); + textBoxSupplierName = new TextBox(); + label3 = new Label(); + label2 = new Label(); + label1 = new Label(); + SuspendLayout(); + // + // maskedTextBoxPhone + // + maskedTextBoxPhone.Location = new Point(121, 56); + maskedTextBoxPhone.Mask = "+7 (999) 000-0000"; + maskedTextBoxPhone.Name = "maskedTextBoxPhone"; + maskedTextBoxPhone.Size = new Size(207, 23); + maskedTextBoxPhone.TabIndex = 27; + // + // textBoxAddress + // + textBoxAddress.Location = new Point(121, 93); + textBoxAddress.Name = "textBoxAddress"; + textBoxAddress.Size = new Size(207, 23); + textBoxAddress.TabIndex = 26; + // + // buttonCancel + // + buttonCancel.Location = new Point(297, 156); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 25; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSave + // + buttonSave.Location = new Point(216, 156); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 24; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // textBoxSupplierName + // + textBoxSupplierName.Location = new Point(121, 20); + textBoxSupplierName.Name = "textBoxSupplierName"; + textBoxSupplierName.Size = new Size(207, 23); + textBoxSupplierName.TabIndex = 23; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(72, 96); + label3.Name = "label3"; + label3.Size = new Size(43, 15); + label3.TabIndex = 22; + label3.Text = "Адрес:"; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(57, 59); + label2.Name = "label2"; + label2.Size = new Size(58, 15); + label2.TabIndex = 21; + label2.Text = "Телефон:"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(81, 23); + label1.Name = "label1"; + label1.Size = new Size(34, 15); + label1.TabIndex = 20; + label1.Text = "Имя:"; + // + // FormSupplier + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(384, 191); + Controls.Add(maskedTextBoxPhone); + Controls.Add(textBoxAddress); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxSupplierName); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(label1); + Name = "FormSupplier"; + StartPosition = FormStartPosition.CenterParent; + Text = "FormSupplier"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private MaskedTextBox maskedTextBoxPhone; + private TextBox textBoxAddress; + private Button buttonCancel; + private Button buttonSave; + private TextBox textBoxSupplierName; + private Label label3; + private Label label2; + private Label label1; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.cs new file mode 100644 index 0000000..78a0a36 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.cs @@ -0,0 +1,70 @@ +using ProjectConfectionaryFactory.Entities; +using ProjectConfectionaryFactory.Repositories; + +namespace ProjectConfectionaryFactory.Forms +{ + public partial class FormSupplier : Form + { + private readonly ISupplierRepository _supplierRepository; + + private int? _supplierId; + + public int Id + { + set + { + try + { + var supplier = _supplierRepository.ReadSupplierById(value); + if (supplier == null) + { + throw new InvalidDataException(nameof(supplier)); + } + textBoxSupplierName.Text = supplier.Name; + maskedTextBoxPhone.Text = supplier.Phone.ToString(); + textBoxAddress.Text = supplier.Address; + _supplierId = value; + } + catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } + } + } + + public FormSupplier(ISupplierRepository supplierRepository) + { + InitializeComponent(); + _supplierRepository = supplierRepository ?? throw new ArgumentNullException(nameof(supplierRepository)); + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (string.IsNullOrWhiteSpace(textBoxSupplierName.Text) || string.IsNullOrWhiteSpace(maskedTextBoxPhone.Text) || string.IsNullOrWhiteSpace(textBoxAddress.Text)) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_supplierId.HasValue) + { + _supplierRepository.UpdateSupplier(CreateSupplier(_supplierId.Value)); + } + else + { + _supplierRepository.CreateSupplier(CreateSupplier(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Supplier CreateSupplier(int id) => Supplier.CreateEntity( + id, + textBoxSupplierName.Text, + Double.Parse(maskedTextBoxPhone.Text), + textBoxAddress.Text); + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplier.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.Designer.cs new file mode 100644 index 0000000..0ca9e36 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.Designer.cs @@ -0,0 +1,122 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormSuppliers + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridViewData = new DataGridView(); + buttonUpdate = new Button(); + buttonDelete = new Button(); + buttonAdd = new Button(); + panel1 = new Panel(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(709, 450); + dataGridViewData.TabIndex = 5; + // + // buttonUpdate + // + buttonUpdate.BackgroundImage = Properties.Resources.Update; + buttonUpdate.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdate.Location = new Point(14, 83); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(65, 65); + buttonUpdate.TabIndex = 1; + buttonUpdate.UseVisualStyleBackColor = true; + // + // buttonDelete + // + buttonDelete.BackgroundImage = Properties.Resources.Delete; + buttonDelete.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelete.Location = new Point(14, 154); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(65, 65); + buttonDelete.TabIndex = 1; + buttonDelete.UseVisualStyleBackColor = true; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(14, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + // + // panel1 + // + panel1.Controls.Add(buttonUpdate); + panel1.Controls.Add(buttonDelete); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(709, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(91, 450); + panel1.TabIndex = 4; + // + // FormSuppliers + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewData); + Controls.Add(panel1); + Name = "FormSuppliers"; + StartPosition = FormStartPosition.CenterParent; + Text = "FormSuppliers"; + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridViewData; + private Button buttonUpdate; + private Button buttonDelete; + private Button buttonAdd; + private Panel panel1; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.cs new file mode 100644 index 0000000..c8e4402 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.cs @@ -0,0 +1,80 @@ +using ProjectConfectionaryFactory.Repositories; +using Unity; + +namespace ProjectConfectionaryFactory.Forms +{ + public partial class FormSuppliers : Form + { + private readonly IUnityContainer _container; + private readonly ISupplierRepository _supplierRepository; + public FormSuppliers(IUnityContainer container, ISupplierRepository supplierRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _supplierRepository = supplierRepository ?? throw new ArgumentNullException(nameof(supplierRepository)); + } + private void FormSuppliers_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonUpdate_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) { return; } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonDelete_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) { return; } + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; } + try + { + _supplierRepository.DeleteSupplier(findId); LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridViewData.DataSource = _supplierRepository.ReadSuppliers(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSuppliers.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.Designer.cs new file mode 100644 index 0000000..4d11f09 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.Designer.cs @@ -0,0 +1,196 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormSupply + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dateTimePicker1 = new DateTimePicker(); + label2 = new Label(); + buttonCancel = new Button(); + buttonSave = new Button(); + comboBoxSupplier = new ComboBox(); + checkBoxCompleted = new CheckBox(); + label4 = new Label(); + label1 = new Label(); + comboBoxComponent = new ComboBox(); + label3 = new Label(); + numericUpDownWeight = new NumericUpDown(); + label5 = new Label(); + ((System.ComponentModel.ISupportInitialize)numericUpDownWeight).BeginInit(); + SuspendLayout(); + // + // dateTimePicker1 + // + dateTimePicker1.Enabled = false; + dateTimePicker1.Location = new Point(108, 183); + dateTimePicker1.Name = "dateTimePicker1"; + dateTimePicker1.Size = new Size(200, 23); + dateTimePicker1.TabIndex = 32; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new Point(67, 189); + label2.Name = "label2"; + label2.Size = new Size(35, 15); + label2.TabIndex = 31; + label2.Text = "Дата:"; + // + // buttonCancel + // + buttonCancel.Location = new Point(297, 251); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(75, 23); + buttonCancel.TabIndex = 30; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // buttonSave + // + buttonSave.Location = new Point(216, 251); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(75, 23); + buttonSave.TabIndex = 29; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // comboBoxSupplier + // + comboBoxSupplier.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxSupplier.FormattingEnabled = true; + comboBoxSupplier.Location = new Point(108, 25); + comboBoxSupplier.Name = "comboBoxSupplier"; + comboBoxSupplier.Size = new Size(210, 23); + comboBoxSupplier.TabIndex = 28; + // + // checkBoxCompleted + // + checkBoxCompleted.AutoSize = true; + checkBoxCompleted.Location = new Point(108, 150); + checkBoxCompleted.Name = "checkBoxCompleted"; + checkBoxCompleted.Size = new Size(15, 14); + checkBoxCompleted.TabIndex = 27; + checkBoxCompleted.UseVisualStyleBackColor = true; + // + // label4 + // + label4.AutoSize = true; + label4.Location = new Point(35, 149); + label4.Name = "label4"; + label4.Size = new Size(67, 15); + label4.TabIndex = 26; + label4.Text = "Выполнен:"; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new Point(29, 28); + label1.Name = "label1"; + label1.Size = new Size(73, 15); + label1.TabIndex = 25; + label1.Text = "Поставщик:"; + // + // comboBoxComponent + // + comboBoxComponent.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxComponent.FormattingEnabled = true; + comboBoxComponent.Location = new Point(108, 66); + comboBoxComponent.Name = "comboBoxComponent"; + comboBoxComponent.Size = new Size(210, 23); + comboBoxComponent.TabIndex = 34; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new Point(30, 69); + label3.Name = "label3"; + label3.Size = new Size(72, 15); + label3.TabIndex = 33; + label3.Text = "Компонент:"; + // + // numericUpDownWeight + // + numericUpDownWeight.DecimalPlaces = 3; + numericUpDownWeight.Location = new Point(108, 105); + numericUpDownWeight.Maximum = new decimal(new int[] { 100000, 0, 0, 0 }); + numericUpDownWeight.Name = "numericUpDownWeight"; + numericUpDownWeight.Size = new Size(96, 23); + numericUpDownWeight.TabIndex = 36; + numericUpDownWeight.Value = new decimal(new int[] { 1, 0, 0, 196608 }); + // + // label5 + // + label5.AutoSize = true; + label5.Location = new Point(73, 107); + label5.Name = "label5"; + label5.Size = new Size(29, 15); + label5.TabIndex = 35; + label5.Text = "Вес:"; + // + // FormSupply + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(384, 286); + Controls.Add(numericUpDownWeight); + Controls.Add(label5); + Controls.Add(comboBoxComponent); + Controls.Add(label3); + Controls.Add(dateTimePicker1); + Controls.Add(label2); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(comboBoxSupplier); + Controls.Add(checkBoxCompleted); + Controls.Add(label4); + Controls.Add(label1); + Name = "FormSupply"; + StartPosition = FormStartPosition.CenterParent; + Text = "FormSupply"; + ((System.ComponentModel.ISupportInitialize)numericUpDownWeight).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private DateTimePicker dateTimePicker1; + private Label label2; + private Button buttonCancel; + private Button buttonSave; + private ComboBox comboBoxSupplier; + private CheckBox checkBoxCompleted; + private Label label4; + private Label label1; + private ComboBox comboBoxComponent; + private Label label3; + private NumericUpDown numericUpDownWeight; + private Label label5; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.cs new file mode 100644 index 0000000..7468840 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.cs @@ -0,0 +1,76 @@ +using ProjectConfectionaryFactory.Entities; +using ProjectConfectionaryFactory.Repositories; + +namespace ProjectConfectionaryFactory.Forms +{ + public partial class FormSupply : Form + { + private readonly ISupplyRepository _supplyRepository; + + private int? _supplyId; + + public int Id + { + set + { + try + { + var supply = _supplyRepository.ReadSupplyById(value); + if (supply == null) + { + throw new InvalidDataException(nameof(supply)); + } + numericUpDownWeight.Value = (decimal)supply.Weight; + checkBoxCompleted.Enabled = supply.Completed; + _supplyId = value; + } + catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при получении данных", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } + } + } + + public FormSupply(ISupplyRepository supplyRepository, ISupplierRepository supplierRepository, IComponentRepository componentRepository) + { + InitializeComponent(); + _supplyRepository = supplyRepository ?? throw new ArgumentNullException(nameof(supplyRepository)); + comboBoxSupplier.DataSource = supplierRepository.ReadSuppliers(); + comboBoxSupplier.DisplayMember = "Name"; + comboBoxSupplier.ValueMember = "Id"; + comboBoxComponent.DataSource = componentRepository.ReadComponents(); + comboBoxComponent.DisplayMember = "ComponentName"; + comboBoxComponent.ValueMember = "Id"; + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + try + { + if (comboBoxSupplier.SelectedIndex < 0 || comboBoxComponent.SelectedIndex < 0 || !checkBoxCompleted.Checked) + { + throw new Exception("Имеются незаполненные поля"); + } + if (_supplyId.HasValue) + { + _supplyRepository.UpdateSupply(CreateSupply(_supplyId.Value)); + } + else + { + _supplyRepository.CreateSupply(CreateSupply(0)); + } + Close(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при сохранении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) => Close(); + + private Supply CreateSupply(int id) => Supply.CreateEntity( + id, + (int)comboBoxSupplier.SelectedValue!, + (int)comboBoxComponent.SelectedValue!, + Convert.ToDouble(numericUpDownWeight.Value), + checkBoxCompleted.Checked); + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupply.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.Designer.cs new file mode 100644 index 0000000..e32340d --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.Designer.cs @@ -0,0 +1,122 @@ +namespace ProjectConfectionaryFactory.Forms +{ + partial class FormSupplys + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridViewData = new DataGridView(); + buttonUpdate = new Button(); + buttonDelete = new Button(); + buttonAdd = new Button(); + panel1 = new Panel(); + ((System.ComponentModel.ISupportInitialize)dataGridViewData).BeginInit(); + panel1.SuspendLayout(); + SuspendLayout(); + // + // dataGridViewData + // + dataGridViewData.AllowUserToAddRows = false; + dataGridViewData.AllowUserToDeleteRows = false; + dataGridViewData.AllowUserToResizeColumns = false; + dataGridViewData.AllowUserToResizeRows = false; + dataGridViewData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridViewData.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridViewData.Dock = DockStyle.Fill; + dataGridViewData.Location = new Point(0, 0); + dataGridViewData.MultiSelect = false; + dataGridViewData.Name = "dataGridViewData"; + dataGridViewData.ReadOnly = true; + dataGridViewData.RowHeadersVisible = false; + dataGridViewData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridViewData.Size = new Size(709, 450); + dataGridViewData.TabIndex = 7; + // + // buttonUpdate + // + buttonUpdate.BackgroundImage = Properties.Resources.Update; + buttonUpdate.BackgroundImageLayout = ImageLayout.Stretch; + buttonUpdate.Location = new Point(14, 83); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(65, 65); + buttonUpdate.TabIndex = 1; + buttonUpdate.UseVisualStyleBackColor = true; + // + // buttonDelete + // + buttonDelete.BackgroundImage = Properties.Resources.Delete; + buttonDelete.BackgroundImageLayout = ImageLayout.Stretch; + buttonDelete.Location = new Point(14, 154); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(65, 65); + buttonDelete.TabIndex = 1; + buttonDelete.UseVisualStyleBackColor = true; + // + // buttonAdd + // + buttonAdd.BackgroundImage = Properties.Resources.Add; + buttonAdd.BackgroundImageLayout = ImageLayout.Stretch; + buttonAdd.Location = new Point(14, 12); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(65, 65); + buttonAdd.TabIndex = 0; + buttonAdd.UseVisualStyleBackColor = true; + // + // panel1 + // + panel1.Controls.Add(buttonUpdate); + panel1.Controls.Add(buttonDelete); + panel1.Controls.Add(buttonAdd); + panel1.Dock = DockStyle.Right; + panel1.Location = new Point(709, 0); + panel1.Name = "panel1"; + panel1.Size = new Size(91, 450); + panel1.TabIndex = 6; + // + // FormSupplys + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Controls.Add(dataGridViewData); + Controls.Add(panel1); + Name = "FormSupplys"; + StartPosition = FormStartPosition.CenterParent; + Text = "FormSupplys"; + ((System.ComponentModel.ISupportInitialize)dataGridViewData).EndInit(); + panel1.ResumeLayout(false); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridViewData; + private Button buttonUpdate; + private Button buttonDelete; + private Button buttonAdd; + private Panel panel1; + } +} \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.cs new file mode 100644 index 0000000..1bfefee --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.cs @@ -0,0 +1,80 @@ +using ProjectConfectionaryFactory.Repositories; +using Unity; + +namespace ProjectConfectionaryFactory.Forms +{ + public partial class FormSupplys : Form + { + private readonly IUnityContainer _container; + private readonly ISupplyRepository _supplyRepository; + public FormSupplys(IUnityContainer container, ISupplyRepository supplyRepository) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + _supplyRepository = supplyRepository ?? throw new ArgumentNullException(nameof(supplyRepository)); + } + private void FormSupplys_Load(object sender, EventArgs e) + { + try + { + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при загрузке", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonAdd_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonUpdate_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) { return; } + try + { + var form = _container.Resolve(); + form.Id = findId; + form.ShowDialog(); + LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при изменении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonDelete_Click(object sender, EventArgs e) + { + if (!TryGetIdentifierFromSelectedRow(out var findId)) { return; } + if (MessageBox.Show("Удалить запись?", "Удаление", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; } + try + { + _supplyRepository.DeleteSupply(findId); LoadList(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void LoadList() => dataGridViewData.DataSource = _supplyRepository.ReadSupplys(); + private bool TryGetIdentifierFromSelectedRow(out int id) + { + id = 0; + if (dataGridViewData.SelectedRows.Count < 1) + { + MessageBox.Show("Нет выбранной записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + id = Convert.ToInt32(dataGridViewData.SelectedRows[0].Cells["Id"].Value); + return true; + } + } +} diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.resx new file mode 100644 index 0000000..8b2ff64 --- /dev/null +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Forms/FormSupplys.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/ProjectConfectionaryFactory.csproj b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/ProjectConfectionaryFactory.csproj index 6734a77..accbdf0 100644 --- a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/ProjectConfectionaryFactory.csproj +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/ProjectConfectionaryFactory.csproj @@ -27,8 +27,4 @@ - - - - \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Properties/Resources.Designer.cs b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Properties/Resources.Designer.cs index 285e3dd..b217fd3 100644 --- a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Properties/Resources.Designer.cs +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Properties/Resources.Designer.cs @@ -60,6 +60,16 @@ namespace ProjectConfectionaryFactory.Properties { } } + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Add { + get { + object obj = ResourceManager.GetObject("Add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Поиск локализованного ресурса типа System.Drawing.Bitmap. /// @@ -69,5 +79,25 @@ namespace ProjectConfectionaryFactory.Properties { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Delete { + get { + object obj = ResourceManager.GetObject("Delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Поиск локализованного ресурса типа System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Update { + get { + object obj = ResourceManager.GetObject("Update", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Properties/Resources.resx b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Properties/Resources.resx index cbb684f..d48d7ba 100644 --- a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Properties/Resources.resx +++ b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Properties/Resources.resx @@ -118,7 +118,16 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\Delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\Croissant.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Update.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Resources/Add.png b/ProjectConfectionaryFactory/ProjectConfectionaryFactory/Resources/Add.png new file mode 100644 index 0000000000000000000000000000000000000000..a1722f1a2396885f942a19ae50c19aa08cdd3a72 GIT binary patch literal 13400 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�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 literal 0 HcmV?d00001