diff --git a/FormLibrary/CustomListBox.Designer.cs b/FormLibrary/CustomListBox.Designer.cs
new file mode 100644
index 0000000..fc24a8e
--- /dev/null
+++ b/FormLibrary/CustomListBox.Designer.cs
@@ -0,0 +1,58 @@
+namespace FormLibrary
+{
+ partial class CustomListBox
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ 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()
+ {
+ listBox1 = new ListBox();
+ SuspendLayout();
+ //
+ // listBox1
+ //
+ listBox1.FormattingEnabled = true;
+ listBox1.ItemHeight = 15;
+ listBox1.Location = new Point(3, 3);
+ listBox1.Name = "listBox1";
+ listBox1.Size = new Size(231, 169);
+ listBox1.TabIndex = 0;
+ listBox1.SelectedIndexChanged += ListBox1_SelectedIndexChanged;
+ //
+ // CustomListBox
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(listBox1);
+ Name = "CustomListBox";
+ Size = new Size(237, 179);
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private ListBox listBox1;
+ }
+}
diff --git a/FormLibrary/CustomListBox.cs b/FormLibrary/CustomListBox.cs
new file mode 100644
index 0000000..27fb348
--- /dev/null
+++ b/FormLibrary/CustomListBox.cs
@@ -0,0 +1,48 @@
+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.Header;
+
+namespace FormLibrary
+{
+ public partial class CustomListBox : UserControl
+ {
+
+ public event EventHandler? SelectedItemChanged;
+ public CustomListBox()
+ {
+ InitializeComponent();
+ }
+
+ public string SelectedItem
+ {
+ get => listBox1.SelectedItem?.ToString() ?? string.Empty;
+ set => listBox1.SelectedIndex = listBox1.Items.IndexOf(value);
+ }
+
+ private void ListBox1_SelectedIndexChanged(object? sender, EventArgs e)
+ {
+ SelectedItemChanged?.Invoke(this, EventArgs.Empty);
+ }
+ public void PopulateListBox(List items)
+ {
+ listBox1.Items.Clear();
+
+ foreach (var item in items)
+ {
+ listBox1.Items.Add(item);
+ }
+ }
+
+ public void ClearListBox()
+ {
+ listBox1.Items.Clear();
+ }
+ }
+}
diff --git a/FormLibrary/CustomListBox.resx b/FormLibrary/CustomListBox.resx
new file mode 100644
index 0000000..8b2ff64
--- /dev/null
+++ b/FormLibrary/CustomListBox.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/FormLibrary/Exceptions/EmptyValueException.cs b/FormLibrary/Exceptions/EmptyValueException.cs
new file mode 100644
index 0000000..9ac3854
--- /dev/null
+++ b/FormLibrary/Exceptions/EmptyValueException.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FormLibrary.Exceptions
+{
+ public class EmptyValueException : Exception
+ {
+ public EmptyValueException() : base("Значение не заполнено.") { }
+ }
+}
diff --git a/FormLibrary/Exceptions/InvalidValueTypeException.cs b/FormLibrary/Exceptions/InvalidValueTypeException.cs
new file mode 100644
index 0000000..09cc6df
--- /dev/null
+++ b/FormLibrary/Exceptions/InvalidValueTypeException.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FormLibrary.Exceptions
+{
+ public class InvalidValueTypeException : Exception
+ {
+ public InvalidValueTypeException() : base("Значение не соответствует требуемому типу.") { }
+ }
+}
diff --git a/FormLibrary/FormLibrary.csproj b/FormLibrary/FormLibrary.csproj
new file mode 100644
index 0000000..3e210aa
--- /dev/null
+++ b/FormLibrary/FormLibrary.csproj
@@ -0,0 +1,10 @@
+
+
+
+ net8.0-windows
+ enable
+ true
+ enable
+
+
+
diff --git a/FormLibrary/HelperClasses/ColumnConfig.cs b/FormLibrary/HelperClasses/ColumnConfig.cs
new file mode 100644
index 0000000..bcf1056
--- /dev/null
+++ b/FormLibrary/HelperClasses/ColumnConfig.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FormLibrary.HelperClasses
+{
+ public class ColumnConfig
+ {
+ public string HeaderText { get; set; }
+ public int Width { get; set; }
+ public bool IsVisible { get; set; }
+ public string PropertyName { get; set; }
+ }
+}
diff --git a/FormLibrary/HelperClasses/Student.cs b/FormLibrary/HelperClasses/Student.cs
new file mode 100644
index 0000000..b83d979
--- /dev/null
+++ b/FormLibrary/HelperClasses/Student.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FormLibrary.HelperClasses
+{
+ public class Student
+ {
+ public string Group { get; set; }
+ public string FullName { get; set; }
+ public int Course { get; set; }
+ }
+}
diff --git a/FormLibrary/IntegerInputControl.Designer.cs b/FormLibrary/IntegerInputControl.Designer.cs
new file mode 100644
index 0000000..91a5670
--- /dev/null
+++ b/FormLibrary/IntegerInputControl.Designer.cs
@@ -0,0 +1,68 @@
+namespace FormLibrary
+{
+ partial class IntegerInputControl
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ 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()
+ {
+ checkBoxNull = new CheckBox();
+ textBoxInput = new TextBox();
+ SuspendLayout();
+ //
+ // checkBoxNull
+ //
+ checkBoxNull.AutoSize = true;
+ checkBoxNull.Location = new Point(13, 17);
+ checkBoxNull.Name = "checkBoxNull";
+ checkBoxNull.Size = new Size(15, 14);
+ checkBoxNull.TabIndex = 0;
+ checkBoxNull.UseVisualStyleBackColor = true;
+ //
+ // textBoxInput
+ //
+ textBoxInput.Location = new Point(34, 13);
+ textBoxInput.Name = "textBoxInput";
+ textBoxInput.Size = new Size(100, 23);
+ textBoxInput.TabIndex = 1;
+ //
+ // IntegerInputControl
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(textBoxInput);
+ Controls.Add(checkBoxNull);
+ Name = "IntegerInputControl";
+ Size = new Size(146, 49);
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private CheckBox checkBoxNull;
+ private TextBox textBoxInput;
+ }
+}
diff --git a/FormLibrary/IntegerInputControl.cs b/FormLibrary/IntegerInputControl.cs
new file mode 100644
index 0000000..269c259
--- /dev/null
+++ b/FormLibrary/IntegerInputControl.cs
@@ -0,0 +1,82 @@
+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 System;
+using System.Windows.Forms;
+using FormLibrary.Exceptions;
+
+namespace FormLibrary
+{
+ public partial class IntegerInputControl : UserControl
+ {
+ public event EventHandler? ValueChanged;
+
+ public event EventHandler? CheckBoxChanged;
+
+ public IntegerInputControl()
+ {
+ InitializeComponent();
+
+ checkBoxNull.CheckedChanged += CheckBoxNull_CheckedChanged;
+ textBoxInput.TextChanged += TextBoxInput_TextChanged;
+ }
+
+ public int? Value
+ {
+ get
+ {
+ if (checkBoxNull.Checked)
+ {
+ return null;
+ }
+ else
+ {
+ if (string.IsNullOrWhiteSpace(textBoxInput.Text))
+ {
+ throw new EmptyValueException();
+ }
+
+ if (int.TryParse(textBoxInput.Text, out int result))
+ {
+ return result;
+ }
+ else
+ {
+ throw new InvalidValueTypeException();
+ }
+ }
+ }
+ set
+ {
+ if(value is not null)
+ {
+ textBoxInput.Text = value.ToString();
+ }
+ checkBoxNull.Checked = value is null;
+ }
+ }
+
+ private void CheckBoxNull_CheckedChanged(object sender, EventArgs e)
+ {
+ textBoxInput.Enabled = !checkBoxNull.Checked;
+ if (checkBoxNull.Checked)
+ {
+ textBoxInput.Text = string.Empty;
+ }
+ CheckBoxChanged?.Invoke(this, EventArgs.Empty);
+ }
+
+ private void TextBoxInput_TextChanged(object sender, EventArgs e)
+ {
+ ValueChanged?.Invoke(this, EventArgs.Empty);
+ }
+ }
+}
+
diff --git a/FormLibrary/IntegerInputControl.resx b/FormLibrary/IntegerInputControl.resx
new file mode 100644
index 0000000..8b2ff64
--- /dev/null
+++ b/FormLibrary/IntegerInputControl.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/FormLibrary/ValueTableControl.Designer.cs b/FormLibrary/ValueTableControl.Designer.cs
new file mode 100644
index 0000000..7ae2ab2
--- /dev/null
+++ b/FormLibrary/ValueTableControl.Designer.cs
@@ -0,0 +1,58 @@
+namespace FormLibrary
+{
+ partial class ValueTableControl
+ {
+ ///
+ /// Обязательная переменная конструктора.
+ ///
+ 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()
+ {
+ dataGridView1 = new DataGridView();
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
+ SuspendLayout();
+ //
+ // dataGridView1
+ //
+ dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView1.Location = new Point(3, 3);
+ dataGridView1.Name = "dataGridView1";
+ dataGridView1.Size = new Size(445, 363);
+ dataGridView1.TabIndex = 0;
+ //
+ // ValueTableControl
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ Controls.Add(dataGridView1);
+ Name = "ValueTableControl";
+ Size = new Size(451, 369);
+ ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private DataGridView dataGridView1;
+ }
+}
diff --git a/FormLibrary/ValueTableControl.cs b/FormLibrary/ValueTableControl.cs
new file mode 100644
index 0000000..d781aad
--- /dev/null
+++ b/FormLibrary/ValueTableControl.cs
@@ -0,0 +1,103 @@
+using FormLibrary.HelperClasses;
+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 FormLibrary
+{
+ public partial class ValueTableControl : UserControl
+ {
+ public ValueTableControl()
+ {
+ InitializeComponent();
+ ConfigureDataGridView();
+ }
+
+ private void ConfigureDataGridView()
+ {
+ dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
+ dataGridView1.MultiSelect = false;
+ dataGridView1.RowHeadersVisible = false;
+ dataGridView1.AllowUserToAddRows = false;
+
+ dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
+ }
+
+ public void ConfigureColumns(List<(string HeaderText, string DataPropertyName, float FillWeight)> columns)
+ {
+ dataGridView1.Columns.Clear();
+
+ foreach (var column in columns)
+ {
+ dataGridView1.Columns.Add(new DataGridViewTextBoxColumn
+ {
+ HeaderText = column.HeaderText,
+ DataPropertyName = column.DataPropertyName,
+ FillWeight = column.FillWeight
+ });
+ }
+ }
+ public void ClearRows()
+ {
+ dataGridView1.Rows.Clear();
+ }
+
+ public int SelectedRowIndex
+ {
+ get => dataGridView1.SelectedRows[0].Index;
+ set
+ {
+ if (value >= 0 && value < dataGridView1.Rows.Count)
+ {
+ dataGridView1.ClearSelection();
+ dataGridView1.Rows[value].Selected = true;
+ }
+ }
+ }
+
+ public T GetSelectedObject() where T : new()
+ {
+ if (dataGridView1.SelectedRows.Count == 0)
+ throw new InvalidOperationException("Нет выбранной строки.");
+
+ var selectedRow = dataGridView1.SelectedRows[0];
+ var obj = new T();
+
+ foreach (DataGridViewColumn column in dataGridView1.Columns)
+ {
+ var prop = typeof(T).GetProperty(column.DataPropertyName);
+ if (prop != null)
+ {
+ var value = selectedRow.Cells[column.Index].Value;
+ prop.SetValue(obj, Convert.ChangeType(value, prop.PropertyType));
+ }
+ }
+
+ return obj;
+ }
+
+ public void FillData(List objects)
+ {
+ dataGridView1.Rows.Clear();
+
+ if (objects == null || !objects.Any())
+ {
+ return;
+ }
+
+ var properties = typeof(T).GetProperties();
+
+ foreach (var obj in objects)
+ {
+ var values = properties.Select(p => p.GetValue(obj, null)).ToArray();
+ dataGridView1.Rows.Add(values);
+ }
+ }
+ }
+}
diff --git a/FormLibrary/ValueTableControl.resx b/FormLibrary/ValueTableControl.resx
new file mode 100644
index 0000000..8b2ff64
--- /dev/null
+++ b/FormLibrary/ValueTableControl.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/Forms/Forms.csproj b/Forms/Forms.csproj
new file mode 100644
index 0000000..07a9ca3
--- /dev/null
+++ b/Forms/Forms.csproj
@@ -0,0 +1,15 @@
+
+
+
+ WinExe
+ net8.0-windows
+ enable
+ true
+ enable
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Forms/MainForm.Designer.cs b/Forms/MainForm.Designer.cs
new file mode 100644
index 0000000..e572193
--- /dev/null
+++ b/Forms/MainForm.Designer.cs
@@ -0,0 +1,180 @@
+namespace Forms
+{
+ partial class MainForm
+ {
+ ///
+ /// 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()
+ {
+ customListBox1 = new FormLibrary.CustomListBox();
+ button1 = new Button();
+ button2 = new Button();
+ integerInputControl1 = new FormLibrary.IntegerInputControl();
+ button3 = new Button();
+ button4 = new Button();
+ textBox1 = new TextBox();
+ valueTableControl1 = new FormLibrary.ValueTableControl();
+ button5 = new Button();
+ button6 = new Button();
+ button7 = new Button();
+ SuspendLayout();
+ //
+ // customListBox1
+ //
+ customListBox1.Location = new Point(12, 12);
+ customListBox1.Name = "customListBox1";
+ customListBox1.SelectedItem = "";
+ customListBox1.Size = new Size(237, 176);
+ customListBox1.TabIndex = 0;
+ //
+ // button1
+ //
+ button1.Location = new Point(12, 194);
+ button1.Name = "button1";
+ button1.Size = new Size(237, 34);
+ button1.TabIndex = 1;
+ button1.Text = "Заполнить список";
+ button1.UseVisualStyleBackColor = true;
+ button1.Click += ButtonLoad_Click;
+ //
+ // button2
+ //
+ button2.Location = new Point(12, 234);
+ button2.Name = "button2";
+ button2.Size = new Size(237, 34);
+ button2.TabIndex = 2;
+ button2.Text = "Очистить список";
+ button2.UseVisualStyleBackColor = true;
+ button2.Click += ButtonClear_Click;
+ //
+ // integerInputControl1
+ //
+ integerInputControl1.Location = new Point(329, 12);
+ integerInputControl1.Name = "integerInputControl1";
+ integerInputControl1.Size = new Size(146, 56);
+ integerInputControl1.TabIndex = 3;
+ //
+ // button3
+ //
+ button3.Location = new Point(361, 74);
+ button3.Name = "button3";
+ button3.Size = new Size(103, 23);
+ button3.TabIndex = 4;
+ button3.Text = "Set";
+ button3.UseVisualStyleBackColor = true;
+ button3.Click += buttonInput_Click;
+ //
+ // button4
+ //
+ button4.Location = new Point(361, 103);
+ button4.Name = "button4";
+ button4.Size = new Size(103, 23);
+ button4.TabIndex = 5;
+ button4.Text = "Get";
+ button4.UseVisualStyleBackColor = true;
+ button4.Click += buttonOutput_Click;
+ //
+ // textBox1
+ //
+ textBox1.Location = new Point(329, 132);
+ textBox1.Name = "textBox1";
+ textBox1.Size = new Size(135, 23);
+ textBox1.TabIndex = 6;
+ //
+ // valueTableControl1
+ //
+ valueTableControl1.Location = new Point(487, 12);
+ valueTableControl1.Name = "valueTableControl1";
+ valueTableControl1.SelectedRowIndex = -1;
+ valueTableControl1.Size = new Size(450, 369);
+ valueTableControl1.TabIndex = 7;
+ //
+ // button5
+ //
+ button5.Location = new Point(487, 387);
+ button5.Name = "button5";
+ button5.Size = new Size(159, 51);
+ button5.TabIndex = 8;
+ button5.Text = "Заполнить таблицу";
+ button5.UseVisualStyleBackColor = true;
+ button5.Click += ButtonFillTable_Click;
+ //
+ // button6
+ //
+ button6.Location = new Point(652, 387);
+ button6.Name = "button6";
+ button6.Size = new Size(134, 51);
+ button6.TabIndex = 9;
+ button6.Text = "Очистить таблицу";
+ button6.UseVisualStyleBackColor = true;
+ button6.Click += ButtonClearTable_Click;
+ //
+ // button7
+ //
+ button7.Location = new Point(792, 387);
+ button7.Name = "button7";
+ button7.Size = new Size(148, 51);
+ button7.TabIndex = 10;
+ button7.Text = "Get";
+ button7.UseVisualStyleBackColor = true;
+ button7.Click += ButtonShowData_Click;
+ //
+ // MainForm
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(949, 450);
+ Controls.Add(button7);
+ Controls.Add(button6);
+ Controls.Add(button5);
+ Controls.Add(valueTableControl1);
+ Controls.Add(textBox1);
+ Controls.Add(button4);
+ Controls.Add(button3);
+ Controls.Add(integerInputControl1);
+ Controls.Add(button2);
+ Controls.Add(button1);
+ Controls.Add(customListBox1);
+ Name = "MainForm";
+ Text = "MainForm";
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private FormLibrary.CustomListBox customListBox1;
+ private Button button1;
+ private Button button2;
+ private FormLibrary.IntegerInputControl integerInputControl1;
+ private Button button3;
+ private Button button4;
+ private TextBox textBox1;
+ private FormLibrary.ValueTableControl valueTableControl1;
+ private Button button5;
+ private Button button6;
+ private Button button7;
+ }
+}
\ No newline at end of file
diff --git a/Forms/MainForm.cs b/Forms/MainForm.cs
new file mode 100644
index 0000000..e17ccb8
--- /dev/null
+++ b/Forms/MainForm.cs
@@ -0,0 +1,130 @@
+using FormLibrary;
+using FormLibrary.Exceptions;
+using FormLibrary.HelperClasses;
+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 System.Windows.Forms.VisualStyles;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.Header;
+
+namespace Forms
+{
+ public partial class MainForm : Form
+ {
+ private int? savedValue;
+ public MainForm()
+ {
+ InitializeComponent();
+ customListBox1.SelectedItemChanged += CustomListBox1_SelectedItemChanged;
+ integerInputControl1.ValueChanged += IntegerInputControl1_ValueChanged;
+ integerInputControl1.CheckBoxChanged += IntegerInputControl_CheckBoxChanged;
+ }
+
+ private void CustomListBox1_SelectedItemChanged(object? sender, EventArgs e)
+ {
+ if (sender is CustomListBox customListBox)
+ {
+ string selectedItem = customListBox.SelectedItem;
+ MessageBox.Show($"Выбранный элемент: {selectedItem}", "Выбор элемента", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ private void ButtonLoad_Click(object? sender, EventArgs e)
+ {
+ List items = new List();
+ for (int i = 0; i <= 5; i++)
+ {
+ items.Add("Item " + i.ToString());
+ }
+
+ customListBox1.PopulateListBox(items);
+ }
+
+ private void ButtonClear_Click(object? sender, EventArgs e)
+ {
+ customListBox1.ClearListBox();
+ }
+ private void buttonInput_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ savedValue = integerInputControl1.Value;
+ MessageBox.Show("Значение успешно сохранено.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ catch (EmptyValueException ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ catch (InvalidValueTypeException ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void buttonOutput_Click(object sender, EventArgs e)
+ {
+ if (savedValue.HasValue)
+ {
+ MessageBox.Show($"Сохраненное значение: {savedValue}", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ {
+ MessageBox.Show("Сохраненное значение: null", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ private void IntegerInputControl1_ValueChanged(object? sender, EventArgs e)
+ {
+ textBox1.Text = "Textbox changed";
+ }
+
+ private void IntegerInputControl_CheckBoxChanged(object? sender, EventArgs e)
+ {
+ textBox1.Text = "Checkbox changed";
+ }
+ private void ButtonFillTable_Click(object sender, EventArgs e)
+ {
+ var columns = new List<(string HeaderText, string DataPropertyName, float FillWeight)>
+ {
+ ("Группа", "Group", 30),
+ ("ФИО", "FullName", 50),
+ ("Курс", "Course", 20)
+ };
+ valueTableControl1.ConfigureColumns(columns);
+
+ var students = new List
+ {
+ new Student { Group = "Пибд-31", FullName = "Иванов Иван Иванович", Course = 3 },
+ new Student { Group = "Пибд-31", FullName = "Петров Петр Петрович", Course = 2 },
+ new Student { Group = "Пибд-31", FullName = "Антонов Антон Антонович", Course = 1 }
+ };
+
+ valueTableControl1.FillData(students);
+ }
+
+ private void ButtonClearTable_Click(object sender, EventArgs e)
+ {
+ valueTableControl1.ClearRows();
+ }
+
+ private void ButtonShowData_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ var selectedStudent = valueTableControl1.GetSelectedObject();
+ MessageBox.Show($"Группа: {selectedStudent.Group}, ФИО: {selectedStudent.FullName}, Курс: {selectedStudent.Course}",
+ "Выбранный студент",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ }
+ catch (InvalidOperationException ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+}
diff --git a/Forms/MainForm.resx b/Forms/MainForm.resx
new file mode 100644
index 0000000..8b2ff64
--- /dev/null
+++ b/Forms/MainForm.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/Forms/Program.cs b/Forms/Program.cs
new file mode 100644
index 0000000..ff6d1a9
--- /dev/null
+++ b/Forms/Program.cs
@@ -0,0 +1,17 @@
+namespace Forms
+{
+ internal static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ // To customize application configuration such as set high DPI settings or default font,
+ // see https://aka.ms/applicationconfiguration.
+ ApplicationConfiguration.Initialize();
+ Application.Run(new MainForm());
+ }
+ }
+}
\ No newline at end of file
diff --git a/KopLab1.sln b/KopLab1.sln
new file mode 100644
index 0000000..5506f5f
--- /dev/null
+++ b/KopLab1.sln
@@ -0,0 +1,31 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.11.35222.181
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FormLibrary", "FormLibrary\FormLibrary.csproj", "{E840E4D9-B195-449A-AB24-ECAAE2655D58}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Forms", "Forms\Forms.csproj", "{83F3C50D-D872-48B6-8932-1D5B7E0A40F0}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {E840E4D9-B195-449A-AB24-ECAAE2655D58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E840E4D9-B195-449A-AB24-ECAAE2655D58}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E840E4D9-B195-449A-AB24-ECAAE2655D58}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E840E4D9-B195-449A-AB24-ECAAE2655D58}.Release|Any CPU.Build.0 = Release|Any CPU
+ {83F3C50D-D872-48B6-8932-1D5B7E0A40F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {83F3C50D-D872-48B6-8932-1D5B7E0A40F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {83F3C50D-D872-48B6-8932-1D5B7E0A40F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {83F3C50D-D872-48B6-8932-1D5B7E0A40F0}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {C6DEED66-161D-4CE7-B327-9DB0A6D32439}
+ EndGlobalSection
+EndGlobal