Мы сидим у разбитых корыт

И гадаем на розе ветров
А, когда приходит время вставать
Мы сидим, мы ждём
Играй
Невесёлая песня моя
(Почти готово, осталось с таблицей и диаграммой разобраться. Я на ушел на передышку)
This commit is contained in:
Никита Волков 2024-10-28 23:29:48 +04:00
parent 0bf36059e1
commit 36513dcb02
11 changed files with 666 additions and 103 deletions

View File

@ -28,12 +28,146 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
this.components = new System.ComponentModel.Container(); components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; menuStrip = new MenuStrip();
this.ClientSize = new System.Drawing.Size(800, 450); заказыToolStripMenuItem = new ToolStripMenuItem();
this.Text = "FormMain"; создатьToolStripMenuItem = new ToolStripMenuItem();
редактироватьToolStripMenuItem = new ToolStripMenuItem();
удалитьToolStripMenuItem = new ToolStripMenuItem();
отчётыToolStripMenuItem = new ToolStripMenuItem();
документToolStripMenuItem = new ToolStripMenuItem();
документСТаблицейToolStripMenuItem = new ToolStripMenuItem();
документСДиаграммойToolStripMenuItem = new ToolStripMenuItem();
выбранныеТоварыToolStripMenuItem = new ToolStripMenuItem();
controlDataTable = new ControlsLibraryNet60.Data.ControlDataTableTable();
excelImagesComponent = new WinFormsLibraryVolkov.NonVisualComponents.ExcelImagesComponent(components);
componentHistogramToPdf = new FormLibrary.ComponentHistogramToPdf(components);
componentDocumentWithTableMultiHeaderWord = new ComponentsLibraryNet60.DocumentWithTable.ComponentDocumentWithTableMultiHeaderWord(components);
menuStrip.SuspendLayout();
SuspendLayout();
//
// menuStrip
//
menuStrip.ImageScalingSize = new Size(18, 18);
menuStrip.Items.AddRange(new ToolStripItem[] { заказыToolStripMenuItem, отчётыToolStripMenuItem, выбранныеТоварыToolStripMenuItem });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(800, 27);
menuStrip.TabIndex = 0;
menuStrip.Text = "menuStrip";
//
// заказыToolStripMenuItem
//
заказыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { создатьToolStripMenuItem, редактироватьToolStripMenuItem, удалитьToolStripMenuItem });
заказыToolStripMenuItem.Name = аказыToolStripMenuItem";
заказыToolStripMenuItem.Size = new Size(68, 23);
заказыToolStripMenuItem.Text = "Заказы";
//
// создатьToolStripMenuItem
//
создатьToolStripMenuItem.Name = "создатьToolStripMenuItem";
создатьToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.A;
создатьToolStripMenuItem.Size = new Size(231, 24);
создатьToolStripMenuItem.Text = "Создать";
создатьToolStripMenuItem.Click += создатьToolStripMenuItem_Click;
//
// редактироватьToolStripMenuItem
//
редактироватьToolStripMenuItem.Name = "редактироватьToolStripMenuItem";
редактироватьToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.U;
редактироватьToolStripMenuItem.Size = new Size(231, 24);
редактироватьToolStripMenuItem.Text = "Редактировать";
редактироватьToolStripMenuItem.Click += редактироватьToolStripMenuItem_Click;
//
// удалитьToolStripMenuItem
//
удалитьToolStripMenuItem.Name = "удалитьToolStripMenuItem";
удалитьToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.D;
удалитьToolStripMenuItem.Size = new Size(231, 24);
удалитьToolStripMenuItem.Text = "Удалить";
удалитьToolStripMenuItem.Click += удалитьToolStripMenuItem_Click;
//
// отчётыToolStripMenuItem
//
отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { документToolStripMenuItem, документСТаблицейToolStripMenuItem, документСДиаграммойToolStripMenuItem });
отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem";
отчётыToolStripMenuItem.Size = new Size(71, 23);
отчётыToolStripMenuItem.Text = "Отчёты";
//
// документToolStripMenuItem
//
документToolStripMenuItem.Name = окументToolStripMenuItem";
документToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.S;
документToolStripMenuItem.Size = new Size(358, 24);
документToolStripMenuItem.Text = "Документ с простой таблицей";
документToolStripMenuItem.Click += документToolStripMenuItem_Click;
//
// документСТаблицейToolStripMenuItem
//
документСТаблицейToolStripMenuItem.Name = окументСТаблицейToolStripMenuItem";
документСТаблицейToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.T;
документСТаблицейToolStripMenuItem.Size = new Size(358, 24);
документСТаблицейToolStripMenuItem.Text = "Отчет по всем заказам";
документСТаблицейToolStripMenuItem.Click += документСТаблицейToolStripMenuItem_Click;
//
// документСДиаграммойToolStripMenuItem
//
документСДиаграммойToolStripMenuItem.Name = окументСДиаграммойToolStripMenuItem";
документСДиаграммойToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.C;
документСДиаграммойToolStripMenuItem.Size = new Size(358, 24);
документСДиаграммойToolStripMenuItem.Text = "Документ с линейной диаграммой";
документСДиаграммойToolStripMenuItem.Click += документСДиаграммойToolStripMenuItem_Click;
//
// выбранныеТоварыToolStripMenuItem
//
выбранныеТоварыToolStripMenuItem.Name = "выбранныеТоварыToolStripMenuItem";
выбранныеТоварыToolStripMenuItem.Size = new Size(147, 23);
выбранныеТоварыToolStripMenuItem.Text = "Выбранные товары";
выбранныеТоварыToolStripMenuItem.Click += выбранныеТоварыToolStripMenuItem_Click;
//
// controlDataTable
//
controlDataTable.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
controlDataTable.AutoSize = true;
controlDataTable.Location = new Point(0, 31);
controlDataTable.Margin = new Padding(4, 4, 4, 4);
controlDataTable.Name = "controlDataTable";
controlDataTable.SelectedRowIndex = -1;
controlDataTable.Size = new Size(800, 420);
controlDataTable.TabIndex = 1;
//
// FormMain
//
AutoScaleDimensions = new SizeF(8F, 19F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 450);
Controls.Add(controlDataTable);
Controls.Add(menuStrip);
MainMenuStrip = menuStrip;
Name = "FormMain";
Text = "Заказы";
Load += FormMain_Load;
menuStrip.ResumeLayout(false);
menuStrip.PerformLayout();
ResumeLayout(false);
PerformLayout();
} }
#endregion #endregion
private MenuStrip menuStrip;
private ToolStripMenuItem заказыToolStripMenuItem;
private ToolStripMenuItem создатьToolStripMenuItem;
private ToolStripMenuItem редактироватьToolStripMenuItem;
private ToolStripMenuItem удалитьToolStripMenuItem;
private ToolStripMenuItem отчётыToolStripMenuItem;
private ToolStripMenuItem документToolStripMenuItem;
private ToolStripMenuItem документСТаблицейToolStripMenuItem;
private ToolStripMenuItem выбранныеТоварыToolStripMenuItem;
private ToolStripMenuItem документСДиаграммойToolStripMenuItem;
private ControlsLibraryNet60.Data.ControlDataTableTable controlDataTable;
private WinFormsLibraryVolkov.NonVisualComponents.ExcelImagesComponent excelImagesComponent;
private FormLibrary.ComponentHistogramToPdf componentHistogramToPdf;
private ComponentsLibraryNet60.DocumentWithTable.ComponentDocumentWithTableMultiHeaderWord componentDocumentWithTableMultiHeaderWord;
} }
} }

View File

@ -12,31 +12,112 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using ControlsLibraryNet60.Models;
using Microsoft.EntityFrameworkCore.Diagnostics;
using WinFormsLibraryVolkov.NonVisualComponents;
using ComponentsLibraryNet60.Core;
using ComponentsLibraryNet60.DocumentWithTable;
using ComponentsLibraryNet60.Models;
namespace InternetShopOrdersApp namespace InternetShopOrdersApp
{ {
public partial class FormMain : Form public partial class FormMain : Form
{ {
private int? _id; private IOrderLogic _logic;
private readonly IOrderLogic _logic;
private readonly ISelectedItemLogic _selectedItemLogic;
private List<SelectedItemViewModel> _selectedItems;
private string? orderImage = null;
public int Id { set { Id = value; } } public FormMain(IOrderLogic logic)
public FormMain(IOrderLogic logic, ISelectedItemLogic selectedItemLogic)
{ {
InitializeComponent(); InitializeComponent();
_logic = logic; _logic = logic;
_selectedItemLogic = selectedItemLogic; controlDataTable.LoadColumns(new List<DataTableColumnConfig>
_selectedItems = new List<SelectedItemViewModel>(); {
new DataTableColumnConfig { ColumnHeader = "", PropertyName = "Id", Visible = false, Width = 10 },
new DataTableColumnConfig { ColumnHeader = "ФИО заказчика", PropertyName = "Fullname", Visible = true, Width = 200 },
new DataTableColumnConfig { ColumnHeader = "Выбранный товар", PropertyName = "SelectedItemName", Visible = true, Width = 200 },
new DataTableColumnConfig { ColumnHeader = "Электронная почта", PropertyName = "Email", Visible = true, Width = 200 },
});
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
} }
private void FormOrder_Load(object sender, EventArgs e) private void LoadData()
{ {
_selectedItems = _selectedItemLogic.ReadList(null); controlDataTable.Clear();
var orders = _logic.ReadList(null);
if (orders != null)
{
controlDataTable.AddTable(orders);
}
}
private void FormMain_Load(object sender, EventArgs e)
{
LoadData();
}
private void создатьToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormOrder));
if (service is FormOrder form)
{
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
private void редактироватьToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormOrder));
if (service is FormOrder form)
{
form.Id = controlDataTable.GetSelectedObject<OrderViewModel>().Id;
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
private void удалитьToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Удалить запись?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
if (_logic.Delete(new OrderBindingModel { Id = controlDataTable.GetSelectedObject<OrderViewModel>().Id }))
{
LoadData();
}
}
}
private void документToolStripMenuItem_Click(object sender, EventArgs e)
{
List<string> orderImages = new List<string>();
foreach (var order in _logic.ReadList(null))
{
orderImages.Add(order.OrderImage);
}
string path = AppDomain.CurrentDomain.BaseDirectory + "Фотокарточки заказов с интернет-магазина.xlsx";
if (excelImagesComponent.createWithImages(new ExcelImageInfo(path, "Фотокарточки заказов", orderImages.ToArray()))) MessageBox.Show("Документ был создан");
}
private void документСТаблицейToolStripMenuItem_Click(object sender, EventArgs e)
{
string path = AppDomain.CurrentDomain.BaseDirectory + "Отчет по всем заказам.docx";
}
private void документСДиаграммойToolStripMenuItem_Click(object sender, EventArgs e)
{
string path = AppDomain.CurrentDomain.BaseDirectory + "Гистограмма товаров.pdf";
}
private void выбранныеТоварыToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormSelectedItems));
if (service is FormSelectedItems form)
{
form.ShowDialog();
}
} }
} }
} }

View File

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

View File

@ -28,12 +28,136 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
this.components = new System.ComponentModel.Container(); labelFIO = new Label();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; textBoxFIO = new TextBox();
this.ClientSize = new System.Drawing.Size(800, 450); labelMail = new Label();
this.Text = "FormOrder"; labelSelectedItem = new Label();
customSelectedCheckedListBox = new WinFormsLibraryVolkov.CustomSelectedCheckedListBox();
buttonOrderPic = new Button();
buttonCancel = new Button();
buttonSave = new Button();
openFileDialog = new OpenFileDialog();
controlInputRegexEmail = new ControlsLibraryNet60.Input.ControlInputRegexEmail();
SuspendLayout();
//
// labelFIO
//
labelFIO.AutoSize = true;
labelFIO.Location = new Point(12, 9);
labelFIO.Name = "labelFIO";
labelFIO.Size = new Size(107, 19);
labelFIO.TabIndex = 0;
labelFIO.Text = "ФИО заказчика";
//
// textBoxFIO
//
textBoxFIO.Location = new Point(12, 31);
textBoxFIO.Name = "textBoxFIO";
textBoxFIO.Size = new Size(471, 26);
textBoxFIO.TabIndex = 1;
//
// labelMail
//
labelMail.AutoSize = true;
labelMail.Location = new Point(12, 228);
labelMail.Name = "labelMail";
labelMail.Size = new Size(132, 19);
labelMail.TabIndex = 2;
labelMail.Text = "Электронная почта";
//
// labelSelectedItem
//
labelSelectedItem.AutoSize = true;
labelSelectedItem.Location = new Point(12, 79);
labelSelectedItem.Name = "labelSelectedItem";
labelSelectedItem.Size = new Size(124, 19);
labelSelectedItem.TabIndex = 4;
labelSelectedItem.Text = "Выбранный товар";
//
// customSelectedCheckedListBox
//
customSelectedCheckedListBox.Location = new Point(12, 102);
customSelectedCheckedListBox.Margin = new Padding(3, 4, 3, 4);
customSelectedCheckedListBox.Name = "customSelectedCheckedListBox";
customSelectedCheckedListBox.SelectedElement = "";
customSelectedCheckedListBox.Size = new Size(196, 122);
customSelectedCheckedListBox.TabIndex = 5;
//
// buttonOrderPic
//
buttonOrderPic.Location = new Point(12, 331);
buttonOrderPic.Name = "buttonOrderPic";
buttonOrderPic.Size = new Size(471, 26);
buttonOrderPic.TabIndex = 6;
buttonOrderPic.Text = "Выбрать фото заказа";
buttonOrderPic.UseVisualStyleBackColor = true;
buttonOrderPic.Click += buttonOrderPic_Click;
//
// buttonCancel
//
buttonCancel.Location = new Point(388, 412);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(95, 26);
buttonCancel.TabIndex = 7;
buttonCancel.Text = "Отменить";
buttonCancel.UseVisualStyleBackColor = true;
//
// buttonSave
//
buttonSave.Location = new Point(12, 412);
buttonSave.Name = "buttonSave";
buttonSave.Size = new Size(107, 26);
buttonSave.TabIndex = 8;
buttonSave.Text = "Сохранить";
buttonSave.UseVisualStyleBackColor = true;
buttonSave.Click += buttonSave_Click;
//
// openFileDialog
//
openFileDialog.FileName = "openFileDialog";
openFileDialog.Multiselect = true;
//
// controlInputRegexEmail
//
controlInputRegexEmail.Location = new Point(12, 253);
controlInputRegexEmail.Margin = new Padding(5, 6, 5, 6);
controlInputRegexEmail.Name = "controlInputRegexEmail";
controlInputRegexEmail.Pattern = "^([\\w\\d\\.\\-]+)@([\\w\\-]+)((\\.(\\w){2,3})+)$";
controlInputRegexEmail.Size = new Size(458, 33);
controlInputRegexEmail.TabIndex = 9;
controlInputRegexEmail.Value = "";
//
// FormOrder
//
AutoScaleDimensions = new SizeF(8F, 19F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(495, 450);
Controls.Add(controlInputRegexEmail);
Controls.Add(buttonSave);
Controls.Add(buttonCancel);
Controls.Add(buttonOrderPic);
Controls.Add(customSelectedCheckedListBox);
Controls.Add(labelSelectedItem);
Controls.Add(labelMail);
Controls.Add(textBoxFIO);
Controls.Add(labelFIO);
Name = "FormOrder";
Text = "Заказ";
ResumeLayout(false);
PerformLayout();
} }
#endregion #endregion
private Label labelFIO;
private TextBox textBoxFIO;
private Label labelMail;
private Label labelSelectedItem;
private WinFormsLibraryVolkov.CustomSelectedCheckedListBox customSelectedCheckedListBox;
private Button buttonOrderPic;
private Button buttonCancel;
private Button buttonSave;
private OpenFileDialog openFileDialog;
private ControlsLibraryNet60.Input.ControlInputRegexEmail controlInputRegexEmail;
} }
} }

View File

@ -1,4 +1,7 @@
using System; using InternetShopOrdersContracts.BindingModels;
using InternetShopOrdersContracts.BusinessLogicContracts;
using InternetShopOrdersContracts.ViewModels;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Data; using System.Data;
@ -12,9 +15,72 @@ namespace InternetShopOrdersApp
{ {
public partial class FormOrder : Form public partial class FormOrder : Form
{ {
public FormOrder() private int? _id;
private readonly IOrderLogic _logic;
private readonly ISelectedItemLogic _selectedItemLogic;
private List<SelectedItemViewModel> _selectedItems;
private string? orderImage = null;
public int Id { set { Id = value; } }
public FormOrder(IOrderLogic logic, ISelectedItemLogic selectedItemLogic)
{ {
InitializeComponent(); InitializeComponent();
_logic = logic;
_selectedItemLogic = selectedItemLogic;
_selectedItems = new List<SelectedItemViewModel>();
}
private void FormOrder_Load(object sender, EventArgs e)
{
_selectedItems = _selectedItemLogic.ReadList(null);
customSelectedCheckedListBox.PopulateList(_selectedItems.Select(x => x.Name).ToList());
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxFIO.Text))
{
MessageBox.Show("Заполните ФИО заказчика", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (customSelectedCheckedListBox.SelectedElement == null)
{
MessageBox.Show("Укажите выбранные товары", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (orderImage == null)
{
MessageBox.Show("Выберите фото заказа", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
try
{
var model = new OrderBindingModel
{
Id = _id ?? 0,
Fullname = textBoxFIO.Text,
OrderImage = orderImage,
SelectedItemId = _selectedItems.First(x => x.Name == customSelectedCheckedListBox.SelectedElement).Id,
Email = controlInputRegexEmail.Value,
};
var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model);
if (!operationResult)
{
throw new Exception("Возникла ошибка при сохранении. Дополнительная информация в логах");
}
MessageBox.Show("Сохранение прошло успешно", "Успешное сохранение", MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonOrderPic_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() != DialogResult.Cancel)
{
orderImage = openFileDialog.FileName;
}
} }
} }
} }

View File

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

View File

@ -28,12 +28,57 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
this.components = new System.ComponentModel.Container(); dataGridView = new DataGridView();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; NameCol = new DataGridViewTextBoxColumn();
this.ClientSize = new System.Drawing.Size(800, 450); Id = new DataGridViewTextBoxColumn();
this.Text = "FormSelectedItems"; ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
//
// dataGridView
//
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Columns.AddRange(new DataGridViewColumn[] { NameCol, Id });
dataGridView.Location = new Point(0, 0);
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 47;
dataGridView.Size = new Size(800, 356);
dataGridView.TabIndex = 0;
dataGridView.CellValueChanged += dataGridView_CellValueChanged;
dataGridView.UserDeletingRow += dataGridView_UserDeletingRow;
dataGridView.KeyUp += dataGridView_KeyUp;
//
// NameCol
//
NameCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
NameCol.HeaderText = "Название товара";
NameCol.MinimumWidth = 6;
NameCol.Name = "NameCol";
//
// Id
//
Id.HeaderText = "Id";
Id.MinimumWidth = 6;
Id.Name = "Id";
Id.Visible = false;
Id.Width = 125;
//
// FormSelectedItems
//
AutoScaleDimensions = new SizeF(8F, 19F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(800, 356);
Controls.Add(dataGridView);
Name = "FormSelectedItems";
Text = "Выбранные товары";
Load += FormSelectedItems_Load;
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
ResumeLayout(false);
} }
#endregion #endregion
private DataGridView dataGridView;
private DataGridViewTextBoxColumn NameCol;
private DataGridViewTextBoxColumn Id;
} }
} }

View File

@ -1,4 +1,7 @@
using System; using InternetShopOrdersContracts.BindingModels;
using InternetShopOrdersContracts.BusinessLogicContracts;
using Microsoft.EntityFrameworkCore.Diagnostics;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Data; using System.Data;
@ -12,9 +15,90 @@ namespace InternetShopOrdersApp
{ {
public partial class FormSelectedItems : Form public partial class FormSelectedItems : Form
{ {
public FormSelectedItems() private readonly ISelectedItemLogic _logic;
private bool loading = false;
public FormSelectedItems(ISelectedItemLogic logic)
{ {
InitializeComponent(); InitializeComponent();
_logic = logic;
}
private void LoadData()
{
loading = true;
try
{
var list = _logic.ReadList(null);
if (list != null)
{
foreach (var selectedItem in list)
{
int rowIndex = dataGridView.Rows.Add();
dataGridView.Rows[rowIndex].Cells[0].Value = selectedItem.Name;
dataGridView.Rows[rowIndex].Cells[1].Value = selectedItem.Id;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
loading = false;
}
}
private void FormSelectedItems_Load(object sender, EventArgs e)
{
LoadData();
}
private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (loading || e.RowIndex < 0 || e.ColumnIndex != 0) return;
if (dataGridView.Rows[e.RowIndex].Cells[1].Value != null && !string.IsNullOrEmpty(dataGridView.Rows[e.RowIndex].Cells[1].Value.ToString()))
{
var name = dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
if (name is null) return;
_logic.Update(new SelectedItemBindingModel { Id = Convert.ToInt32(dataGridView.Rows[e.RowIndex].Cells[1].Value), Name = name.ToString() });
}
else
{
var name = dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
if (name is null) return;
_logic.Create(new SelectedItemBindingModel { Id = 0, Name = name.ToString() });
int newInterestId = _logic.ReadList(null).ToList().Last().Id;
dataGridView.Rows[e.RowIndex].Cells[1].Value = newInterestId;
}
}
private void dataGridView_KeyUp(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Insert:
dataGridView.Rows.Add();
break;
}
}
private void deleteRows(DataGridViewSelectedRowCollection rows)
{
for (int i = 0; i < rows.Count; i++)
{
DataGridViewRow row = rows[i];
if (!_logic.Delete(new SelectedItemBindingModel { Id = Convert.ToInt32(row.Cells[1].Value) })) continue;
}
}
private void dataGridView_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
e.Cancel = true;
if (dataGridView.SelectedRows == null) return;
if (MessageBox.Show("Удалить записи?", "Подтвердите действие", MessageBoxButtons.YesNo) == DialogResult.No) return;
deleteRows(dataGridView.SelectedRows);
} }
} }
} }

View File

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

View File

@ -9,6 +9,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="ComponentsLibraryNet60" Version="1.0.0" />
<PackageReference Include="ControlsLibraryNet60" Version="1.0.0" />
<PackageReference Include="FormLibrary" Version="1.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
@ -20,6 +23,7 @@
<ProjectReference Include="..\InternetShopOrdersBusinessLogic\InternetShopOrdersBusinessLogic.csproj" /> <ProjectReference Include="..\InternetShopOrdersBusinessLogic\InternetShopOrdersBusinessLogic.csproj" />
<ProjectReference Include="..\InternetShopOrdersContracts\InternetShopOrdersContracts.csproj" /> <ProjectReference Include="..\InternetShopOrdersContracts\InternetShopOrdersContracts.csproj" />
<ProjectReference Include="..\InternetShopOrdersDatabaseImplement\InternetShopOrdersDatabaseImplement.csproj" /> <ProjectReference Include="..\InternetShopOrdersDatabaseImplement\InternetShopOrdersDatabaseImplement.csproj" />
<ProjectReference Include="..\WinFormsLibraryVolkov\WinFormsLibraryVolkov.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -5,6 +5,7 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms> <UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>