Немного переделал

This commit is contained in:
maxnes3 2023-11-02 00:46:16 +04:00
parent 0ddfe833c4
commit 313e38ecf2
27 changed files with 1216 additions and 14 deletions

View File

@ -18,7 +18,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Contracts\Contracts.csproj" /> <ProjectReference Include="..\Contracts\Contracts.csproj" />
<ProjectReference Include="..\DataBaseImplement\DataBaseImplement.csproj" /> <ProjectReference Include="..\DataBaseImplement\DataBaseImplement.csproj" />
<ProjectReference Include="..\WinFormsLibrary\WinFormsLibrary.csproj" /> <ProjectReference Include="..\PdfFormsLibrary\PdfFormsLibrary.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,71 @@
namespace WinForm
{
partial class DropDownList
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
comboBox = new ComboBox();
labelTitle = new Label();
SuspendLayout();
//
// comboBox
//
comboBox.FormattingEnabled = true;
comboBox.Location = new Point(13, 39);
comboBox.Name = "comboBox";
comboBox.Size = new Size(232, 23);
comboBox.TabIndex = 0;
comboBox.SelectedValueChanged += ComboBox_SelectedValueChanged;
//
// labelTitle
//
labelTitle.AutoSize = true;
labelTitle.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelTitle.Location = new Point(13, 11);
labelTitle.Name = "labelTitle";
labelTitle.Size = new Size(133, 15);
labelTitle.TabIndex = 1;
labelTitle.Text = "Выпадающий список";
//
// DropDownList
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
Controls.Add(labelTitle);
Controls.Add(comboBox);
Name = "DropDownList";
Size = new Size(260, 80);
ResumeLayout(false);
PerformLayout();
}
#endregion
private ComboBox comboBox;
private Label labelTitle;
}
}

View File

@ -0,0 +1,72 @@
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 WinForm
{
public partial class DropDownList : UserControl
{
public DropDownList()
{
InitializeComponent();
}
public void Clear()
{
comboBox.Items.Clear();
}
public string Selected
{
get
{
if (comboBox.Items.Count == 0)
{
return "";
}
if (comboBox.SelectedItem == null)
{
return "";
}
return comboBox.SelectedItem.ToString()!;
}
set
{
if (comboBox.Items.Contains(value))
{
comboBox.SelectedItem = value;
}
}
}
public ComboBox.ObjectCollection ComboBoxItems
{
get { return comboBox.Items; }
}
private EventHandler _explicitEvent;
public event EventHandler ExplicitEvent
{
add
{
_explicitEvent += value;
}
remove
{
_explicitEvent -= value;
}
}
private void ComboBox_SelectedValueChanged(object sender, EventArgs e)
{
_explicitEvent?.Invoke(sender, e);
}
}
}

View File

@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,57 @@
using OxyPlot.Legends;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PdfFormsLibrary.Helpers
{
public class LegendSettingsAttribute : Attribute
{
public LegendPosition Position { get; }
public LegendPlacement Placement { get; }
public LegendSettingsAttribute(LegendPosition position, LegendPlacement placement)
{
Position = position;
Placement = placement;
}
}
public enum DiagramLegendPosition
{
[LegendSettings(LegendPosition.LeftTop, LegendPlacement.Outside)]
TopLeftOutside,
[LegendSettings(LegendPosition.TopCenter, LegendPlacement.Outside)]
TopCenterOutside,
[LegendSettings(LegendPosition.RightTop, LegendPlacement.Outside)]
TopRightOutside,
[LegendSettings(LegendPosition.LeftMiddle, LegendPlacement.Outside)]
MiddleLeftOutside,
[LegendSettings(LegendPosition.RightMiddle, LegendPlacement.Outside)]
MiddleRightOutside,
[LegendSettings(LegendPosition.BottomLeft, LegendPlacement.Outside)]
BottomLeftOutside,
[LegendSettings(LegendPosition.BottomCenter, LegendPlacement.Outside)]
BottomCenterOutside,
[LegendSettings(LegendPosition.BottomRight, LegendPlacement.Outside)]
BottomRightOutside,
[LegendSettings(LegendPosition.LeftTop, LegendPlacement.Inside)]
TopLeftInside,
[LegendSettings(LegendPosition.TopCenter, LegendPlacement.Inside)]
TopCenterInside,
[LegendSettings(LegendPosition.RightTop, LegendPlacement.Inside)]
TopRightInside,
[LegendSettings(LegendPosition.LeftMiddle, LegendPlacement.Inside)]
MiddleLeftInside,
[LegendSettings(LegendPosition.RightMiddle, LegendPlacement.Inside)]
MiddleRightInside,
[LegendSettings(LegendPosition.BottomLeft, LegendPlacement.Inside)]
BottomLeftInside,
[LegendSettings(LegendPosition.BottomCenter, LegendPlacement.Inside)]
BottomCenterInside,
[LegendSettings(LegendPosition.BottomRight, LegendPlacement.Inside)]
BottomRightInside,
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PdfFormsLibrary.Helpers
{
public class PdfWithDiagramData
{
public string FilePath { get; set; } = string.Empty;
public string DocumentTitle { get; set; } = string.Empty;
public string DiagramName { get; set; } = string.Empty;
public DiagramLegendPosition LegendPosition { get; set; } = DiagramLegendPosition.BottomCenterOutside;
public List<PdfWithDiagramSeries> Series { get; set; } = new();
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PdfFormsLibrary.Helpers
{
public class PdfWithDiagramSeries
{
public string Name { get; set; } = string.Empty;
public List<(double, double)> Data { get; set; } = new();
}
}

View File

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PdfFormsLibrary.Helpers
{
public class PdfWithTableData<T>
{
public string FilePath { get; set; } = string.Empty;
public string DocumentTitle { get; set; } = string.Empty;
public List<PdfWithTableHeader> TableHeader { get; set; } = new();
public List<T> TableData { get; set; } = new();
public List<string> Props { get; set; } = new();
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PdfFormsLibrary.Helpers
{
public class PdfWithTableHeader
{
public string? ColumnName { get; set; } = string.Empty;
public int ColumnWidth { get; set; } = 100;
public List<PdfWithTableSubHeader> SubColumns { get; set; } = new List<PdfWithTableSubHeader>();
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PdfFormsLibrary.Helpers
{
public class PdfWithTableSubHeader
{
public string? ColumnName { get; set; } = string.Empty;
public int ColumnWidth { get; set; } = 100;
}
}

View File

@ -0,0 +1,71 @@
namespace WinForm
{
partial class ListBoxValues
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
listBox = new ListBox();
componentTitleLabel = new Label();
SuspendLayout();
//
// listBox
//
listBox.FormattingEnabled = true;
listBox.ItemHeight = 15;
listBox.Location = new Point(12, 39);
listBox.Name = "listBox";
listBox.Size = new Size(172, 154);
listBox.TabIndex = 0;
//
// componentTitleLabel
//
componentTitleLabel.AutoSize = true;
componentTitleLabel.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
componentTitleLabel.Location = new Point(12, 12);
componentTitleLabel.Name = "componentTitleLabel";
componentTitleLabel.Size = new Size(108, 15);
componentTitleLabel.TabIndex = 1;
componentTitleLabel.Text = "Список занчений";
//
// ListBoxValues
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
Controls.Add(componentTitleLabel);
Controls.Add(listBox);
Name = "ListBoxValues";
Size = new Size(200, 206);
ResumeLayout(false);
PerformLayout();
}
#endregion
private ListBox listBox;
private Label componentTitleLabel;
}
}

View File

@ -0,0 +1,113 @@
using System;
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 WinForm
{
public partial class ListBoxValues : UserControl
{
private string layoutString;
private string startSymbol;
private string endSymbol;
public ListBoxValues()
{
InitializeComponent();
}
public void SetLayoutInfo(string layout, string startS, string endS)
{
if (layout == null || startS == null || endS == null)
{
return;
}
layoutString = layout;
startSymbol = startS;
endSymbol = endS;
}
public int SelectedIndex
{
get
{
if (listBox.SelectedIndex == -1)
{
return -1;
}
return listBox.SelectedIndex;
}
set
{
if (listBox.SelectedItems.Count != 0)
{
listBox.SelectedIndex = value;
}
}
}
public T GetObjectFromStr<T>() where T : class, new()
{
if (listBox.SelectedIndex == -1)
{
return null;
}
string row = listBox.SelectedItem.ToString()!;
T curObject = new T();
StringBuilder sb = new StringBuilder(row);
foreach (var property in typeof(T).GetProperties())
{
if (!property.CanWrite)
{
continue;
}
int borderOne = sb.ToString().IndexOf(startSymbol);
if (borderOne == -1)
{
break;
}
int borderTwo = sb.ToString().IndexOf(endSymbol, borderOne + 1);
if (borderTwo == -1)
{
break;
}
string propertyValue = sb.ToString(borderOne + 1, borderTwo - borderOne - 1);
sb.Remove(0, borderTwo + 1);
property.SetValue(curObject, Convert.ChangeType(propertyValue, property.PropertyType));
}
return curObject;
}
public void FillProperty<T>(T dataObject, int rowIndex, string propertyName)
{
if (layoutString == null || startSymbol == null || endSymbol == null)
{
return;
}
while (listBox.Items.Count <= rowIndex)
{
listBox.Items.Add(layoutString);
}
string row = listBox.Items[rowIndex].ToString();
PropertyInfo propertyInfo = dataObject.GetType().GetProperty(propertyName);
if (propertyInfo != null)
{
object propertyValue = propertyInfo.GetValue(dataObject);
row = row.Replace($"{startSymbol}{propertyName}{endSymbol}", propertyValue.ToString());
listBox.Items[rowIndex] = row;
}
}
}
}

View File

@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,72 @@
namespace WinForm
{
partial class NumberTextBox
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
componentTitleLabel = new Label();
textBox = new TextBox();
SuspendLayout();
//
// componentTitleLabel
//
componentTitleLabel.AutoSize = true;
componentTitleLabel.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
componentTitleLabel.Location = new Point(13, 12);
componentTitleLabel.Name = "componentTitleLabel";
componentTitleLabel.Size = new Size(154, 15);
componentTitleLabel.TabIndex = 1;
componentTitleLabel.Text = "Введите номер телефона";
//
// textBox
//
textBox.Location = new Point(13, 41);
textBox.Name = "textBox";
textBox.Size = new Size(234, 23);
textBox.TabIndex = 2;
textBox.TextChanged += TextBox_TextChanged;
textBox.Enter += TextBox_Enter;
//
// NumberTextBox
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleMode = AutoScaleMode.Font;
Controls.Add(textBox);
Controls.Add(componentTitleLabel);
Name = "NumberTextBox";
Size = new Size(260, 80);
ResumeLayout(false);
PerformLayout();
}
#endregion
private TextBox numberTextBox;
private Label componentTitleLabel;
private TextBox textBox;
}
}

View File

@ -0,0 +1,86 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinForm
{
public partial class NumberTextBox : UserControl
{
//Шаблон для textbox
private string? pattern;
private string example = "+7XXXXXXXXXX";
public NumberTextBox()
{
InitializeComponent();
}
//Публичное свойство для получения и заполнения шаблона
public string? Pattern
{
get { return pattern; }
set { pattern = value; }
}
public string? TextBoxValue
{
get
{
if (new Regex(Pattern).IsMatch(textBox.Text))
{
return textBox.Text;
}
return null;
}
set
{
if (new Regex(Pattern).IsMatch(value))
{
textBox.Text = value;
}
}
}
//Метод для заполнения примера
public void SetExample(string str)
{
if (new Regex(Pattern).IsMatch(str))
{
example = str;
}
}
private void TextBox_Enter(object sender, EventArgs e)
{
int VisibleTime = 3000;
ToolTip tt = new ToolTip();
tt.Show(example, textBox, 0, 25, VisibleTime);
}
private EventHandler _explicitEvent;
public event EventHandler ExplicitEvent
{
add
{
_explicitEvent += value;
}
remove
{
_explicitEvent -= value;
}
}
private void TextBox_TextChanged(object sender, EventArgs e)
{
_explicitEvent?.Invoke(sender, e);
}
}
}

View File

@ -0,0 +1,60 @@
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="OxyPlot.Core" Version="2.1.2" />
<PackageReference Include="OxyPlot.WindowsForms" Version="2.1.2" />
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,36 @@
namespace PdfFormsLibrary
{
partial class PdfGeneratorControl
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@ -0,0 +1,55 @@
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using PdfSharp.Fonts;
using PdfSharp.Pdf;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PdfFormsLibrary
{
public partial class PdfGeneratorControl : Component
{
public PdfGeneratorControl()
{
InitializeComponent();
}
public PdfGeneratorControl(IContainer container)
{
container.Add(this);
InitializeComponent();
}
public void GeneratePdf(string filePath, string documentTitle, List<string> textData)
{
if (string.IsNullOrEmpty(filePath) || string.IsNullOrEmpty(documentTitle) || textData == null)
{
return;
}
Document document = new Document();
Section section = document.AddSection();
Paragraph title = section.AddParagraph(documentTitle);
title.Format.Font.Bold = true;
foreach (var item in textData)
{
Paragraph paragraph = section.AddParagraph();
paragraph.AddText(item);
}
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true, PdfFontEmbedding.Always);
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save(filePath);
}
}
}

View File

@ -0,0 +1,36 @@
namespace PdfFormsLibrary
{
partial class PdfGeneratorLinearDiagram
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@ -0,0 +1,84 @@
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Legends;
using OxyPlot.Series;
using OxyPlot.WindowsForms;
using System.ComponentModel;
using System.Reflection;
using PdfFormsLibrary.Helpers;
namespace PdfFormsLibrary
{
public partial class PdfGeneratorLinearDiagram : Component
{
public PdfGeneratorLinearDiagram()
{
InitializeComponent();
}
public PdfGeneratorLinearDiagram(IContainer container)
{
container.Add(this);
InitializeComponent();
}
public void GeneratePdfDocumentWithChart(PdfWithDiagramData pdfDiagram)
{
if (string.IsNullOrEmpty(pdfDiagram.FilePath) || string.IsNullOrEmpty(pdfDiagram.DocumentTitle)
|| string.IsNullOrEmpty(pdfDiagram.DiagramName) || pdfDiagram.Series == null)
{
return;
}
var plotModel = new PlotModel { Title = pdfDiagram.DiagramName };
var xAxis = new LinearAxis { Position = AxisPosition.Bottom };
var yAxis = new LinearAxis { Position = AxisPosition.Left };
plotModel.Axes.Add(xAxis);
plotModel.Axes.Add(yAxis);
foreach (var item in pdfDiagram.Series)
{
var singleSeries = new LineSeries { Title = item.Name };
foreach (var coordinates in item.Data)
{
singleSeries.Points.Add(new DataPoint(coordinates.Item1, coordinates.Item2));
}
plotModel.Series.Add(singleSeries);
}
var fieldInfo = typeof(DiagramLegendPosition).GetField(pdfDiagram.LegendPosition.ToString());
var attribute = fieldInfo?.GetCustomAttribute<LegendSettingsAttribute>();
plotModel.Legends.Add(new Legend()
{
LegendTitle = "Легенда",
LegendPlacement = attribute.Placement,
LegendPosition = attribute.Position,
});
plotModel.IsLegendVisible = true;
var document = new Document();
document.Info.Title = pdfDiagram.DocumentTitle;
var section = document.AddSection();
section.PageSetup.TopMargin = "1cm";
var image = new PngExporter { Width = 600, Height = 400 }.ExportToBitmap(plotModel);
image.Save("temp.png");
var chartImage = section.AddImage("temp.png");
chartImage.LockAspectRatio = true;
chartImage.Width = "15cm";
chartImage.Height = "10cm";
var pdfRenderer = new PdfDocumentRenderer(true);
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save(pdfDiagram.FilePath);
}
}
}

View File

@ -0,0 +1,36 @@
namespace PdfFormsLibrary
{
partial class PdfTableGenerator
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
}
#endregion
}
}

View File

@ -0,0 +1,134 @@
using PdfSharp.Pdf;
using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.Rendering;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PdfFormsLibrary.Helpers;
namespace PdfFormsLibrary
{
public partial class PdfTableGenerator : Component
{
private int fontSize = 14;
public PdfTableGenerator()
{
InitializeComponent();
}
public PdfTableGenerator(IContainer container)
{
container.Add(this);
InitializeComponent();
}
public void GeneratePdf<T>(PdfWithTableData<T> pdfTable)
{
if (pdfTable == null || string.IsNullOrEmpty(pdfTable.FilePath)
|| string.IsNullOrEmpty(pdfTable.DocumentTitle) || pdfTable.TableHeader == null)
{
throw new ArgumentException("Недостаточно данных для создания PDF-документа.");
}
Document document = new Document();
Section section = document.AddSection();
Paragraph title = section.AddParagraph(pdfTable.DocumentTitle);
title.Format.Font.Bold = true;
title.Format.Alignment = ParagraphAlignment.Center;
Table table = section.AddTable();
table.Borders.Visible = true;
foreach (var column in pdfTable.TableHeader)
{
if (column.SubColumns.Count > 0)
{
foreach(var sub in column.SubColumns)
{
Column newsub = table.AddColumn();
newsub.Width = sub.ColumnWidth;
}
continue;
}
Column newcolumn = table.AddColumn();
newcolumn.Width = column.ColumnWidth;
}
CreateTableHeader(table, pdfTable.TableHeader);
CreateTableData(table, pdfTable);
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(true);
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
pdfRenderer.PdfDocument.Save(pdfTable.FilePath);
}
public void CreateTableHeader(Table table, List<PdfWithTableHeader> headerInfo)
{
Row headerRow1 = table.AddRow();
Row headerRow2 = table.AddRow();
foreach (Row headerRow in new Row[] { headerRow1, headerRow2 })
{
headerRow.HeadingFormat = true;
headerRow.Format.Alignment = ParagraphAlignment.Center;
headerRow.Format.Font.Bold = true;
}
int i = 0;
foreach (var column in headerInfo)
{
int rowSpan = Math.Max(1, column.SubColumns.Count);
if (column.SubColumns.Count > 0)
{
headerRow1.Cells[i].MergeRight = rowSpan - 1;
for (int j = 0; j < column.SubColumns.Count; j++)
{
headerRow2.Cells[i + j].AddParagraph(column.SubColumns[j].ColumnName);
}
}
else
{
headerRow1.Cells[i].MergeDown = rowSpan;
}
headerRow1.Cells[i].AddParagraph(column.ColumnName);
i += rowSpan;
}
}
private void CreateTableData<T>(Table table, PdfWithTableData<T> data)
{
if (data == null || data.TableData == null)
return;
foreach (var rowData in data.TableData)
{
Row newrow = table.AddRow();
int i = 0;
foreach (var column in data.Props)
{
try
{
object cellValue = typeof(T).GetProperty(column).GetValue(rowData);
string cellText = cellValue?.ToString() ?? string.Empty;
newrow.Cells[i].AddParagraph(cellText);
++i;
}
catch { }
}
}
}
}
}

View File

@ -5,15 +5,17 @@ VisualStudioVersion = 17.5.33424.131
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinForm", "WinForm\WinForm.csproj", "{79A863DB-93E6-44C2-AB0F-DE0D19BE72DC}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinForm", "WinForm\WinForm.csproj", "{79A863DB-93E6-44C2-AB0F-DE0D19BE72DC}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsLibrary", "WinFormsLibrary\WinFormsLibrary.csproj", "{B617E65D-B482-4120-BC74-66B760D66FEF}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinFormsLibrary", "WinFormsLibrary\WinFormsLibrary.csproj", "{B617E65D-B482-4120-BC74-66B760D66FEF}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataModels", "DataModels\DataModels.csproj", "{D468732D-BA49-4D2C-8854-DD4FDA8FDC1D}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataModels", "DataModels\DataModels.csproj", "{D468732D-BA49-4D2C-8854-DD4FDA8FDC1D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contracts", "Contracts\Contracts.csproj", "{B90EEDCA-96C8-4E5C-9C5B-7F663023802D}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Contracts", "Contracts\Contracts.csproj", "{B90EEDCA-96C8-4E5C-9C5B-7F663023802D}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataBaseImplement", "DataBaseImplement\DataBaseImplement.csproj", "{E94AC3C7-A9BB-4262-9C87-5DF8E03B643B}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataBaseImplement", "DataBaseImplement\DataBaseImplement.csproj", "{E94AC3C7-A9BB-4262-9C87-5DF8E03B643B}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppView", "AppView\AppView.csproj", "{9BD73EC6-6B32-4CBB-8D04-9D4650562846}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AppView", "AppView\AppView.csproj", "{9BD73EC6-6B32-4CBB-8D04-9D4650562846}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PdfFormsLibrary", "PdfFormsLibrary\PdfFormsLibrary.csproj", "{2BFDA66F-E786-4C74-8D3A-054C6D1FDF7D}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -45,6 +47,10 @@ Global
{9BD73EC6-6B32-4CBB-8D04-9D4650562846}.Debug|Any CPU.Build.0 = Debug|Any CPU {9BD73EC6-6B32-4CBB-8D04-9D4650562846}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9BD73EC6-6B32-4CBB-8D04-9D4650562846}.Release|Any CPU.ActiveCfg = Release|Any CPU {9BD73EC6-6B32-4CBB-8D04-9D4650562846}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9BD73EC6-6B32-4CBB-8D04-9D4650562846}.Release|Any CPU.Build.0 = Release|Any CPU {9BD73EC6-6B32-4CBB-8D04-9D4650562846}.Release|Any CPU.Build.0 = Release|Any CPU
{2BFDA66F-E786-4C74-8D3A-054C6D1FDF7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2BFDA66F-E786-4C74-8D3A-054C6D1FDF7D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2BFDA66F-E786-4C74-8D3A-054C6D1FDF7D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2BFDA66F-E786-4C74-8D3A-054C6D1FDF7D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@ -29,7 +29,7 @@
private void InitializeComponent() private void InitializeComponent()
{ {
components = new System.ComponentModel.Container(); components = new System.ComponentModel.Container();
pdfGeneratorControl = new WinFormsLibrary.PdfGeneratorControl(components); pdfGeneratorControl = new PdfFormsLibrary.PdfGeneratorControl(components);
groupBoxPdfText = new GroupBox(); groupBoxPdfText = new GroupBox();
buttonSaveDiagram = new Button(); buttonSaveDiagram = new Button();
buttonSaveTable = new Button(); buttonSaveTable = new Button();
@ -38,8 +38,8 @@
labelBigText = new Label(); labelBigText = new Label();
labelTitle = new Label(); labelTitle = new Label();
textBoxTitle = new TextBox(); textBoxTitle = new TextBox();
pdfTableGenerator = new WinFormsLibrary.PdfTableGenerator(components); pdfTableGenerator = new PdfFormsLibrary.PdfTableGenerator(components);
pdfGeneratorLinearDiagram = new WinFormsLibrary.PdfGeneratorLinearDiagram(components); pdfGeneratorLinearDiagram = new PdfFormsLibrary.PdfGeneratorLinearDiagram(components);
groupBoxPdfText.SuspendLayout(); groupBoxPdfText.SuspendLayout();
SuspendLayout(); SuspendLayout();
// //
@ -138,16 +138,16 @@
#endregion #endregion
private WinFormsLibrary.PdfGeneratorControl pdfGeneratorControl; private PdfFormsLibrary.PdfGeneratorControl pdfGeneratorControl;
private GroupBox groupBoxPdfText; private GroupBox groupBoxPdfText;
private Label labelTitle; private Label labelTitle;
private TextBox textBoxTitle; private TextBox textBoxTitle;
private Button buttonSaveFile; private Button buttonSaveFile;
private RichTextBox richTextBox; private RichTextBox richTextBox;
private Label labelBigText; private Label labelBigText;
private WinFormsLibrary.PdfTableGenerator pdfTableGenerator; private PdfFormsLibrary.PdfTableGenerator pdfTableGenerator;
private Button buttonSaveDiagram; private Button buttonSaveDiagram;
private Button buttonSaveTable; private Button buttonSaveTable;
private WinFormsLibrary.PdfGeneratorLinearDiagram pdfGeneratorLinearDiagram; private PdfFormsLibrary.PdfGeneratorLinearDiagram pdfGeneratorLinearDiagram;
} }
} }

View File

@ -1,4 +1,4 @@
using WinFormsLibrary.Helpers; using PdfFormsLibrary.Helpers;
namespace WinForm namespace WinForm
{ {

View File

@ -9,7 +9,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\WinFormsLibrary\WinFormsLibrary.csproj" /> <ProjectReference Include="..\PdfFormsLibrary\PdfFormsLibrary.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>