diff --git a/WinFormsLibrary1.sln b/WinFormsLibrary1.sln
new file mode 100644
index 0000000..497a321
--- /dev/null
+++ b/WinFormsLibrary1.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.9.34728.123
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinFormsLibrary1", "WinFormsLibrary1\WinFormsLibrary1.csproj", "{260D3E8C-3599-49F1-BF42-64A92DD0FB62}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsMain", "WinFormsMain\WinFormsMain.csproj", "{D671A342-9B1B-4662-B7CB-9E7382CCFBC7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {260D3E8C-3599-49F1-BF42-64A92DD0FB62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {260D3E8C-3599-49F1-BF42-64A92DD0FB62}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {260D3E8C-3599-49F1-BF42-64A92DD0FB62}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {260D3E8C-3599-49F1-BF42-64A92DD0FB62}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D671A342-9B1B-4662-B7CB-9E7382CCFBC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D671A342-9B1B-4662-B7CB-9E7382CCFBC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D671A342-9B1B-4662-B7CB-9E7382CCFBC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D671A342-9B1B-4662-B7CB-9E7382CCFBC7}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {1208CC7E-AF27-4982-8E30-0DC89F09BBA6}
+ EndGlobalSection
+EndGlobal
diff --git a/WinFormsLibrary1/ColumnInfo.cs b/WinFormsLibrary1/ColumnInfo.cs
new file mode 100644
index 0000000..f504008
--- /dev/null
+++ b/WinFormsLibrary1/ColumnInfo.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary1
+{
+ public class ColumnInfo
+ {
+ public string HeaderText { get; set; } = string.Empty;
+ public int Width { get; set; }
+ public bool Visible { get; set; }
+ public string Name { get; set; } = string.Empty;
+ public ColumnInfo(string headerText, string name, int width, bool visible)
+ {
+ HeaderText = headerText;
+ Name = name;
+ Width = width;
+ Visible = visible;
+ }
+ }
+}
diff --git a/WinFormsLibrary1/UncheckedNullException.cs b/WinFormsLibrary1/UncheckedNullException.cs
new file mode 100644
index 0000000..73b6e8c
--- /dev/null
+++ b/WinFormsLibrary1/UncheckedNullException.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary1
+{
+ public class UncheckedNullException : Exception
+ {
+ public UncheckedNullException() { }
+ public UncheckedNullException(string message) : base(message) { }
+ }
+}
diff --git a/WinFormsLibrary1/UnexpectedTypeException.cs b/WinFormsLibrary1/UnexpectedTypeException.cs
new file mode 100644
index 0000000..19eace9
--- /dev/null
+++ b/WinFormsLibrary1/UnexpectedTypeException.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary1
+{
+ public class UnexpectedTypeException : Exception
+ {
+ public UnexpectedTypeException() { }
+ public UnexpectedTypeException(string message) : base(message) { }
+ }
+}
diff --git a/WinFormsLibrary1/User.cs b/WinFormsLibrary1/User.cs
new file mode 100644
index 0000000..8a521b8
--- /dev/null
+++ b/WinFormsLibrary1/User.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WinFormsLibrary1
+{
+ public class User
+ {
+ public string username { get; private set; }
+ public string email { get; private set; }
+ public DateTime birthday { get; private set; }
+
+ public User(string username, string email, DateTime birthday)
+ {
+ this.username = username;
+ this.email = email;
+ this.birthday = birthday;
+ }
+
+ }
+}
diff --git a/WinFormsLibrary1/UserControlIntegerInput.Designer.cs b/WinFormsLibrary1/UserControlIntegerInput.Designer.cs
new file mode 100644
index 0000000..e978ffc
--- /dev/null
+++ b/WinFormsLibrary1/UserControlIntegerInput.Designer.cs
@@ -0,0 +1,71 @@
+namespace WinFormsLibrary1
+{
+ partial class UserControlIntegerInput
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ 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()
+ {
+ textBoxInteger = new TextBox();
+ checkBoxNullable = new CheckBox();
+ SuspendLayout();
+ //
+ // textBoxInteger
+ //
+ textBoxInteger.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
+ textBoxInteger.Location = new Point(24, 1);
+ textBoxInteger.Name = "textBoxInteger";
+ textBoxInteger.Size = new Size(144, 23);
+ textBoxInteger.TabIndex = 0;
+ textBoxInteger.TextChanged += textBoxInteger_TextChanged;
+ //
+ // checkBoxNullable
+ //
+ checkBoxNullable.AutoSize = true;
+ checkBoxNullable.Location = new Point(3, 5);
+ checkBoxNullable.Name = "checkBoxNullable";
+ checkBoxNullable.Size = new Size(15, 14);
+ checkBoxNullable.TabIndex = 1;
+ checkBoxNullable.UseVisualStyleBackColor = true;
+ checkBoxNullable.CheckedChanged += checkBoxNullable_CheckedChanged;
+ //
+ // UserControlIntegerInput
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(checkBoxNullable);
+ Controls.Add(textBoxInteger);
+ Name = "UserControlIntegerInput";
+ Size = new Size(171, 30);
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private TextBox textBoxInteger;
+ private CheckBox checkBoxNullable;
+ }
+}
diff --git a/WinFormsLibrary1/UserControlIntegerInput.cs b/WinFormsLibrary1/UserControlIntegerInput.cs
new file mode 100644
index 0000000..3413573
--- /dev/null
+++ b/WinFormsLibrary1/UserControlIntegerInput.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace WinFormsLibrary1
+{
+ public partial class UserControlIntegerInput : UserControl
+ {
+ private event EventHandler? _elementChanged;
+ private event Action? _errorOccured;
+ public string Error { get; private set; }
+ public int? InputtedInteger
+ {
+ get
+ {
+ if (checkBoxNullable.Checked)
+ {
+ return null;
+ }
+ if (textBoxInteger.Text.Equals(string.Empty) || textBoxInteger.Text == null)
+ {
+ throw new UncheckedNullException("Input was null, but checkbox wasnt checked");
+ }
+ if (Int32.TryParse(textBoxInteger.Text, out var number))
+ {
+ return number;
+ }
+ throw new UnexpectedTypeException("Input was non integer");
+ }
+ set
+ {
+ textBoxInteger.Text = value.ToString();
+ checkBoxNullable.Checked = value == null;
+ }
+ }
+ public event EventHandler ElementChanged
+ {
+ add { _elementChanged += value; }
+ remove { _elementChanged -= value; }
+ }
+ public event Action AnErrorOccurred
+ {
+ add { _errorOccured += value; }
+ remove { _errorOccured -= value; }
+ }
+ public UserControlIntegerInput()
+ {
+ InitializeComponent();
+ Error = string.Empty;
+ }
+
+ private void textBoxInteger_TextChanged(object sender, EventArgs e)
+ {
+ _elementChanged?.Invoke(this, e);
+ }
+
+ private void checkBoxNullable_CheckedChanged(object sender, EventArgs e)
+ {
+ textBoxInteger.Enabled = !checkBoxNullable.Checked;
+ textBoxInteger.Text = null;
+ _elementChanged?.Invoke(this, e);
+ }
+ }
+}
diff --git a/WinFormsLibrary1/UserControlIntegerInput.resx b/WinFormsLibrary1/UserControlIntegerInput.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/WinFormsLibrary1/UserControlIntegerInput.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/WinFormsLibrary1/UserControlStringsListBox.Designer.cs b/WinFormsLibrary1/UserControlStringsListBox.Designer.cs
new file mode 100644
index 0000000..6b42aee
--- /dev/null
+++ b/WinFormsLibrary1/UserControlStringsListBox.Designer.cs
@@ -0,0 +1,58 @@
+namespace WinFormsLibrary1
+{
+ partial class UserControlStringsListBox
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ 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()
+ {
+ listBoxStrings = new ListBox();
+ SuspendLayout();
+ //
+ // listBoxStrings
+ //
+ listBoxStrings.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
+ listBoxStrings.FormattingEnabled = true;
+ listBoxStrings.ItemHeight = 15;
+ listBoxStrings.Location = new Point(3, 3);
+ listBoxStrings.Name = "listBoxStrings";
+ listBoxStrings.Size = new Size(144, 139);
+ listBoxStrings.TabIndex = 0;
+ listBoxStrings.SelectedValueChanged += listBoxStrings_SelectedValueChanged;
+ //
+ // UserControlStringsListBox
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(listBoxStrings);
+ Name = "UserControlStringsListBox";
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private ListBox listBoxStrings;
+ }
+}
diff --git a/WinFormsLibrary1/UserControlStringsListBox.cs b/WinFormsLibrary1/UserControlStringsListBox.cs
new file mode 100644
index 0000000..0cf9580
--- /dev/null
+++ b/WinFormsLibrary1/UserControlStringsListBox.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace WinFormsLibrary1
+{
+ public partial class UserControlStringsListBox : UserControl
+ {
+ private event EventHandler? _listChanged;
+ private event Action? _errorOccured;
+ public string Error { get; private set; }
+ public string ListElement
+ {
+ get
+ {
+ return listBoxStrings.SelectedItem?.ToString();
+ }
+ set
+ {
+ if (listBoxStrings.Items.Contains(value))
+ {
+ listBoxStrings.SelectedItem = value;
+ }
+ }
+ }
+ public event EventHandler ListChanged
+ {
+ add { _listChanged += value; }
+ remove { _listChanged -= value; }
+ }
+ public event Action AnErrorOccurred
+ {
+ add { _errorOccured += value; }
+ remove { _errorOccured -= value; }
+ }
+ public UserControlStringsListBox()
+ {
+ InitializeComponent();
+ Error = string.Empty;
+ }
+
+ public void AddList(List l)
+ {
+ try
+ {
+ listBoxStrings.Items.AddRange(l.ToArray());
+ }
+ catch (Exception ex)
+ {
+ Error = ex.Message;
+ _errorOccured?.Invoke();
+ }
+ }
+ public void ClearList()
+ {
+ listBoxStrings.Items.Clear();
+ }
+
+ private void listBoxStrings_SelectedValueChanged(object sender, EventArgs e)
+ {
+ _listChanged?.Invoke(sender, e);
+ }
+ }
+}
diff --git a/WinFormsLibrary1/UserControlStringsListBox.resx b/WinFormsLibrary1/UserControlStringsListBox.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/WinFormsLibrary1/UserControlStringsListBox.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/WinFormsLibrary1/UserControlTable.Designer.cs b/WinFormsLibrary1/UserControlTable.Designer.cs
new file mode 100644
index 0000000..9db1b39
--- /dev/null
+++ b/WinFormsLibrary1/UserControlTable.Designer.cs
@@ -0,0 +1,62 @@
+namespace WinFormsLibrary1
+{
+ partial class UserControlTable
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ 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()
+ {
+ dataGridViewTable = new DataGridView();
+ ((System.ComponentModel.ISupportInitialize)dataGridViewTable).BeginInit();
+ SuspendLayout();
+ //
+ // dataGridViewTable
+ //
+ dataGridViewTable.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
+ dataGridViewTable.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridViewTable.Location = new Point(3, 3);
+ dataGridViewTable.Name = "dataGridViewTable";
+ dataGridViewTable.RowHeadersVisible = false;
+ dataGridViewTable.RowTemplate.Height = 25;
+ dataGridViewTable.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
+ dataGridViewTable.Size = new Size(325, 150);
+ dataGridViewTable.TabIndex = 0;
+ //
+ // UserControlTable
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(dataGridViewTable);
+ Name = "UserControlTable";
+ Size = new Size(331, 157);
+ ((System.ComponentModel.ISupportInitialize)dataGridViewTable).EndInit();
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private DataGridView dataGridViewTable;
+ }
+}
diff --git a/WinFormsLibrary1/UserControlTable.cs b/WinFormsLibrary1/UserControlTable.cs
new file mode 100644
index 0000000..f341e31
--- /dev/null
+++ b/WinFormsLibrary1/UserControlTable.cs
@@ -0,0 +1,100 @@
+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 WinFormsLibrary1
+{
+ public partial class UserControlTable : UserControl
+ {
+ public int index
+ {
+ get => dataGridViewTable.SelectedRows.Count > 0 ? dataGridViewTable.SelectedRows[0].Index : -1;
+ set
+ {
+ if (value >= 0 && value < dataGridViewTable.Rows.Count)
+ {
+ dataGridViewTable.ClearSelection();
+ dataGridViewTable.Rows[value].Selected = true;
+ }
+ }
+ }
+ public UserControlTable()
+ {
+ InitializeComponent();
+ }
+
+ public void ConfigureColumns(List columnInfo)
+ {
+ dataGridViewTable.Columns.Clear();
+ for (int i = 0; i < columnInfo.Count; i++)
+ {
+ DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn
+ {
+ Name = columnInfo[i].Name,
+ HeaderText = columnInfo[i].HeaderText,
+ Width = columnInfo[i].Width,
+ Visible = columnInfo[i].Visible,
+ };
+ dataGridViewTable.Columns.Add(column);
+ }
+ }
+
+ public void ClearRows()
+ {
+ dataGridViewTable.Rows.Clear();
+ }
+
+ public void AddObjectList(List