diff --git a/Library/CustomComponents/CustomComponents.csproj b/Library/CustomComponents/CustomComponents.csproj
index 844a19c..decd6b5 100644
--- a/Library/CustomComponents/CustomComponents.csproj
+++ b/Library/CustomComponents/CustomComponents.csproj
@@ -9,7 +9,9 @@
+
+
diff --git a/Library/CustomComponents/LegendPosition.cs b/Library/CustomComponents/LegendPosition.cs
deleted file mode 100644
index 6d087e5..0000000
--- a/Library/CustomComponents/LegendPosition.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace CustomComponents
-{
- public enum LegendPosition
- {
- Left,
- Top,
- Right,
- Botton,
- }
-}
\ No newline at end of file
diff --git a/Library/CustomComponents/LineChartConfig.cs b/Library/CustomComponents/LineChartConfig.cs
deleted file mode 100644
index 2de6ab0..0000000
--- a/Library/CustomComponents/LineChartConfig.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using Microsoft.Office.Interop.Excel;
-
-namespace CustomComponents
-{
- public class LineChartConfig
- {
- public string FilePath { get; set; }
-
- public string Header { get; set; }
-
- public string ChartTitle { get; set; }
-
- public Dictionary> Values { get; set; }
-
- public LegendPosition LegendPosition { get; set; }
- }
-}
\ No newline at end of file
diff --git a/Library/CustomComponents/MergeCells.cs b/Library/CustomComponents/MergeCells.cs
deleted file mode 100644
index efe8802..0000000
--- a/Library/CustomComponents/MergeCells.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace CustomComponents
-{
- public class MergeCells
- {
- public string Heading;
- public int[] CellIndexes;
-
- public MergeCells(string heading, int[] cellIndexes)
- {
- Heading = heading;
- CellIndexes = cellIndexes;
- }
- }
-}
\ No newline at end of file
diff --git a/Library/CustomComponents/BigTextComponent.Designer.cs b/Library/CustomComponents/MyNonVisualComponents/BigTextComponent.Designer.cs
similarity index 100%
rename from Library/CustomComponents/BigTextComponent.Designer.cs
rename to Library/CustomComponents/MyNonVisualComponents/BigTextComponent.Designer.cs
diff --git a/Library/CustomComponents/BigTextComponent.cs b/Library/CustomComponents/MyNonVisualComponents/BigTextComponent.cs
similarity index 100%
rename from Library/CustomComponents/BigTextComponent.cs
rename to Library/CustomComponents/MyNonVisualComponents/BigTextComponent.cs
diff --git a/Library/CustomComponents/DiagramComponent.Designer.cs b/Library/CustomComponents/MyNonVisualComponents/DiagramComponent.Designer.cs
similarity index 100%
rename from Library/CustomComponents/DiagramComponent.Designer.cs
rename to Library/CustomComponents/MyNonVisualComponents/DiagramComponent.Designer.cs
diff --git a/Library/CustomComponents/DiagramComponent.cs b/Library/CustomComponents/MyNonVisualComponents/DiagramComponent.cs
similarity index 97%
rename from Library/CustomComponents/DiagramComponent.cs
rename to Library/CustomComponents/MyNonVisualComponents/DiagramComponent.cs
index 31ded74..9453688 100644
--- a/Library/CustomComponents/DiagramComponent.cs
+++ b/Library/CustomComponents/MyNonVisualComponents/DiagramComponent.cs
@@ -1,11 +1,12 @@
using System.ComponentModel;
using System.IO;
using System.Runtime.InteropServices;
+using CustomComponents.MyNonVisualComponents;
using Excel = Microsoft.Office.Interop.Excel;
namespace CustomComponents
{
- public partial class DiagramComponent : Component
+ public partial class DiagramComponent : Component
{
public DiagramComponent()
{
diff --git a/Library/CustomComponents/MyNonVisualComponents/LegendPosition.cs b/Library/CustomComponents/MyNonVisualComponents/LegendPosition.cs
new file mode 100644
index 0000000..b62986a
--- /dev/null
+++ b/Library/CustomComponents/MyNonVisualComponents/LegendPosition.cs
@@ -0,0 +1,10 @@
+namespace CustomComponents.MyNonVisualComponents
+{
+ public enum LegendPosition
+ {
+ Left,
+ Top,
+ Right,
+ Botton,
+ }
+}
\ No newline at end of file
diff --git a/Library/CustomComponents/MyNonVisualComponents/LineChartConfig.cs b/Library/CustomComponents/MyNonVisualComponents/LineChartConfig.cs
new file mode 100644
index 0000000..737cad2
--- /dev/null
+++ b/Library/CustomComponents/MyNonVisualComponents/LineChartConfig.cs
@@ -0,0 +1,17 @@
+using Microsoft.Office.Interop.Excel;
+
+namespace CustomComponents.MyNonVisualComponents
+{
+ public class LineChartConfig
+ {
+ public string FilePath { get; set; }
+
+ public string Header { get; set; }
+
+ public string ChartTitle { get; set; }
+
+ public Dictionary> Values { get; set; }
+
+ public LegendPosition LegendPosition { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Library/CustomComponents/MyNonVisualComponents/MergeCells.cs b/Library/CustomComponents/MyNonVisualComponents/MergeCells.cs
new file mode 100644
index 0000000..8f9135b
--- /dev/null
+++ b/Library/CustomComponents/MyNonVisualComponents/MergeCells.cs
@@ -0,0 +1,14 @@
+namespace CustomComponents.MyNonVisualComponents
+{
+ public class MergeCells
+ {
+ public string Heading;
+ public int[] CellIndexes;
+
+ public MergeCells(string heading, int[] cellIndexes)
+ {
+ Heading = heading;
+ CellIndexes = cellIndexes;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Library/CustomComponents/TableComponent.Designer.cs b/Library/CustomComponents/MyNonVisualComponents/TableComponent.Designer.cs
similarity index 100%
rename from Library/CustomComponents/TableComponent.Designer.cs
rename to Library/CustomComponents/MyNonVisualComponents/TableComponent.Designer.cs
diff --git a/Library/CustomComponents/TableComponent.cs b/Library/CustomComponents/MyNonVisualComponents/TableComponent.cs
similarity index 98%
rename from Library/CustomComponents/TableComponent.cs
rename to Library/CustomComponents/MyNonVisualComponents/TableComponent.cs
index 8d35652..4065c98 100644
--- a/Library/CustomComponents/TableComponent.cs
+++ b/Library/CustomComponents/MyNonVisualComponents/TableComponent.cs
@@ -1,9 +1,10 @@
using System.ComponentModel;
+using CustomComponents.MyNonVisualComponents;
using Excel = Microsoft.Office.Interop.Excel;
namespace CustomComponents
{
- public partial class TableComponent : Component
+ public partial class TableComponent : Component
{
char[] colIndex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
diff --git a/Library/CustomComponents/DateTextBox.Designer.cs b/Library/CustomComponents/MyVisualComponents/DateTextBox.Designer.cs
similarity index 100%
rename from Library/CustomComponents/DateTextBox.Designer.cs
rename to Library/CustomComponents/MyVisualComponents/DateTextBox.Designer.cs
diff --git a/Library/CustomComponents/DateTextBox.cs b/Library/CustomComponents/MyVisualComponents/DateTextBox.cs
similarity index 100%
rename from Library/CustomComponents/DateTextBox.cs
rename to Library/CustomComponents/MyVisualComponents/DateTextBox.cs
diff --git a/Library/CustomComponents/DateTextBox.resx b/Library/CustomComponents/MyVisualComponents/DateTextBox.resx
similarity index 100%
rename from Library/CustomComponents/DateTextBox.resx
rename to Library/CustomComponents/MyVisualComponents/DateTextBox.resx
diff --git a/Library/CustomComponents/DropDownList.Designer.cs b/Library/CustomComponents/MyVisualComponents/DropDownList.Designer.cs
similarity index 100%
rename from Library/CustomComponents/DropDownList.Designer.cs
rename to Library/CustomComponents/MyVisualComponents/DropDownList.Designer.cs
diff --git a/Library/CustomComponents/DropDownList.cs b/Library/CustomComponents/MyVisualComponents/DropDownList.cs
similarity index 100%
rename from Library/CustomComponents/DropDownList.cs
rename to Library/CustomComponents/MyVisualComponents/DropDownList.cs
diff --git a/Library/CustomComponents/DropDownList.resx b/Library/CustomComponents/MyVisualComponents/DropDownList.resx
similarity index 100%
rename from Library/CustomComponents/DropDownList.resx
rename to Library/CustomComponents/MyVisualComponents/DropDownList.resx
diff --git a/Library/CustomComponents/ListBoxObjects.Designer.cs b/Library/CustomComponents/MyVisualComponents/ListBoxObjects.Designer.cs
similarity index 100%
rename from Library/CustomComponents/ListBoxObjects.Designer.cs
rename to Library/CustomComponents/MyVisualComponents/ListBoxObjects.Designer.cs
diff --git a/Library/CustomComponents/ListBoxObjects.cs b/Library/CustomComponents/MyVisualComponents/ListBoxObjects.cs
similarity index 100%
rename from Library/CustomComponents/ListBoxObjects.cs
rename to Library/CustomComponents/MyVisualComponents/ListBoxObjects.cs
diff --git a/Library/CustomComponents/ListBoxObjects.resx b/Library/CustomComponents/MyVisualComponents/ListBoxObjects.resx
similarity index 100%
rename from Library/CustomComponents/ListBoxObjects.resx
rename to Library/CustomComponents/MyVisualComponents/ListBoxObjects.resx
diff --git a/Library/CustomComponents/ZhelovanovNonVisualComponents/WordHistogramm.Designer.cs b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordHistogramm.Designer.cs
new file mode 100644
index 0000000..44cf84d
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordHistogramm.Designer.cs
@@ -0,0 +1,36 @@
+namespace KOP_Labs.NonVisualComponents
+{
+ partial class WordHistogramm
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovNonVisualComponents/WordHistogramm.cs b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordHistogramm.cs
new file mode 100644
index 0000000..59dafbd
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordHistogramm.cs
@@ -0,0 +1,88 @@
+using Aspose.Words;
+using Aspose.Words.Drawing;
+using Aspose.Words.Drawing.Charts;
+using KOP_Labs.Classes;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace KOP_Labs.NonVisualComponents
+{
+ public partial class WordHistogramm : Component
+ {
+ public WordHistogramm()
+ {
+ InitializeComponent();
+ }
+
+ public WordHistogramm(IContainer container)
+ {
+ container.Add(this);
+
+ InitializeComponent();
+ }
+
+ public void CreateHistogramm(MyHistogramm myHistogramm)
+ {
+ if(!CheckData(myHistogramm._dataList)) {
+ return;
+ }
+ Document doc = new Document();
+ DocumentBuilder builder = new DocumentBuilder(doc);
+
+ Aspose.Words.Font font = builder.Font;
+ font.Size = 14;
+ font.Bold = true;
+ font.Color = System.Drawing.Color.Black;
+ font.Name = "Times New Roman";
+
+ ParagraphFormat paragraphFormat = builder.ParagraphFormat;
+ paragraphFormat.FirstLineIndent = 8;
+ paragraphFormat.SpaceAfter = 24;
+ paragraphFormat.Alignment = ParagraphAlignment.Center;
+ paragraphFormat.KeepTogether = true;
+
+ builder.Writeln(myHistogramm._fileHeader);
+
+ Shape shape = builder.InsertChart(ChartType.Column, 500, 270);
+ Chart chart = shape.Chart;
+ chart.Title.Text = myHistogramm._fileHeader;
+ ChartSeriesCollection seriesColl = chart.Series;
+
+ seriesColl.Clear();
+
+ string[] categories = new string[] { myHistogramm._dataList[0]._nameData };
+
+
+ foreach (var data in myHistogramm._dataList)
+ {
+ seriesColl.Add(data._nameData, categories, new double[] { data._data });
+ }
+
+ ChartLegend legend = chart.Legend;
+
+ legend.Position = (LegendPosition)myHistogramm._legends;
+ legend.Overlay = true;
+
+
+ doc.Save(myHistogramm._filePath);
+
+ }
+ private bool CheckData(List data)
+ {
+ foreach (var _data in data)
+ {
+ if (string.IsNullOrEmpty(_data._data.ToString()))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableComponent.Designer.cs b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableComponent.Designer.cs
new file mode 100644
index 0000000..591b1a8
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableComponent.Designer.cs
@@ -0,0 +1,36 @@
+namespace KOP_Labs.NonVisualComponents
+{
+ partial class WordTableComponent
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableComponent.cs b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableComponent.cs
new file mode 100644
index 0000000..d5e9aaa
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableComponent.cs
@@ -0,0 +1,166 @@
+
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.ExtendedProperties;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Spreadsheet;
+using DocumentFormat.OpenXml.Wordprocessing;
+
+using KOP_Labs.Classes;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement;
+using Bold = DocumentFormat.OpenXml.Wordprocessing.Bold;
+using BottomBorder = DocumentFormat.OpenXml.Wordprocessing.BottomBorder;
+using LeftBorder = DocumentFormat.OpenXml.Wordprocessing.LeftBorder;
+using RightBorder = DocumentFormat.OpenXml.Wordprocessing.RightBorder;
+using Run = DocumentFormat.OpenXml.Wordprocessing.Run;
+using RunProperties = DocumentFormat.OpenXml.Wordprocessing.RunProperties;
+using Table = DocumentFormat.OpenXml.Wordprocessing.Table;
+using Text = DocumentFormat.OpenXml.Wordprocessing.Text;
+using TopBorder = DocumentFormat.OpenXml.Wordprocessing.TopBorder;
+
+namespace KOP_Labs.NonVisualComponents
+{
+ public partial class WordTableComponent : Component
+ {
+ private WordprocessingDocument? _wordDocument;
+
+ private Body? _docBody;
+
+ public WordTableComponent()
+ {
+ InitializeComponent();
+ }
+
+ public WordTableComponent(IContainer container)
+ {
+ container.Add(this);
+
+ InitializeComponent();
+ }
+
+ public void CreateDoc(MyTable myTable)
+ {
+ if(!CheckData(myTable._dataList)) return;
+ _wordDocument = WordprocessingDocument.Create(myTable._filePath, WordprocessingDocumentType.Document);
+ MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart();
+
+ mainPart.Document = new Document();
+ _docBody = mainPart.Document.AppendChild(new Body());
+ _wordDocument.Close();
+
+ using (WordprocessingDocument doc = WordprocessingDocument.Open(myTable._filePath, true))
+ {
+
+ var mainDoc = doc.MainDocumentPart.Document;
+ mainPart.Document = new Document();
+ Body body = mainPart.Document.AppendChild(new Body());
+
+ Paragraph headerParagraph = new Paragraph();
+
+ Run headerRun = new Run(new Text(myTable._fileHeader));
+ RunProperties runProperties = new RunProperties();
+ Bold bold = new Bold();
+ runProperties.Append(bold);
+
+ headerRun.Append(runProperties);
+
+ headerParagraph.Append(headerRun);
+
+ Table table = new Table();
+
+ TableProperties props = new TableProperties(
+ new TableBorders(
+ new TopBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new BottomBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new LeftBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new RightBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new InsideHorizontalBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new InsideVerticalBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ }
+ ));
+
+ table.AppendChild(props);
+ for (var i = 0; i < myTable._dataList.Count; i++)
+ {
+ var tr = new TableRow();
+
+ for (var j = 0; j < myTable._dataList[i].Length; j++)
+ {
+ var tc = new TableCell();
+
+ tc.Append(new TableCellProperties(new TableCellWidth
+ {
+ Type = TableWidthUnitValues.Dxa,
+ Width = "2000"
+ }
+ ));
+
+ tc.Append(new Paragraph(new Run(new Text(myTable._dataList[i][0, j]))));
+
+ tr.Append(tc);
+ }
+
+ table.Append(tr);
+ }
+
+
+
+ mainDoc.Body.Append(headerParagraph);
+ mainDoc.Body.Append(table);
+
+
+ mainDoc.Save();
+ }
+
+
+
+ }
+
+ private bool CheckData(List data)
+ {
+ for (int i = 0; i < data.Count; i++)
+ {
+ for (int j = 0; j < data[i].Length; j++)
+ {
+ if (data[i][0, j] == null) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+ }
+ }
+
+
\ No newline at end of file
diff --git a/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableHeaderComponent.Designer.cs b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableHeaderComponent.Designer.cs
new file mode 100644
index 0000000..c236ad5
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableHeaderComponent.Designer.cs
@@ -0,0 +1,36 @@
+namespace KOP_Labs.NonVisualComponents
+{
+ partial class WordTableHeaderComponent
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableHeaderComponent.cs b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableHeaderComponent.cs
new file mode 100644
index 0000000..856e7d0
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovNonVisualComponents/WordTableHeaderComponent.cs
@@ -0,0 +1,243 @@
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml;
+using KOP_Labs.Classes;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using DocumentFormat.OpenXml.Wordprocessing;
+
+namespace KOP_Labs.NonVisualComponents
+{
+ public partial class WordTableHeaderComponent : Component
+ {
+ private WordprocessingDocument? _wordDocument;
+
+ private Body? _docBody;
+ public WordTableHeaderComponent()
+ {
+ InitializeComponent();
+ }
+
+ public WordTableHeaderComponent(IContainer container)
+ {
+ container.Add(this);
+
+ InitializeComponent();
+ }
+
+ public void CreateDoc(MyTableWithHead myTable)
+ {
+ if (!CheckData(myTable._dataList)) return;
+ _wordDocument = WordprocessingDocument.Create(myTable._filePath, WordprocessingDocumentType.Document);
+ MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart();
+
+ mainPart.Document = new Document();
+
+ _docBody = mainPart.Document.AppendChild(new Body());
+ _wordDocument.Close();
+
+ using (WordprocessingDocument doc = WordprocessingDocument.Open(myTable._filePath, true))
+ {
+
+ var mainDoc = doc.MainDocumentPart.Document;
+ mainPart.Document = new Document();
+ Body body = mainPart.Document.AppendChild(new Body());
+
+
+ Paragraph headerParagraph = new Paragraph();
+ Run headerRun = new Run(new Text(myTable._fileHeader));
+
+ RunProperties runProperties = new RunProperties();
+ Bold bold = new Bold();
+ runProperties.Append(bold);
+ headerRun.Append(runProperties);
+
+ headerParagraph.Append(headerRun);
+
+
+ Table table = new Table();
+
+ TableProperties props = new TableProperties(
+ new TableBorders(
+ new TopBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new BottomBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new LeftBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new RightBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new InsideHorizontalBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ },
+ new InsideVerticalBorder
+ {
+ Val = new EnumValue(BorderValues.Single),
+ Size = 12
+ }
+ ));
+
+ table.AppendChild(props);
+
+ var _tr = new TableRow();
+
+ int indexHeaderHeigh = 0;
+ int indexHeaderWidth = 0;
+
+ foreach (var item in myTable._columnsSettings)
+ {
+ _tr.Append(new TableRowProperties(new TableRowHeight
+ {
+ Val = Convert.ToUInt32(myTable._heightRow[indexHeaderHeigh])
+ }));
+
+ var tc = new TableCell();
+
+ tc.Append(new TableCellProperties(new TableCellWidth
+ {
+ Type = TableWidthUnitValues.Dxa,
+ Width = myTable._widthCol[indexHeaderWidth].ToString(),
+ }
+ ));
+
+ if (string.IsNullOrEmpty(myTable._columnsSettings[indexHeaderWidth]._nameField) ||
+ string.IsNullOrEmpty(myTable._columnsSettings[indexHeaderWidth]._nameColumn))
+ {
+ return;
+ }
+
+ Paragraph tableHeader = new();
+
+ var Run = new Run();
+
+ var headerProperties = new RunProperties();
+
+ headerProperties.Append(new Bold());
+
+ Run.AppendChild(headerProperties);
+
+ Run.AppendChild(new Text(item.Value._nameColumn));
+
+ tableHeader.AppendChild(Run);
+
+ tc.Append(tableHeader);
+
+ _tr.Append(tc);
+
+ indexHeaderWidth++;
+ }
+
+ table.Append(_tr);
+
+
+ indexHeaderHeigh++;
+ indexHeaderWidth = 0;
+
+
+
+ for (int i = 0; i < myTable._dataList.Count; i++)
+ {
+ var tr = new TableRow();
+
+
+ foreach (var item in myTable._columnsSettings)
+ {
+ tr.Append(new TableRowProperties(new TableRowHeight
+ {
+ Val = Convert.ToUInt32(myTable._heightRow[indexHeaderHeigh])
+ }));
+
+ var tc = new TableCell();
+
+ tc.Append(new TableCellProperties(new TableCellWidth
+ {
+ Type = TableWidthUnitValues.Dxa,
+ Width = myTable._widthCol[indexHeaderWidth].ToString(),
+ }
+ ));
+
+
+ foreach (var val in myTable._dataList[i].GetType().GetProperties())
+ {
+ if (val.Name == item.Value._nameField)
+ {
+ var newParagraph = new Paragraph();
+
+ var newRun = new Run();
+
+ var runPropertiesInd = new RunProperties();
+
+ if (indexHeaderWidth == 0)
+ {
+ runPropertiesInd.Append(new Bold());
+ }
+
+ newRun.AppendChild(runPropertiesInd);
+
+ newRun.AppendChild(new Text(val.GetValue(myTable._dataList[i]).ToString()));
+
+ newParagraph.AppendChild(newRun);
+
+ tc.Append(newParagraph);
+
+ break;
+ }
+ }
+
+ tr.Append(tc);
+
+ indexHeaderWidth++;
+ }
+
+ indexHeaderWidth = 0;
+
+ table.Append(tr);
+ }
+
+
+
+ mainDoc.Body.Append(headerParagraph);
+
+ mainDoc.Body.Append(table);
+
+ mainDoc.Save();
+ }
+ }
+
+ private bool CheckData(List dataList)
+ {
+ foreach (var data in dataList)
+ {
+ foreach (var value in data.GetType().GetProperties())
+ {
+
+ if (string.IsNullOrEmpty(value.GetValue(data).ToString()))
+ {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovVisualComponents/BooksForm.Designer.cs b/Library/CustomComponents/ZhelovanovVisualComponents/BooksForm.Designer.cs
new file mode 100644
index 0000000..817f04c
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovVisualComponents/BooksForm.Designer.cs
@@ -0,0 +1,72 @@
+namespace KOP_Labs
+{
+ partial class BooksForm
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ groupBoxComponent = new GroupBox();
+ listBoxComponent = new ListBox();
+ groupBoxComponent.SuspendLayout();
+ SuspendLayout();
+ //
+ // groupBoxComponent
+ //
+ groupBoxComponent.Controls.Add(listBoxComponent);
+ groupBoxComponent.Location = new Point(19, 28);
+ groupBoxComponent.Name = "groupBoxComponent";
+ groupBoxComponent.Size = new Size(517, 183);
+ groupBoxComponent.TabIndex = 0;
+ groupBoxComponent.TabStop = false;
+ groupBoxComponent.Text = "Компонент";
+ //
+ // listBoxComponent
+ //
+ listBoxComponent.FormattingEnabled = true;
+ listBoxComponent.ItemHeight = 20;
+ listBoxComponent.Location = new Point(24, 35);
+ listBoxComponent.Name = "listBoxComponent";
+ listBoxComponent.Size = new Size(476, 124);
+ listBoxComponent.TabIndex = 0;
+ listBoxComponent.SelectedIndexChanged += listBoxComponent_SelectedIndexChanged;
+ //
+ // BooksForm
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(groupBoxComponent);
+ Name = "BooksForm";
+ Size = new Size(563, 258);
+ groupBoxComponent.ResumeLayout(false);
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private GroupBox groupBoxComponent;
+ private ListBox listBoxComponent;
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovVisualComponents/BooksForm.cs b/Library/CustomComponents/ZhelovanovVisualComponents/BooksForm.cs
new file mode 100644
index 0000000..d8fb97c
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovVisualComponents/BooksForm.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace KOP_Labs
+{
+ public partial class BooksForm : UserControl
+ {
+ public BooksForm()
+ {
+ InitializeComponent();
+ }
+
+ public string? SelectedValue
+ {
+ get
+ {
+ if (listBoxComponent.SelectedItem == null)
+ {
+ return null;
+ }
+ return listBoxComponent.SelectedItem.ToString()!;
+ }
+ set
+ {
+ if (value != null && !listBoxComponent.Items.Contains(value))
+ {
+ return;
+ }
+ listBoxComponent.SelectedItem = value;
+ }
+ }
+
+ private event EventHandler? _selectChanged;
+
+ public event EventHandler SelectChanged
+ {
+ add { _selectChanged += value; }
+ remove { _selectChanged -= value; }
+ }
+
+ public void FillValues(string values)
+ {
+ if (values == null || values.Length == 0)
+ {
+ return;
+ }
+ listBoxComponent.Items.Add(values);
+ }
+
+
+
+ public void ClearList()
+ {
+ listBoxComponent.Items.Clear();
+ }
+
+ private void listBoxComponent_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ _selectChanged?.Invoke(this, e);
+ }
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovVisualComponents/BooksForm.resx b/Library/CustomComponents/ZhelovanovVisualComponents/BooksForm.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovVisualComponents/BooksForm.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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/Library/CustomComponents/ZhelovanovVisualComponents/TableComponent.Designer.cs b/Library/CustomComponents/ZhelovanovVisualComponents/TableComponent.Designer.cs
new file mode 100644
index 0000000..8443de6
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovVisualComponents/TableComponent.Designer.cs
@@ -0,0 +1,63 @@
+namespace KOP_Labs
+{
+ partial class TableComponent
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ dataGridView = new DataGridView();
+ ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
+ SuspendLayout();
+ //
+ // dataGridView
+ //
+ dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView.Location = new Point(36, 29);
+ dataGridView.Name = "dataGridView";
+ dataGridView.RowHeadersWidth = 51;
+ dataGridView.RowTemplate.Height = 29;
+ dataGridView.Size = new Size(300, 188);
+ dataGridView.TabIndex = 0;
+ dataGridView.SelectionChanged += SelectionChanged;
+ dataGridView.RowHeadersVisible = false;
+ dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
+ //
+ // TableComponent
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(dataGridView);
+ Name = "TableComponent";
+ Size = new Size(542, 301);
+ ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private DataGridView dataGridView;
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovVisualComponents/TableComponent.cs b/Library/CustomComponents/ZhelovanovVisualComponents/TableComponent.cs
new file mode 100644
index 0000000..353ea81
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovVisualComponents/TableComponent.cs
@@ -0,0 +1,109 @@
+using KOP_Labs.Classes;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace KOP_Labs
+{
+ public partial class TableComponent : UserControl
+ {
+ public event EventHandler TaskHandler;
+ public int indexRow;
+ public int IndexRow
+ {
+ get
+ {
+ return indexRow;
+ }
+ set
+ {
+
+ indexRow = value;
+
+ }
+ }
+ public TableComponent()
+ {
+ InitializeComponent();
+ }
+ public void TableConfiguration(int countCol, List parameters)
+ {
+ if (parameters.Count != parameters.Count) { return; }
+ for (int i = 0; i < countCol; i++)
+ {
+ DataGridViewColumn column = new DataGridViewColumn();
+ column.Name = parameters[i]._name;
+ column.HeaderText = parameters[i]._header;
+ column.Width = parameters[i]._width;
+ column.Visible = parameters[i]._isVisual;
+ column.CellTemplate = new DataGridViewTextBoxCell();
+
+ dataGridView.Columns.Add(column);
+
+ }
+ }
+ public void ClearRows()
+ {
+ dataGridView.Rows.Clear();
+ }
+ public void AddRow(T newObject)
+ {
+ DataGridViewRow row = (DataGridViewRow)dataGridView.Rows[0].Clone();
+
+ foreach (var prop in newObject.GetType().GetProperties())
+ {
+ object value = prop.GetValue(newObject);
+
+ row.Cells[dataGridView.Columns[prop.Name].Index].Value = value;
+ }
+
+ dataGridView.Rows.Add(row);
+ }
+
+ public T GetSelectedObject() where T : new()
+ {
+ if (dataGridView.SelectedCells.Count == 0)
+ {
+ return new T();
+ }
+
+ int rowIndex = dataGridView.SelectedCells[0].RowIndex;
+ var targetObject = new T();
+ Type objectType = typeof(T);
+ PropertyInfo[] properties = objectType.GetProperties();
+
+ foreach (PropertyInfo property in properties)
+ {
+ DataGridViewCell selectedCell = dataGridView.Rows[rowIndex].Cells[property.Name];
+
+ object cellValue = selectedCell.Value;
+
+ if (cellValue != null && property.CanWrite)
+ {
+ object convertedValue = Convert.ChangeType(cellValue, property.PropertyType);
+ property.SetValue(targetObject, convertedValue);
+ }
+ }
+
+ return targetObject;
+ }
+ private void SelectionChanged(object sender, EventArgs e)
+ {
+ var element = sender as DataGridView;
+ if (dataGridView.SelectedRows.Count == 0)
+ {
+ return;
+ }
+ IndexRow = element.SelectedRows[0].Index;
+ TaskHandler?.Invoke(this, e);
+ }
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovVisualComponents/TableComponent.resx b/Library/CustomComponents/ZhelovanovVisualComponents/TableComponent.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovVisualComponents/TableComponent.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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/Library/CustomComponents/ZhelovanovVisualComponents/TextBoxComponent.Designer.cs b/Library/CustomComponents/ZhelovanovVisualComponents/TextBoxComponent.Designer.cs
new file mode 100644
index 0000000..b9b5f16
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovVisualComponents/TextBoxComponent.Designer.cs
@@ -0,0 +1,71 @@
+namespace KOP_Labs
+{
+ partial class TextBoxComponent
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Освободить все используемые ресурсы.
+ ///
+ /// истинно, если управляемый ресурс должен быть удален; иначе ложно.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Код, автоматически созданный конструктором компонентов
+
+ ///
+ /// Требуемый метод для поддержки конструктора — не изменяйте
+ /// содержимое этого метода с помощью редактора кода.
+ ///
+ private void InitializeComponent()
+ {
+ textBox = new TextBox();
+ checkBox1 = new CheckBox();
+ SuspendLayout();
+ //
+ // textBox
+ //
+ textBox.Location = new Point(141, 73);
+ textBox.Name = "textBox";
+ textBox.Size = new Size(125, 27);
+ textBox.TabIndex = 0;
+ textBox.TextChanged += TextBox_TextChanged;
+ //
+ // checkBox1
+ //
+ checkBox1.AutoSize = true;
+ checkBox1.Location = new Point(34, 73);
+ checkBox1.Name = "checkBox1";
+ checkBox1.Size = new Size(101, 24);
+ checkBox1.TabIndex = 1;
+ checkBox1.Text = "checkBox1";
+ checkBox1.UseVisualStyleBackColor = true;
+ checkBox1.CheckedChanged += CheckBox_CheckedChanged;
+ //
+ // TextBoxComponent
+ //
+ AutoScaleDimensions = new SizeF(8F, 20F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(checkBox1);
+ Controls.Add(textBox);
+ Name = "TextBoxComponent";
+ Size = new Size(439, 252);
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private TextBox textBox;
+ private CheckBox checkBox1;
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovVisualComponents/TextBoxComponent.cs b/Library/CustomComponents/ZhelovanovVisualComponents/TextBoxComponent.cs
new file mode 100644
index 0000000..4fa13fa
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovVisualComponents/TextBoxComponent.cs
@@ -0,0 +1,129 @@
+using DocumentFormat.OpenXml.Drawing.Diagrams;
+using KOP_Labs.Exceptions;
+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 static System.Windows.Forms.VisualStyles.VisualStyleElement.Button;
+
+namespace KOP_Labs
+{
+ public partial class TextBoxComponent : UserControl
+ {
+
+ public TextBoxComponent()
+ {
+ InitializeComponent();
+ Error = string.Empty;
+ }
+
+ public string Error { get; private set; }
+
+ public float? Value
+ {
+ get
+ {
+ if (checkBox1.Checked)
+ {
+ return null;
+ }
+ if (CheckValue())
+ {
+ return float.Parse(textBox.Text);
+ }
+
+ return null;
+
+
+ }
+ set
+ {
+
+
+ if (value == null)
+ {
+ checkBox1.Checked = true;
+ }
+ textBox.Text = value.ToString();
+
+
+ }
+ }
+ private EventHandler checkChanged;
+ public event EventHandler CheckChanged
+ {
+ add
+ {
+ checkChanged += value;
+ }
+ remove
+ {
+ checkChanged -= value;
+ }
+ }
+
+ private void CheckBox_CheckedChanged(object sender, EventArgs e)
+ {
+ Error = string.Empty;
+ if (checkBox1.Checked)
+ {
+ textBox.Enabled = false;
+ textBox.Text = string.Empty;
+ }
+ else
+ {
+ textBox.Enabled = true;
+
+ }
+ checkChanged?.Invoke(sender, e);
+ }
+
+ private EventHandler valueChanged;
+ public event EventHandler ValueChanged
+ {
+ add
+ {
+ valueChanged += value;
+ }
+ remove
+ {
+ valueChanged -= value;
+ }
+ }
+
+ public bool CheckValue()
+
+ {
+ Error = string.Empty;
+ if (!checkBox1.Checked && (string.IsNullOrEmpty(textBox.Text)))
+ {
+
+ Error = "Пусто!";
+ return false;
+
+ }
+ if (!checkBox1.Checked && !float.TryParse(textBox.Text, out float floatValue))
+ {
+
+ Error = "Не тот тип!";
+
+ return false;
+ }
+
+ return true;
+
+ }
+ private void TextBox_TextChanged(object sender, EventArgs e)
+ {
+
+ valueChanged?.Invoke(sender, e);
+ }
+
+
+ }
+}
diff --git a/Library/CustomComponents/ZhelovanovVisualComponents/TextBoxComponent.resx b/Library/CustomComponents/ZhelovanovVisualComponents/TextBoxComponent.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/Library/CustomComponents/ZhelovanovVisualComponents/TextBoxComponent.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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/Library/Library.sln b/Library/Library.sln
index 57ade83..06f6164 100644
--- a/Library/Library.sln
+++ b/Library/Library.sln
@@ -3,9 +3,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33530.505
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibraryView", "LibraryView\LibraryView.csproj", "{50CEADA7-BB8C-41AB-BAB5-F29DF48E581F}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LibraryView", "LibraryView\LibraryView.csproj", "{50CEADA7-BB8C-41AB-BAB5-F29DF48E581F}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomComponents", "CustomComponents\CustomComponents.csproj", "{F6B42349-8FB3-4D68-8757-D26DAD2F0992}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CustomComponents", "CustomComponents\CustomComponents.csproj", "{F6B42349-8FB3-4D68-8757-D26DAD2F0992}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibraryBusinessLogic", "LibraryBusinessLogic\LibraryBusinessLogic.csproj", "{215533AD-E311-4527-B8F6-C9F3708FDA0B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibraryContracts", "LibraryContracts\LibraryContracts.csproj", "{26F921C2-4336-4123-ABC6-3916BF341224}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LibraryDatabaseImplement", "LibraryDatabaseImplement\LibraryDatabaseImplement.csproj", "{B0677916-A9E7-48E6-961A-75C6ACFF2546}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -21,6 +27,18 @@ Global
{F6B42349-8FB3-4D68-8757-D26DAD2F0992}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F6B42349-8FB3-4D68-8757-D26DAD2F0992}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F6B42349-8FB3-4D68-8757-D26DAD2F0992}.Release|Any CPU.Build.0 = Release|Any CPU
+ {215533AD-E311-4527-B8F6-C9F3708FDA0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {215533AD-E311-4527-B8F6-C9F3708FDA0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {215533AD-E311-4527-B8F6-C9F3708FDA0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {215533AD-E311-4527-B8F6-C9F3708FDA0B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {26F921C2-4336-4123-ABC6-3916BF341224}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {26F921C2-4336-4123-ABC6-3916BF341224}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {26F921C2-4336-4123-ABC6-3916BF341224}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {26F921C2-4336-4123-ABC6-3916BF341224}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B0677916-A9E7-48E6-961A-75C6ACFF2546}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B0677916-A9E7-48E6-961A-75C6ACFF2546}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B0677916-A9E7-48E6-961A-75C6ACFF2546}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B0677916-A9E7-48E6-961A-75C6ACFF2546}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Library/LibraryBusinessLogic/BusinessLogics/BookLogic.cs b/Library/LibraryBusinessLogic/BusinessLogics/BookLogic.cs
new file mode 100644
index 0000000..b1d41f7
--- /dev/null
+++ b/Library/LibraryBusinessLogic/BusinessLogics/BookLogic.cs
@@ -0,0 +1,60 @@
+using LibraryContracts.BusinessLogicsContracts;
+using LibraryContracts.StorageContracts;
+using LibraryContracts.BindingModels;
+using LibraryContracts.ViewModels;
+
+namespace LibraryBusinessLogic.BusinessLogics
+{
+ public class BookLogic : IBookLogic
+ {
+ private readonly IBookStorage _bookStorage;
+ public BookLogic(IBookStorage bookStorage)
+ {
+ _bookStorage = bookStorage;
+ }
+
+ public List Read(BookBindingModel model)
+ {
+ if (model == null)
+ {
+ return _bookStorage.GetFullList();
+ }
+ if (model.Id.HasValue)
+ {
+ return new List { _bookStorage.GetElement(model) };
+ }
+ return _bookStorage.GetFilteredList(model);
+ }
+
+ public void CreateOrUpdate(BookBindingModel model)
+ {
+ var element = _bookStorage.GetElement(
+ new BookBindingModel
+ {
+ Title = model.Title
+ });
+ if (element != null && element.Id != model.Id)
+ {
+ throw new Exception("Книга с таким названием уже существует");
+ }
+ if (model.Id.HasValue)
+ {
+ _bookStorage.Update(model);
+ }
+ else
+ {
+ _bookStorage.Insert(model);
+ }
+ }
+
+ public void Delete(BookBindingModel model)
+ {
+ var element = _bookStorage.GetElement(new BookBindingModel { Id = model.Id });
+ if (element == null)
+ {
+ throw new Exception("Книга не найдена");
+ }
+ _bookStorage.Delete(model);
+ }
+ }
+}
diff --git a/Library/LibraryBusinessLogic/BusinessLogics/GenreLogic.cs b/Library/LibraryBusinessLogic/BusinessLogics/GenreLogic.cs
new file mode 100644
index 0000000..e9b4432
--- /dev/null
+++ b/Library/LibraryBusinessLogic/BusinessLogics/GenreLogic.cs
@@ -0,0 +1,61 @@
+using LibraryContracts.BindingModels;
+using LibraryContracts.BusinessLogicsContracts;
+using LibraryContracts.StorageContracts;
+using LibraryContracts.ViewModels;
+
+namespace LibraryBusinessLogic.BusinessLogics
+{
+ public class GenreLogic : IGenreLogic
+ {
+ private readonly IGenreStorage _genreStorage;
+
+ public GenreLogic(IGenreStorage genreStorage)
+ {
+ _genreStorage = genreStorage;
+ }
+
+ public List Read(GenreBindingModel model)
+ {
+ if (model == null)
+ {
+ return _genreStorage.GetFullList();
+ }
+ if (model.Id.HasValue)
+ {
+ return new List { _genreStorage.GetElement(model) };
+ }
+ return _genreStorage.GetFilteredList(model);
+ }
+
+ public void CreateOrUpdate(GenreBindingModel model)
+ {
+ var element = _genreStorage.GetElement(
+ new GenreBindingModel
+ {
+ Name = model.Name
+ });
+ if (element != null && element.Id != model.Id)
+ {
+ throw new Exception("Такой жанр уже существует");
+ }
+ if (model.Id.HasValue)
+ {
+ _genreStorage.Update(model);
+ }
+ else
+ {
+ _genreStorage.Insert(model);
+ }
+ }
+
+ public void Delete(GenreBindingModel model)
+ {
+ var element = _genreStorage.GetElement(new GenreBindingModel { Id = model.Id });
+ if (element == null)
+ {
+ throw new Exception("Жанр не найден");
+ }
+ _genreStorage.Delete(model);
+ }
+ }
+}
diff --git a/Library/LibraryBusinessLogic/LibraryBusinessLogic.csproj b/Library/LibraryBusinessLogic/LibraryBusinessLogic.csproj
new file mode 100644
index 0000000..d6914e9
--- /dev/null
+++ b/Library/LibraryBusinessLogic/LibraryBusinessLogic.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/Library/LibraryContracts/BindingModels/BookBindingModel.cs b/Library/LibraryContracts/BindingModels/BookBindingModel.cs
new file mode 100644
index 0000000..f91c49f
--- /dev/null
+++ b/Library/LibraryContracts/BindingModels/BookBindingModel.cs
@@ -0,0 +1,15 @@
+namespace LibraryContracts.BindingModels
+{
+ public class BookBindingModel
+ {
+ public int? Id { get; set; }
+
+ public string Title { get; set; }
+
+ public string Description { get; set; }
+
+ public string Genre { get; set; }
+
+ public int? Cost { get; set; }
+ }
+}
diff --git a/Library/LibraryContracts/BindingModels/GenreBindingModel.cs b/Library/LibraryContracts/BindingModels/GenreBindingModel.cs
new file mode 100644
index 0000000..08a33ee
--- /dev/null
+++ b/Library/LibraryContracts/BindingModels/GenreBindingModel.cs
@@ -0,0 +1,8 @@
+namespace LibraryContracts.BindingModels
+{
+ public class GenreBindingModel
+ {
+ public int? Id { get; set; }
+ public string Name { get; set; }
+ }
+}
diff --git a/Library/LibraryContracts/BusinessLogicsContracts/IBookLogic.cs b/Library/LibraryContracts/BusinessLogicsContracts/IBookLogic.cs
new file mode 100644
index 0000000..c1e7dc3
--- /dev/null
+++ b/Library/LibraryContracts/BusinessLogicsContracts/IBookLogic.cs
@@ -0,0 +1,12 @@
+using LibraryContracts.BindingModels;
+using LibraryContracts.ViewModels;
+
+namespace LibraryContracts.BusinessLogicsContracts
+{
+ public interface IBookLogic
+ {
+ List Read(BookBindingModel model);
+ void CreateOrUpdate(BookBindingModel model);
+ void Delete(BookBindingModel model);
+ }
+}
diff --git a/Library/LibraryContracts/BusinessLogicsContracts/IGenreLogic.cs b/Library/LibraryContracts/BusinessLogicsContracts/IGenreLogic.cs
new file mode 100644
index 0000000..b2d9d43
--- /dev/null
+++ b/Library/LibraryContracts/BusinessLogicsContracts/IGenreLogic.cs
@@ -0,0 +1,12 @@
+using LibraryContracts.BindingModels;
+using LibraryContracts.ViewModels;
+
+namespace LibraryContracts.BusinessLogicsContracts
+{
+ public interface IGenreLogic
+ {
+ List Read(GenreBindingModel model);
+ void CreateOrUpdate(GenreBindingModel model);
+ void Delete(GenreBindingModel model);
+ }
+}
diff --git a/Library/LibraryContracts/LibraryContracts.csproj b/Library/LibraryContracts/LibraryContracts.csproj
new file mode 100644
index 0000000..132c02c
--- /dev/null
+++ b/Library/LibraryContracts/LibraryContracts.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
diff --git a/Library/LibraryContracts/StorageContracts/IBookStorage.cs b/Library/LibraryContracts/StorageContracts/IBookStorage.cs
new file mode 100644
index 0000000..d530edf
--- /dev/null
+++ b/Library/LibraryContracts/StorageContracts/IBookStorage.cs
@@ -0,0 +1,16 @@
+using LibraryContracts.BindingModels;
+using LibraryContracts.ViewModels;
+
+namespace LibraryContracts.StorageContracts
+{
+ public interface IBookStorage
+ {
+ List GetFullList();
+ List GetFilteredList(BookBindingModel model);
+ BookViewModel GetElement(BookBindingModel model);
+
+ void Insert(BookBindingModel model);
+ void Update(BookBindingModel model);
+ void Delete(BookBindingModel model);
+ }
+}
diff --git a/Library/LibraryContracts/StorageContracts/IGenreStorage.cs b/Library/LibraryContracts/StorageContracts/IGenreStorage.cs
new file mode 100644
index 0000000..c65ecba
--- /dev/null
+++ b/Library/LibraryContracts/StorageContracts/IGenreStorage.cs
@@ -0,0 +1,16 @@
+using LibraryContracts.BindingModels;
+using LibraryContracts.ViewModels;
+
+namespace LibraryContracts.StorageContracts
+{
+ public interface IGenreStorage
+ {
+ List GetFullList();
+ List GetFilteredList(GenreBindingModel model);
+ GenreViewModel GetElement(GenreBindingModel model);
+
+ void Insert(GenreBindingModel model);
+ void Update(GenreBindingModel model);
+ void Delete(GenreBindingModel model);
+ }
+}
diff --git a/Library/LibraryContracts/ViewModels/BookViewModel.cs b/Library/LibraryContracts/ViewModels/BookViewModel.cs
new file mode 100644
index 0000000..940e7db
--- /dev/null
+++ b/Library/LibraryContracts/ViewModels/BookViewModel.cs
@@ -0,0 +1,37 @@
+using System.ComponentModel;
+
+namespace LibraryContracts.ViewModels
+{
+ public class BookViewModel
+ {
+ public int? Id { get; set; }
+
+ [DisplayName("Название")]
+ public string Title { get; set; }
+
+ [DisplayName("Описание")]
+ public string Description { get; set; }
+
+ [DisplayName("Жанр")]
+ public string Genre { get; set; }
+
+ [DisplayName("Стоимость")]
+ public int? Cost { get; set; }
+
+ public string CostStr
+ {
+ set
+ {
+ if (Cost == 0) CostStr = "Бесплатная";
+ else if (Cost == null) CostStr = "Не указано";
+ else CostStr = value;
+ }
+ get
+ {
+ if (Cost == 0) return "Бесплатная";
+ else if (Cost == null) return "Не указано";
+ else return Cost.ToString();
+ }
+ }
+ }
+}
diff --git a/Library/LibraryContracts/ViewModels/GenreViewModel.cs b/Library/LibraryContracts/ViewModels/GenreViewModel.cs
new file mode 100644
index 0000000..d44eb61
--- /dev/null
+++ b/Library/LibraryContracts/ViewModels/GenreViewModel.cs
@@ -0,0 +1,9 @@
+namespace LibraryContracts.ViewModels
+{
+ public class GenreViewModel
+ {
+ public int? Id { get; set; }
+
+ public string Name { get; set; }
+ }
+}
diff --git a/Library/LibraryDatabaseImplement/Implements/BookStorage.cs b/Library/LibraryDatabaseImplement/Implements/BookStorage.cs
new file mode 100644
index 0000000..d78600a
--- /dev/null
+++ b/Library/LibraryDatabaseImplement/Implements/BookStorage.cs
@@ -0,0 +1,120 @@
+using LibraryContracts.BindingModels;
+using LibraryContracts.StorageContracts;
+using LibraryContracts.ViewModels;
+using LibraryDatabaseImplement.Models;
+
+namespace LibraryDatabaseImplement.Implements
+{
+ public class BookStorage : IBookStorage
+ {
+ public List GetFullList()
+ {
+ using (var context = new LibraryDatabase())
+ {
+ return context.Books
+ .ToList()
+ .Select(CreateModel)
+ .ToList();
+ }
+ }
+
+ public List GetFilteredList(BookBindingModel model)
+ {
+ var context = new LibraryDatabase();
+ return context.Books
+ .Where(book => book.Title.Contains(model.Title) && book.Genre.Contains(model.Genre))
+ .ToList()
+ .Select(CreateModel)
+ .ToList();
+ }
+
+ public BookViewModel GetElement(BookBindingModel model)
+ {
+ if (model == null)
+ {
+ return null;
+ }
+ using var context = new LibraryDatabase();
+ var book = context.Books
+ .ToList()
+ .FirstOrDefault(rec => rec.Title == model.Title || rec.Id == model.Id);
+ return book != null ? CreateModel(book) : null;
+ }
+
+ public void Insert(BookBindingModel model)
+ {
+ var context = new LibraryDatabase();
+ var transaction = context.Database.BeginTransaction();
+ try
+ {
+ context.Books.Add(CreateModel(model, new Book()));
+ context.SaveChanges();
+ transaction.Commit();
+ }
+ catch
+ {
+ transaction.Rollback();
+ throw;
+ }
+ }
+
+ public void Update(BookBindingModel model)
+ {
+ var context = new LibraryDatabase();
+ var transaction = context.Database.BeginTransaction();
+ try
+ {
+ var book = context.Books.FirstOrDefault(rec => rec.Id == model.Id);
+ if (book == null)
+ {
+ throw new Exception("Книга не найдена");
+ }
+ CreateModel(model, book);
+ context.SaveChanges();
+ transaction.Commit();
+ }
+ catch
+ {
+ transaction.Rollback();
+ throw;
+ }
+ }
+
+
+ public void Delete(BookBindingModel model)
+ {
+ var context = new LibraryDatabase();
+ var book = context.Books.FirstOrDefault(rec => rec.Id == model.Id);
+ if (book != null)
+ {
+ context.Books.Remove(book);
+ context.SaveChanges();
+ }
+ else
+ {
+ throw new Exception("Книга не найдена");
+ }
+ }
+
+ private static Book CreateModel(BookBindingModel model, Book book)
+ {
+ book.Title = model.Title;
+ book.Description = model.Description;
+ book.Genre = model.Genre;
+ book.Cost = model.Cost;
+ return book;
+ }
+
+ private BookViewModel CreateModel(Book book)
+ {
+ return new BookViewModel
+ {
+ Id = book.Id,
+ Title = book.Title,
+ Description = book.Description,
+ Genre = book.Genre,
+ Cost = book.Cost
+ };
+ }
+ }
+}
diff --git a/Library/LibraryDatabaseImplement/Implements/GenreStorage.cs b/Library/LibraryDatabaseImplement/Implements/GenreStorage.cs
new file mode 100644
index 0000000..5cc8f54
--- /dev/null
+++ b/Library/LibraryDatabaseImplement/Implements/GenreStorage.cs
@@ -0,0 +1,121 @@
+using LibraryContracts.BindingModels;
+using LibraryContracts.StorageContracts;
+using LibraryContracts.ViewModels;
+using LibraryDatabaseImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace LibraryDatabaseImplement.Implements
+{
+ public class GenreStorage : IGenreStorage
+ {
+ public List GetFullList()
+ {
+ using var context = new LibraryDatabase();
+ return context.Genres
+ .Select(CreateModel)
+ .ToList();
+ }
+
+ public List GetFilteredList(GenreBindingModel model)
+ {
+ if (model == null)
+ {
+ return null;
+ }
+ using var context = new LibraryDatabase();
+ return context.Genres
+ .Where(rec => rec.Name.Contains(model.Name))
+ .Select(CreateModel)
+ .ToList();
+ }
+
+ public GenreViewModel GetElement(GenreBindingModel model)
+ {
+ if (model == null)
+ {
+ return null;
+ }
+ using var context = new LibraryDatabase();
+
+ var genre = context.Genres
+ .ToList()
+ .FirstOrDefault(rec => rec.Id == model.Id || rec.Name == model.Name);
+ return genre != null ? CreateModel(genre) : null;
+
+ }
+
+ public void Insert(GenreBindingModel model)
+ {
+ var context = new LibraryDatabase();
+ var transaction = context.Database.BeginTransaction();
+ try
+ {
+ context.Genres.Add(CreateModel(model, new Genre()));
+ context.SaveChanges();
+ transaction.Commit();
+ }
+ catch
+ {
+ transaction.Rollback();
+ throw;
+ }
+ }
+
+ public void Update(GenreBindingModel model)
+ {
+ var context = new LibraryDatabase();
+ var transaction = context.Database.BeginTransaction();
+ try
+ {
+ var genre = context.Genres.FirstOrDefault(rec => rec.Id == model.Id);
+ if (genre == null)
+ {
+ throw new Exception("Жанр не найден");
+ }
+ CreateModel(model, genre);
+ context.SaveChanges();
+ transaction.Commit();
+ }
+ catch
+ {
+ transaction.Rollback();
+ throw;
+ }
+ }
+
+
+ public void Delete(GenreBindingModel model)
+ {
+ var context = new LibraryDatabase();
+ var shape = context.Genres.FirstOrDefault(rec => rec.Id == model.Id);
+ if (shape != null)
+ {
+ context.Genres.Remove(shape);
+ context.SaveChanges();
+ }
+ else
+ {
+ throw new Exception("Жанр не найден");
+ }
+ }
+
+ private static Genre CreateModel(GenreBindingModel model, Genre genre)
+ {
+ genre.Name = model.Name;
+ return genre;
+ }
+
+ private static GenreViewModel CreateModel(Genre genre)
+ {
+ return new GenreViewModel
+ {
+ Id = genre.Id,
+ Name = genre.Name
+ };
+ }
+ }
+}
diff --git a/Library/LibraryDatabaseImplement/LibraryDatabase.cs b/Library/LibraryDatabaseImplement/LibraryDatabase.cs
new file mode 100644
index 0000000..4412327
--- /dev/null
+++ b/Library/LibraryDatabaseImplement/LibraryDatabase.cs
@@ -0,0 +1,27 @@
+using LibraryDatabaseImplement.Models;
+using Microsoft.EntityFrameworkCore;
+
+namespace LibraryDatabaseImplement
+{
+ public class LibraryDatabase : DbContext
+ {
+ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
+ {
+ if (optionsBuilder.IsConfigured == false)
+ {
+ optionsBuilder.UseSqlServer(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=LibraryDatabase;Integrated Security=True;MultipleActiveResultSets=True; TrustServerCertificate=True");
+ }
+ base.OnConfiguring(optionsBuilder);
+ }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ modelBuilder.Entity().Property(m => m.Cost).IsRequired(false);
+ base.OnModelCreating(modelBuilder);
+ }
+
+ public virtual DbSet Books { set; get; }
+
+ public virtual DbSet Genres { set; get; }
+ }
+}
diff --git a/Library/LibraryDatabaseImplement/LibraryDatabaseImplement.csproj b/Library/LibraryDatabaseImplement/LibraryDatabaseImplement.csproj
new file mode 100644
index 0000000..d9c8514
--- /dev/null
+++ b/Library/LibraryDatabaseImplement/LibraryDatabaseImplement.csproj
@@ -0,0 +1,23 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
diff --git a/Library/LibraryDatabaseImplement/Migrations/20231116200005_InitialCreate.Designer.cs b/Library/LibraryDatabaseImplement/Migrations/20231116200005_InitialCreate.Designer.cs
new file mode 100644
index 0000000..0f7816f
--- /dev/null
+++ b/Library/LibraryDatabaseImplement/Migrations/20231116200005_InitialCreate.Designer.cs
@@ -0,0 +1,79 @@
+//
+using System;
+using LibraryDatabaseImplement;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace LibraryDatabaseImplement.Migrations
+{
+ [DbContext(typeof(LibraryDatabase))]
+ [Migration("20231116200005_InitialCreate")]
+ partial class InitialCreate
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.0")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("LibraryDatabaseImplement.Models.Book", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Cost")
+ .HasColumnType("int");
+
+ b.Property("CostStr")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Genre")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Books");
+ });
+
+ modelBuilder.Entity("LibraryDatabaseImplement.Models.Genre", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Genres");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Library/LibraryDatabaseImplement/Migrations/20231116200005_InitialCreate.cs b/Library/LibraryDatabaseImplement/Migrations/20231116200005_InitialCreate.cs
new file mode 100644
index 0000000..772cba9
--- /dev/null
+++ b/Library/LibraryDatabaseImplement/Migrations/20231116200005_InitialCreate.cs
@@ -0,0 +1,54 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace LibraryDatabaseImplement.Migrations
+{
+ ///
+ public partial class InitialCreate : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "Books",
+ columns: table => new
+ {
+ Id = table.Column(type: "int", nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ Title = table.Column(type: "nvarchar(max)", nullable: false),
+ Description = table.Column(type: "nvarchar(max)", nullable: false),
+ Genre = table.Column(type: "nvarchar(max)", nullable: false),
+ Cost = table.Column(type: "int", nullable: true),
+ CostStr = table.Column(type: "nvarchar(max)", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Books", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Genres",
+ columns: table => new
+ {
+ Id = table.Column(type: "int", nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ Name = table.Column(type: "nvarchar(max)", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Genres", x => x.Id);
+ });
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Books");
+
+ migrationBuilder.DropTable(
+ name: "Genres");
+ }
+ }
+}
diff --git a/Library/LibraryDatabaseImplement/Migrations/LibraryDatabaseModelSnapshot.cs b/Library/LibraryDatabaseImplement/Migrations/LibraryDatabaseModelSnapshot.cs
new file mode 100644
index 0000000..80770df
--- /dev/null
+++ b/Library/LibraryDatabaseImplement/Migrations/LibraryDatabaseModelSnapshot.cs
@@ -0,0 +1,76 @@
+//
+using System;
+using LibraryDatabaseImplement;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace LibraryDatabaseImplement.Migrations
+{
+ [DbContext(typeof(LibraryDatabase))]
+ partial class LibraryDatabaseModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.0")
+ .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+ SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+ modelBuilder.Entity("LibraryDatabaseImplement.Models.Book", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Cost")
+ .HasColumnType("int");
+
+ b.Property("CostStr")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Genre")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Books");
+ });
+
+ modelBuilder.Entity("LibraryDatabaseImplement.Models.Genre", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Genres");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Library/LibraryDatabaseImplement/Models/Book.cs b/Library/LibraryDatabaseImplement/Models/Book.cs
new file mode 100644
index 0000000..ce018fa
--- /dev/null
+++ b/Library/LibraryDatabaseImplement/Models/Book.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace LibraryDatabaseImplement.Models
+{
+ public class Book
+ {
+ public int Id { get; set; }
+
+ [Required]
+ public string Title { get; set; }
+
+ [Required]
+ public string Description { get; set; }
+
+ [Required]
+ public string Genre { get; set; }
+
+ [Required]
+ public int? Cost { get; set; }
+
+ public string CostStr
+ {
+ set { }
+ get
+ {
+ if (Cost == 0) return "Бесплатная";
+ else if (Cost == null) return "Не указано";
+ else return Cost.ToString();
+ }
+ }
+ }
+}
diff --git a/Library/LibraryDatabaseImplement/Models/Genre.cs b/Library/LibraryDatabaseImplement/Models/Genre.cs
new file mode 100644
index 0000000..cc08068
--- /dev/null
+++ b/Library/LibraryDatabaseImplement/Models/Genre.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace LibraryDatabaseImplement.Models
+{
+ public class Genre
+ {
+ public int Id { get; set; }
+
+ [Required]
+ public string Name { get; set; }
+ }
+}
diff --git a/Library/LibraryView/FormBook.Designer.cs b/Library/LibraryView/FormBook.Designer.cs
new file mode 100644
index 0000000..8c576c7
--- /dev/null
+++ b/Library/LibraryView/FormBook.Designer.cs
@@ -0,0 +1,167 @@
+namespace LibraryView
+{
+ partial class FormBook
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.label1 = new System.Windows.Forms.Label();
+ this.romanovaComboBoxGenre = new ComponentsLibrary.MyVisualComponents.RomanovaComboBox();
+ this.textBoxTitle = new System.Windows.Forms.TextBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.textBoxDescription = new System.Windows.Forms.TextBox();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.textBoxCost = new ComponentsLibrary.IstyukovVisualComponents.TextBoxModified();
+ this.buttonSave = new System.Windows.Forms.Button();
+ this.buttonClose = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(22, 21);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(121, 20);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Название книги";
+ //
+ // romanovaComboBoxGenre
+ //
+ this.romanovaComboBoxGenre.Location = new System.Drawing.Point(-3, 240);
+ this.romanovaComboBoxGenre.Name = "romanovaComboBoxGenre";
+ this.romanovaComboBoxGenre.SelectElement = "";
+ this.romanovaComboBoxGenre.Size = new System.Drawing.Size(259, 116);
+ this.romanovaComboBoxGenre.TabIndex = 1;
+ //
+ // textBoxTitle
+ //
+ this.textBoxTitle.Location = new System.Drawing.Point(22, 44);
+ this.textBoxTitle.Name = "textBoxTitle";
+ this.textBoxTitle.Size = new System.Drawing.Size(196, 27);
+ this.textBoxTitle.TabIndex = 2;
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.BackColor = System.Drawing.SystemColors.Control;
+ this.label2.Location = new System.Drawing.Point(20, 91);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(123, 20);
+ this.label2.TabIndex = 3;
+ this.label2.Text = "Описание книги";
+ //
+ // textBoxDescription
+ //
+ this.textBoxDescription.Location = new System.Drawing.Point(22, 114);
+ this.textBoxDescription.Multiline = true;
+ this.textBoxDescription.Name = "textBoxDescription";
+ this.textBoxDescription.Size = new System.Drawing.Size(290, 110);
+ this.textBoxDescription.TabIndex = 4;
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(22, 240);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(48, 20);
+ this.label3.TabIndex = 5;
+ this.label3.Text = "Жанр";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(22, 310);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(83, 20);
+ this.label4.TabIndex = 6;
+ this.label4.Text = "Стоимость";
+ //
+ // textBoxCost
+ //
+ this.textBoxCost.Location = new System.Drawing.Point(20, 333);
+ this.textBoxCost.Margin = new System.Windows.Forms.Padding(2, 3, 2, 3);
+ this.textBoxCost.Name = "textBoxCost";
+ this.textBoxCost.Size = new System.Drawing.Size(168, 84);
+ this.textBoxCost.TabIndex = 7;
+ //
+ // buttonSave
+ //
+ this.buttonSave.Location = new System.Drawing.Point(49, 435);
+ this.buttonSave.Name = "buttonSave";
+ this.buttonSave.Size = new System.Drawing.Size(94, 29);
+ this.buttonSave.TabIndex = 8;
+ this.buttonSave.Text = "Сохранить";
+ this.buttonSave.UseVisualStyleBackColor = true;
+ this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);
+ //
+ // buttonClose
+ //
+ this.buttonClose.Location = new System.Drawing.Point(162, 435);
+ this.buttonClose.Name = "buttonClose";
+ this.buttonClose.Size = new System.Drawing.Size(94, 29);
+ this.buttonClose.TabIndex = 9;
+ this.buttonClose.Text = "Отменить";
+ this.buttonClose.UseVisualStyleBackColor = true;
+ this.buttonClose.Click += new System.EventHandler(this.buttonClose_Click);
+ //
+ // FormBook
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(342, 477);
+ this.Controls.Add(this.buttonClose);
+ this.Controls.Add(this.buttonSave);
+ this.Controls.Add(this.textBoxCost);
+ this.Controls.Add(this.label4);
+ this.Controls.Add(this.label3);
+ this.Controls.Add(this.textBoxDescription);
+ this.Controls.Add(this.label2);
+ this.Controls.Add(this.textBoxTitle);
+ this.Controls.Add(this.romanovaComboBoxGenre);
+ this.Controls.Add(this.label1);
+ this.Name = "FormBook";
+ this.Text = "Книги";
+ this.Load += new System.EventHandler(this.FormBook_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private Label label1;
+ private CustomComponents.DropDownList MeComboBoxGenre;
+ private TextBox textBoxTitle;
+ private Label label2;
+ private TextBox textBoxDescription;
+ private Label label3;
+ private Label label4;
+ private CustomComponents.
+ private Button buttonSave;
+ private Button buttonClose;
+ }
+}
\ No newline at end of file
diff --git a/Library/LibraryView/FormBook.cs b/Library/LibraryView/FormBook.cs
new file mode 100644
index 0000000..6aad1cc
--- /dev/null
+++ b/Library/LibraryView/FormBook.cs
@@ -0,0 +1,128 @@
+using LibraryContracts.BindingModels;
+using LibraryContracts.BusinessLogicsContracts;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace LibraryView
+{
+ public partial class FormBook : Form
+ {
+ private readonly IBookLogic _bookLogic;
+ private readonly IGenreLogic _genreLogic;
+ public int Id { set { id = value; } }
+ private int? id;
+ public FormBook(IBookLogic bookLogic, IGenreLogic genreLogic)
+ {
+ _bookLogic = bookLogic;
+ _genreLogic = genreLogic;
+ InitializeComponent();
+ LoadGenries();
+ }
+
+ private void LoadGenries()
+ {
+ var genries = _genreLogic.Read(null);
+ foreach (var genre in genries)
+ {
+ romanovaComboBoxGenre.FillList(genre.Name);
+ }
+ }
+
+ private void FormBook_Load(object sender, EventArgs e)
+ {
+ if (id.HasValue)
+ {
+ try
+ {
+ var view = _bookLogic.Read(new BookBindingModel { Id = id })?[0];
+ if (view != null)
+ {
+ if (view.CostStr == "Не указано")
+ {
+ textBoxTitle.Text = view.Title;
+ textBoxDescription.Text = view.Description;
+ romanovaComboBoxGenre.SelectElement = view.Genre;
+ textBoxCost.Value = null;
+ }
+ else
+ {
+ textBoxTitle.Text = view.Title;
+ textBoxDescription.Text = view.Description;
+ romanovaComboBoxGenre.SelectElement = view.Genre;
+ textBoxCost.Value = view.Cost;
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+
+ private void buttonSave_Click(object sender, EventArgs e)
+ {
+ if (string.IsNullOrEmpty(textBoxTitle.Text))
+ {
+ MessageBox.Show("Заполните название книга", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ if (string.IsNullOrEmpty(textBoxDescription.Text))
+ {
+ MessageBox.Show("Заполните описание книги", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+
+ if (string.IsNullOrEmpty(romanovaComboBoxGenre.SelectElement.ToString()))
+ {
+ MessageBox.Show("Выберите жанр книги", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ int? cost = null;
+ if (textBoxCost.Value != null)
+ {
+ try
+ {
+ cost = Convert.ToInt32(textBoxCost.Value);
+ }
+ catch
+ {
+ MessageBox.Show("Стоимость должна быть целым числом", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ }
+ try
+ {
+ _bookLogic.CreateOrUpdate(new BookBindingModel
+ {
+ Id = id,
+ Title = textBoxTitle.Text,
+ Description = textBoxDescription.Text,
+ Genre = romanovaComboBoxGenre.SelectElement.ToString(),
+ Cost = cost
+ });
+ MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void buttonClose_Click(object sender, EventArgs e)
+ {
+ DialogResult = DialogResult.Cancel;
+ Close();
+ }
+ }
+}
diff --git a/Library/LibraryView/FormBook.resx b/Library/LibraryView/FormBook.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/Library/LibraryView/FormBook.resx
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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/Library/LibraryView/FormMain.Designer.cs b/Library/LibraryView/FormMain.Designer.cs
new file mode 100644
index 0000000..0300c41
--- /dev/null
+++ b/Library/LibraryView/FormMain.Designer.cs
@@ -0,0 +1,95 @@
+namespace LibraryView
+{
+ partial class FormMain
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ this.menuStrip = new System.Windows.Forms.MenuStrip();
+ this.справочникиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.sevaTreeView = new ComponentsLibrary.BasharinVisualComponents.SevaTreeView();
+ this.romanovaExcelDocument = new ComponentsLibrary.MyNotVisualComponents.RomanovaExcelDocument(this.components);
+ this.diagramTopdf1 = new ComponentsLibrary.BasharinNotVisualComponents.DiagramToPDF(this.components);
+ this.componentDocumentWithTableMultiHeaderWord = new ComponentsLibraryNet60.DocumentWithTable.ComponentDocumentWithTableMultiHeaderWord(this.components);
+ this.menuStrip.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // menuStrip
+ //
+ this.menuStrip.ImageScalingSize = new System.Drawing.Size(20, 20);
+ this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.справочникиToolStripMenuItem});
+ this.menuStrip.Location = new System.Drawing.Point(0, 0);
+ this.menuStrip.Name = "menuStrip";
+ this.menuStrip.Size = new System.Drawing.Size(694, 28);
+ this.menuStrip.TabIndex = 0;
+ this.menuStrip.Text = "menuStrip1";
+ //
+ // справочникиToolStripMenuItem
+ //
+ this.справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem";
+ this.справочникиToolStripMenuItem.Size = new System.Drawing.Size(117, 24);
+ this.справочникиToolStripMenuItem.Text = "Справочники";
+ //
+ // sevaTreeView
+ //
+ this.sevaTreeView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.sevaTreeView.Location = new System.Drawing.Point(0, 28);
+ this.sevaTreeView.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+ this.sevaTreeView.Name = "sevaTreeView";
+ this.sevaTreeView.SelectedNodeIndex = 0;
+ this.sevaTreeView.Size = new System.Drawing.Size(694, 354);
+ this.sevaTreeView.TabIndex = 1;
+ this.sevaTreeView.Load += new System.EventHandler(this.treeViewControl_Load);
+ //
+ // FormMain
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(694, 382);
+ this.Controls.Add(this.sevaTreeView);
+ this.Controls.Add(this.menuStrip);
+ this.MainMenuStrip = this.menuStrip;
+ this.Name = "FormMain";
+ this.Text = "Главная форма";
+ this.menuStrip.ResumeLayout(false);
+ this.menuStrip.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private MenuStrip menuStrip;
+ private ToolStripMenuItem справочникиToolStripMenuItem;
+ private ComponentsLibrary.BasharinVisualComponents.SevaTreeView sevaTreeView;
+ private ComponentsLibrary.MyNotVisualComponents.RomanovaExcelDocument romanovaExcelDocument;
+ private ComponentsLibrary.BasharinNotVisualComponents.DiagramToPDF diagramTopdf1;
+ private ComponentsLibraryNet60.DocumentWithTable.ComponentDocumentWithTableMultiHeaderWord componentDocumentWithTableMultiHeaderWord;
+ }
+}
\ No newline at end of file
diff --git a/Library/LibraryView/FormMain.cs b/Library/LibraryView/FormMain.cs
new file mode 100644
index 0000000..794800d
--- /dev/null
+++ b/Library/LibraryView/FormMain.cs
@@ -0,0 +1,307 @@
+using ComponentsLibrary.IstyukovNotVisualComponents;
+using ComponentsLibrary.MyUnvisualComponents;
+using ComponentsLibrary.MyUnvisualComponents.HelperModels;
+using ComponentsLibraryNet60.DocumentWithTable;
+using ComponentsLibraryNet60.Models;
+using LibraryContracts.BindingModels;
+using LibraryContracts.BusinessLogicsContracts;
+using LibraryDatabaseImplement.Models;
+using Microsoft.Office.Interop.Excel;
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using Unity;
+
+namespace LibraryView
+{
+ public partial class FormMain : Form
+ {
+ private ContextMenuStrip contextMenu = new ContextMenuStrip();
+ private readonly IBookLogic _bookLogic;
+ private readonly IGenreLogic _genreLogic;
+ public FormMain(IBookLogic bookLogic, IGenreLogic genreLogic)
+ {
+
+ InitializeComponent();
+
+ _bookLogic = bookLogic;
+ _genreLogic = genreLogic;
+
+ List hierarhy = new List();
+ hierarhy.Add("Genre");
+ hierarhy.Add("CostStr");
+ hierarhy.Add("Id");
+ hierarhy.Add("Title");
+
+ sevaTreeView.SetHierarhy(hierarhy);
+
+ // создаем элементы меню
+ ToolStripMenuItem addMenuGenre = new ToolStripMenuItem("Справочник");
+ ToolStripMenuItem addMenuItem = new ToolStripMenuItem("Добавить книгу");
+ ToolStripMenuItem updateMenuItem = new ToolStripMenuItem("Изменить книгу");
+ ToolStripMenuItem deleteMenuItem = new ToolStripMenuItem("Удалить книгу");
+ ToolStripMenuItem simpleDocMenuItem = new ToolStripMenuItem("Простой документ");
+ ToolStripMenuItem tableMenuItem = new ToolStripMenuItem("Таблица");
+ ToolStripMenuItem diagramMenuItem = new ToolStripMenuItem("Диаграмма");
+
+ // добавляем элементы в меню
+ contextMenu.Items.AddRange(new[] { addMenuGenre, addMenuItem, updateMenuItem, deleteMenuItem, simpleDocMenuItem, tableMenuItem, diagramMenuItem });
+
+ // ассоциируем контекстное меню с узлом дерева
+ sevaTreeView.ContextMenuStrip = contextMenu;
+
+ // устанавливаем обработчики событий для меню
+ addMenuGenre.Click += addGenreItem_Click;
+ addMenuItem.Click += addMenuItem_Click;
+ updateMenuItem.Click += updateMenuItem_Click;
+ deleteMenuItem.Click += deleteMenuItem_Click;
+ simpleDocMenuItem.Click += simpleDocMenuItem_Click;
+ tableMenuItem.Click += tableMenuItem_Click;
+ diagramMenuItem.Click += diagramDocMenuItem_Click;
+ }
+
+ private void treeViewControl_Load(object sender, EventArgs e)
+ {
+ LoadData();
+ }
+
+ private void LoadData()
+ {
+ sevaTreeView.Clear();
+ var books = _bookLogic.Read(null);
+ if (books != null)
+ {
+ foreach (var book in books)
+ {
+ if (book != null)
+ {
+ sevaTreeView.Add(book);
+ }
+ }
+ }
+ }
+
+ void addMenuItem_Click(object sender, EventArgs e)
+ {
+ var form = Program.Container.Resolve();
+ if (form.ShowDialog() == DialogResult.OK)
+ {
+ LoadData();
+ }
+ }
+
+ void addGenreItem_Click(object sender, EventArgs e)
+ {
+ var form = Program.Container.Resolve();
+ if (form.ShowDialog() == DialogResult.OK)
+ {
+ LoadData();
+ }
+ }
+
+ private void updateMenuItem_Click(object sender, EventArgs e)
+ {
+ var form = Program.Container.Resolve();
+ form.Id = Convert.ToInt32(sevaTreeView.GetSelectedValue().Id);
+ if (form.ShowDialog() == DialogResult.OK)
+ {
+ LoadData();
+ }
+ }
+
+ private void deleteMenuItem_Click(object sender, EventArgs e)
+ {
+ if (MessageBox.Show("Удалить запись", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ int id = Convert.ToInt32(sevaTreeView.GetSelectedValue().Id);
+ try
+ {
+ _bookLogic.Delete(new BookBindingModel { Id = id });
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ LoadData();
+ }
+ }
+
+ private void simpleDocMenuItem_Click(object sender, EventArgs e)
+ {
+ CreateExcelSimpleDoc();
+ }
+
+ private void tableMenuItem_Click(object sender, EventArgs e)
+ {
+ CreateWordTable();
+ }
+
+ private void diagramDocMenuItem_Click(object sender, EventArgs e)
+ {
+ CreatePdfDiagram();
+ }
+
+ protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
+ {
+ if (keyData == (Keys.Control | Keys.A))
+ {
+ addMenuItem_Click(null, null);
+ return true;
+ }
+
+ if (keyData == (Keys.Control | Keys.U))
+ {
+ updateMenuItem_Click(null, null);
+ return true;
+ }
+
+ if (keyData == (Keys.Control | Keys.D))
+ {
+ deleteMenuItem_Click(null, null);
+ return true;
+ }
+
+ if (keyData == (Keys.Control | Keys.S))
+ {
+ CreateExcelSimpleDoc();
+ return true;
+ }
+
+ if (keyData == (Keys.Control | Keys.T))
+ {
+ CreateWordTable();
+ return true;
+ }
+
+ if (keyData == (Keys.Control | Keys.C))
+ {
+ CreatePdfDiagram();
+ return true;
+ }
+
+ if (keyData == (Keys.Control | Keys.G))
+ {
+ addGenreItem_Click(null, null);
+ return true;
+ }
+
+ return base.ProcessCmdKey(ref msg, keyData);
+ }
+
+ private void CreateExcelSimpleDoc()
+ {
+ string dataSet = "";
+ var products = _bookLogic.Read(null);
+ if (products != null)
+ {
+ foreach (var product in products)
+ {
+ if (product.Cost == 0)
+ {
+ dataSet += product.Title + " " + product.Description + ";";
+ }
+ }
+
+ string[] data = dataSet.Split(';');
+ var sfd = new SaveFileDialog();
+ sfd.FileName = "D:\\Study\\3 course\\KOP\\file\\simpleDocProducts.xls";
+ sfd.Filter = "Excel files (*.xlsx)|*.xlsx";
+ if (sfd.ShowDialog() == DialogResult.OK)
+ {
+ if (data != null)
+ {
+ romanovaExcelDocument.CreateExcel(sfd.FileName, "Книги", data);
+ MessageBox.Show("Файл был создан успешно", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ {
+ MessageBox.Show("Файл не был создан", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+ }
+
+ private void CreatePdfDiagram()
+ {
+ Dictionary data = new Dictionary();
+ var books = _bookLogic.Read(null);
+ var genries = _genreLogic.Read(null);
+ if (books != null && genries != null)
+ {
+ foreach (var genre in genries)
+ {
+ int count = 0;
+ foreach (var book in books)
+ {
+ if (book.Cost == 0 && book.Genre.Equals(genre.Name))
+ {
+ count++;
+ }
+ }
+ data.Add(genre.Name, count);
+ }
+ var sfd = new SaveFileDialog();
+ sfd.FileName = "DiagramBook.pdf";
+ sfd.Filter = "Pdf files (*.pdf)|*.pdf";
+ if (sfd.ShowDialog() == DialogResult.OK)
+ {
+ diagramTopdf1.CreateDocument(sfd.FileName, "Бесплатные книги",
+ "Сколько бесплатных книг какого жанра", ComponentsLibrary.BasharinNotVisualComponents.Area.TOP, data);
+ MessageBox.Show("Файл был создан успешно", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ }
+
+ private void CreateWordTable()
+ {
+ var sfd = new SaveFileDialog();
+ sfd.FileName = "WordBooks.docx";
+ sfd.Filter = "Word files (*.docx)|*.docx";
+ var booksDB = _bookLogic.Read(null);
+ List books = new List();
+ foreach (var book in booksDB)
+ {
+ Book prod = new Book
+ {
+ Id = (int)book.Id,
+ Title = book.Title,
+ Description = book.Description,
+ Genre = book.Genre,
+ Cost = book.Cost
+ };
+ books.Add(prod);
+ }
+ if (sfd.ShowDialog() == DialogResult.OK)
+ {
+ componentDocumentWithTableMultiHeaderWord.CreateDoc(new ComponentDocumentWithTableHeaderDataConfig
+ {
+ FilePath = sfd.FileName,
+ Header = "Информация по всем книгам",
+ ColumnsRowsWidth = new List<(int, int)> { (5, 5), (10, 5), (10, 0), (5, 0), (7, 0) },
+ Headers = new List<(int ColumnIndex, int RowIndex, string Header, string PropertyName)>
+ {
+ (0, 0, "Id", "Id"),
+ (1, 0, "Название", "Title"),
+ (2, 0, "Описание", "Description"),
+ (3, 0, "Категория", "Genre"),
+ (4, 0, "Стоимость книг", "CostStr")
+ },
+ Data = books
+ });
+ MessageBox.Show("Файл был создан успешно", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+
+ public List getColumnsWidth(int count, int width)
+ {
+ List list = new List();
+
+ for (int i = 0; i < count; i++)
+ {
+ list.Add(width);
+ }
+ return list;
+ }
+ }
+}
+
diff --git a/Library/LibraryView/FormMain.resx b/Library/LibraryView/FormMain.resx
new file mode 100644
index 0000000..c4eca3a
--- /dev/null
+++ b/Library/LibraryView/FormMain.resx
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+ 144, 17
+
+
+ 370, 17
+
+
+ 527, 17
+
+
\ No newline at end of file
diff --git a/Library/LibraryView/FormManual.Designer.cs b/Library/LibraryView/FormManual.Designer.cs
new file mode 100644
index 0000000..b4658f2
--- /dev/null
+++ b/Library/LibraryView/FormManual.Designer.cs
@@ -0,0 +1,85 @@
+namespace LibraryView
+{
+ partial class FormManual
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.dataGridView = new System.Windows.Forms.DataGridView();
+ this.Id = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ this.NameGenre = new System.Windows.Forms.DataGridViewTextBoxColumn();
+ ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+ this.SuspendLayout();
+ //
+ // dataGridView
+ //
+ this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+ this.Id,
+ this.NameGenre});
+ this.dataGridView.Location = new System.Drawing.Point(1, 1);
+ this.dataGridView.Name = "dataGridView";
+ this.dataGridView.RowHeadersWidth = 51;
+ this.dataGridView.RowTemplate.Height = 29;
+ this.dataGridView.Size = new System.Drawing.Size(485, 330);
+ this.dataGridView.TabIndex = 0;
+ //
+ // Id
+ //
+ this.Id.HeaderText = "Id";
+ this.Id.MinimumWidth = 6;
+ this.Id.Name = "Id";
+ this.Id.Visible = false;
+ this.Id.Width = 125;
+ //
+ // NameGenre
+ //
+ this.NameGenre.HeaderText = "Жанр";
+ this.NameGenre.MinimumWidth = 6;
+ this.NameGenre.Name = "NameGenre";
+ this.NameGenre.Width = 200;
+ //
+ // FormManual
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(485, 343);
+ this.Controls.Add(this.dataGridView);
+ this.Name = "FormManual";
+ this.Text = "Справочник жанров";
+ this.Load += new System.EventHandler(this.FormManual_Load);
+ ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private DataGridView dataGridView;
+ private DataGridViewTextBoxColumn Id;
+ private DataGridViewTextBoxColumn NameGenre;
+ }
+}
\ No newline at end of file
diff --git a/Library/LibraryView/FormManual.cs b/Library/LibraryView/FormManual.cs
new file mode 100644
index 0000000..fb800b5
--- /dev/null
+++ b/Library/LibraryView/FormManual.cs
@@ -0,0 +1,113 @@
+using LibraryContracts.BindingModels;
+using LibraryContracts.BusinessLogicsContracts;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace LibraryView
+{
+ public partial class FormManual : Form
+ {
+ private readonly IGenreLogic _genreLogic;
+ public FormManual(IGenreLogic genreLogic)
+ {
+ _genreLogic = genreLogic;
+ InitializeComponent();
+ }
+
+ private void FormManual_Load(object sender, EventArgs e)
+ {
+ LoadData();
+ dataGridView.CellEndEdit += CellEndEdit;
+ }
+
+ private void LoadData()
+ {
+ var genries = _genreLogic.Read(null);
+ if (genries != null)
+ {
+ dataGridView.Rows.Clear();
+ foreach (var genre in genries)
+ {
+ dataGridView.Rows.Add(genre.Id, genre.Name);
+ }
+ }
+ }
+
+ private void CellEndEdit(object sender, EventArgs e)
+ {
+ if (dataGridView.CurrentCell.Value != null)
+ {
+ if (dataGridView.CurrentRow.Cells[0].Value == null)
+ {
+ _genreLogic.CreateOrUpdate(new GenreBindingModel
+ {
+ Name = dataGridView.CurrentCell.Value.ToString()
+ });
+ }
+ else
+ {
+ _genreLogic.CreateOrUpdate(new GenreBindingModel
+ {
+ Id = (int)dataGridView.CurrentRow.Cells[0].Value,
+ Name = dataGridView.CurrentCell.Value.ToString()
+ });
+ }
+ }
+ }
+
+ protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
+ {
+ DataGridViewRow row = new DataGridViewRow();
+ if (keyData == (Keys.Insert))
+ {
+ DataGridViewCell cell = dataGridView.Rows[dataGridView.NewRowIndex].Cells[1];
+ dataGridView.CurrentCell = cell;
+ dataGridView.BeginEdit(true);
+ return true;
+ }
+
+ if (keyData == (Keys.Enter))
+ {
+ dataGridView.EndEdit();
+ LoadData();
+ }
+
+ if (keyData == (Keys.Delete))
+ {
+ if (MessageBox.Show("Удалить запись", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ int? id = null;
+ try
+ {
+ id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value);
+ }
+ catch
+ {
+ MessageBox.Show("Чтобы удалить запись, нажмите на пустую ячейку слева от удаляемой записи", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ if (id != null)
+ {
+ try
+ {
+ _genreLogic.Delete(new GenreBindingModel { Id = id });
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ LoadData();
+ }
+ return true;
+ }
+ return base.ProcessCmdKey(ref msg, keyData);
+ }
+ }
+}
diff --git a/Library/LibraryView/FormManual.resx b/Library/LibraryView/FormManual.resx
new file mode 100644
index 0000000..a2146e0
--- /dev/null
+++ b/Library/LibraryView/FormManual.resx
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ True
+
+
+ True
+
+
\ No newline at end of file
diff --git a/Library/LibraryView/FormSecond.Designer.cs b/Library/LibraryView/FormSecond.Designer.cs
index 4b636c0..34966a5 100644
--- a/Library/LibraryView/FormSecond.Designer.cs
+++ b/Library/LibraryView/FormSecond.Designer.cs
@@ -33,6 +33,9 @@
buttonCreateExDoc = new Button();
buttonCreateTable = new Button();
buttonCreateDiagram = new Button();
+ pdfImages1 = new ViewComponents.NotVisualComponents.PdfImages(components);
+ pdfTable1 = new ViewComponents.NotVisualComponents.PdfTable(components);
+ pieChartpdf1 = new ViewComponents.NotVisualComponents.PieChartPDF(components);
SuspendLayout();
//
// buttonCreateExDoc
@@ -85,5 +88,8 @@
private Button buttonCreateExDoc;
private Button buttonCreateTable;
private Button buttonCreateDiagram;
+ private ViewComponents.NotVisualComponents.PdfImages pdfImages1;
+ private ViewComponents.NotVisualComponents.PdfTable pdfTable1;
+ private ViewComponents.NotVisualComponents.PieChartPDF pieChartpdf1;
}
}
\ No newline at end of file
diff --git a/Library/LibraryView/FormSecond.cs b/Library/LibraryView/FormSecond.cs
index e42f6ea..b6e83b3 100644
--- a/Library/LibraryView/FormSecond.cs
+++ b/Library/LibraryView/FormSecond.cs
@@ -1,4 +1,5 @@
using CustomComponents;
+using CustomComponents.MyNonVisualComponents;
using Microsoft.VisualBasic;
namespace LibraryView
@@ -15,7 +16,7 @@ namespace LibraryView
string[] text = { "Некий текст 1", "Ещё один некий текст", "Текст" };
BigTextComponent bigText = new BigTextComponent();
-
+
bigText.CreateExcel("D:\\Papka\\КОП\\ExcelDoc.xls", "Документ", text);
}
diff --git a/Library/LibraryView/FormSecond.resx b/Library/LibraryView/FormSecond.resx
index 8e89b0f..9c24520 100644
--- a/Library/LibraryView/FormSecond.resx
+++ b/Library/LibraryView/FormSecond.resx
@@ -60,4 +60,13 @@
17, 17
+
+ 209, 17
+
+
+ 342, 17
+
+
+ 463, 17
+
\ No newline at end of file
diff --git a/Library/LibraryView/LibraryView.csproj b/Library/LibraryView/LibraryView.csproj
index 6136776..43410ec 100644
--- a/Library/LibraryView/LibraryView.csproj
+++ b/Library/LibraryView/LibraryView.csproj
@@ -10,10 +10,17 @@
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
\ No newline at end of file