Merge pull request 'LABWORK-1' (#1) from LABWORK-1 into dev
Reviewed-on: #1
This commit is contained in:
commit
2f1ed5603e
@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.10.35122.118
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cop.Borovkov.Var3", "Cop.Borovkov.Var3\Cop.Borovkov.Var3.csproj", "{A8604186-0CDE-4504-805B-46104141269A}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cop.Borovkov.Var3", "Cop.Borovkov.Var3\Cop.Borovkov.Var3.csproj", "{A8604186-0CDE-4504-805B-46104141269A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestCustomComponents", "TestCustomComponents\TestCustomComponents.csproj", "{E2C46D08-ACCE-4547-922B-E92AD76D99C8}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@ -15,6 +17,10 @@ Global
|
||||
{A8604186-0CDE-4504-805B-46104141269A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A8604186-0CDE-4504-805B-46104141269A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A8604186-0CDE-4504-805B-46104141269A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E2C46D08-ACCE-4547-922B-E92AD76D99C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E2C46D08-ACCE-4547-922B-E92AD76D99C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E2C46D08-ACCE-4547-922B-E92AD76D99C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E2C46D08-ACCE-4547-922B-E92AD76D99C8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
63
Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomDataTable.Designer.cs
generated
Normal file
63
Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomDataTable.Designer.cs
generated
Normal file
@ -0,0 +1,63 @@
|
||||
namespace Cop.Borovkov.Var3.Components
|
||||
{
|
||||
partial class CustomDataTable
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
outDataGridView = new DataGridView();
|
||||
((System.ComponentModel.ISupportInitialize)outDataGridView).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// outDataGridView
|
||||
//
|
||||
outDataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
outDataGridView.ColumnHeadersVisible = false;
|
||||
outDataGridView.Dock = DockStyle.Fill;
|
||||
outDataGridView.Location = new Point(0, 0);
|
||||
outDataGridView.Name = "outDataGridView";
|
||||
outDataGridView.RowHeadersVisible = false;
|
||||
outDataGridView.RowHeadersWidth = 51;
|
||||
outDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
|
||||
outDataGridView.Size = new Size(849, 396);
|
||||
outDataGridView.TabIndex = 0;
|
||||
//
|
||||
// CustomDataTable
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
Controls.Add(outDataGridView);
|
||||
Name = "CustomDataTable";
|
||||
Size = new Size(849, 396);
|
||||
((System.ComponentModel.ISupportInitialize)outDataGridView).EndInit();
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private DataGridView outDataGridView;
|
||||
}
|
||||
}
|
@ -0,0 +1,124 @@
|
||||
using Cop.Borovkov.Var3.Models;
|
||||
|
||||
namespace Cop.Borovkov.Var3.Components
|
||||
{
|
||||
/// <summary>
|
||||
/// Визуальный компонент вывода таблицы значений
|
||||
/// </summary>
|
||||
public partial class CustomDataTable : UserControl
|
||||
{
|
||||
/// <summary>
|
||||
/// </summary>
|
||||
public CustomDataTable()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Определить структуру таблицы
|
||||
/// </summary>
|
||||
/// <param name="columnParameters"></param>
|
||||
public void ConfigureColumns(params CustomDataTableColumnParameter[] columnParameters)
|
||||
{
|
||||
outDataGridView.Columns.Clear();
|
||||
|
||||
foreach (var columnParametr in columnParameters)
|
||||
{
|
||||
DataGridViewTextBoxColumn column = new()
|
||||
{
|
||||
Name = columnParametr.HeaderName,
|
||||
HeaderText = columnParametr.HeaderName,
|
||||
DataPropertyName = columnParametr.PropertyName,
|
||||
Visible = columnParametr.Visible,
|
||||
};
|
||||
|
||||
if (columnParametr.Width != 0)
|
||||
{
|
||||
column.Width = columnParametr.Width;
|
||||
}
|
||||
else
|
||||
{
|
||||
column.AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
|
||||
}
|
||||
|
||||
outDataGridView.Columns.Add(column);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Отчистить таблицу
|
||||
/// </summary>
|
||||
public void Clear()
|
||||
=> outDataGridView.Rows.Clear();
|
||||
|
||||
/// <summary>
|
||||
/// Индекс выбранной строки
|
||||
/// </summary>
|
||||
public int SelectedRow
|
||||
{
|
||||
get => outDataGridView.CurrentRow.Index;
|
||||
|
||||
set
|
||||
{
|
||||
outDataGridView.CurrentRow.Selected = false;
|
||||
outDataGridView.Rows[value].Selected = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Получить стоку таблицы в виде объекта
|
||||
/// </summary>
|
||||
/// <typeparam name="TType"></typeparam>
|
||||
/// <param name="rowIndex"></param>
|
||||
/// <returns></returns>
|
||||
public TType? GetRow<TType>(int rowIndex) where TType : new()
|
||||
{
|
||||
Type type = typeof(TType);
|
||||
var element = new TType();
|
||||
|
||||
if (element is null)
|
||||
{
|
||||
return default;
|
||||
}
|
||||
|
||||
var row = outDataGridView.Rows[rowIndex].Cells;
|
||||
|
||||
for (int i = 0; i < row.Count; i++)
|
||||
{
|
||||
if (string.IsNullOrEmpty(row[i].OwningColumn.DataPropertyName))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var field = type.GetProperty(row[i].OwningColumn.DataPropertyName);
|
||||
field?.SetValue(element, row[i].Value);
|
||||
}
|
||||
|
||||
return element;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Заполнить таблицу
|
||||
/// </summary>
|
||||
/// <typeparam name="TType"></typeparam>
|
||||
/// <param name="insertValues"></param>
|
||||
public void Fill<TType>(IList<TType> insertValues)
|
||||
{
|
||||
Clear();
|
||||
|
||||
Type type = typeof(TType);
|
||||
|
||||
for (int i = 0; i < insertValues.Count(); ++i)
|
||||
{
|
||||
var row = insertValues[i];
|
||||
outDataGridView.Rows.Add();
|
||||
|
||||
for (int j = 0; j < outDataGridView.ColumnCount; ++j)
|
||||
{
|
||||
outDataGridView.Rows[i].Cells[j].Value
|
||||
= type.GetProperty(outDataGridView.Columns[j].DataPropertyName)?.GetValue(row)!;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<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>
|
61
Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomListBox.Designer.cs
generated
Normal file
61
Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomListBox.Designer.cs
generated
Normal file
@ -0,0 +1,61 @@
|
||||
namespace Cop.Borovkov.Var3.Components
|
||||
{
|
||||
partial class CustomListBox
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
InerlistBox = new ListBox();
|
||||
SuspendLayout();
|
||||
//
|
||||
// InerlistBox
|
||||
//
|
||||
InerlistBox.Dock = DockStyle.Fill;
|
||||
InerlistBox.FormattingEnabled = true;
|
||||
InerlistBox.ItemHeight = 15;
|
||||
InerlistBox.Location = new Point(0, 0);
|
||||
InerlistBox.Margin = new Padding(3, 2, 3, 2);
|
||||
InerlistBox.Name = "InerlistBox";
|
||||
InerlistBox.Size = new Size(131, 112);
|
||||
InerlistBox.TabIndex = 0;
|
||||
InerlistBox.SelectedIndexChanged += InerlistBox_SelectedIndexChanged;
|
||||
//
|
||||
// CustomListBox
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
Controls.Add(InerlistBox);
|
||||
Margin = new Padding(3, 2, 3, 2);
|
||||
Name = "CustomListBox";
|
||||
Size = new Size(131, 112);
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private ListBox InerlistBox;
|
||||
}
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
namespace Cop.Borovkov.Var3.Components
|
||||
{
|
||||
/// <summary>
|
||||
/// Визуальный компонент выбора из списка значений
|
||||
/// </summary>
|
||||
public partial class CustomListBox : UserControl
|
||||
{
|
||||
private event EventHandler? _selectedChanged;
|
||||
private event Action<Exception>? _errorOccured;
|
||||
|
||||
/// <summary>
|
||||
/// </summary>
|
||||
public CustomListBox()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Событие возникающие при изменении списка
|
||||
/// </summary>
|
||||
public event EventHandler ValueChanged
|
||||
{
|
||||
add => _selectedChanged += value;
|
||||
remove => _selectedChanged -= value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Обработка ошибок
|
||||
/// </summary>
|
||||
public event Action<Exception> AnErrorOccurred
|
||||
{
|
||||
add => _errorOccured += value;
|
||||
remove => _errorOccured -= value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Заполнить список значениями
|
||||
/// </summary>
|
||||
/// <param name="strings">Список значений</param>
|
||||
public void FillValues(IEnumerable<string> strings)
|
||||
{
|
||||
InerlistBox.Items.Clear();
|
||||
InerlistBox.Items.AddRange(strings.ToArray());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Очистить список
|
||||
/// </summary>
|
||||
public void Clear()
|
||||
{
|
||||
InerlistBox.ClearSelected();
|
||||
InerlistBox.DataSource = null;
|
||||
InerlistBox.Items.Clear();
|
||||
InerlistBox.Refresh();
|
||||
}
|
||||
|
||||
private void InerlistBox_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
_selectedChanged?.Invoke(sender, e);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_errorOccured?.Invoke(ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Выбранное значение
|
||||
/// </summary>
|
||||
public string Selected
|
||||
{
|
||||
get => (string?)InerlistBox.SelectedItem ?? string.Empty;
|
||||
set => InerlistBox.SelectedItem = value;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<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>
|
74
Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomNumericInputField.Designer.cs
generated
Normal file
74
Cop.Borovkov.Var3/Cop.Borovkov.Var3/Components/CustomNumericInputField.Designer.cs
generated
Normal file
@ -0,0 +1,74 @@
|
||||
namespace Cop.Borovkov.Var3.Components
|
||||
{
|
||||
partial class CustomNumericInputField
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
isNullcheckBox = new CheckBox();
|
||||
inputField = new TextBox();
|
||||
SuspendLayout();
|
||||
//
|
||||
// isNullcheckBox
|
||||
//
|
||||
isNullcheckBox.AutoSize = true;
|
||||
isNullcheckBox.Location = new Point(3, 7);
|
||||
isNullcheckBox.Margin = new Padding(3, 2, 3, 2);
|
||||
isNullcheckBox.Name = "isNullcheckBox";
|
||||
isNullcheckBox.Size = new Size(18, 17);
|
||||
isNullcheckBox.TabIndex = 0;
|
||||
isNullcheckBox.UseVisualStyleBackColor = true;
|
||||
isNullcheckBox.CheckedChanged += IsNullcheckBox_CheckedChanged;
|
||||
//
|
||||
// inputField
|
||||
//
|
||||
inputField.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
inputField.Location = new Point(24, 2);
|
||||
inputField.Margin = new Padding(3, 2, 3, 2);
|
||||
inputField.Name = "inputField";
|
||||
inputField.Size = new Size(173, 23);
|
||||
inputField.TabIndex = 1;
|
||||
inputField.TextChanged += InputField_TextChanged;
|
||||
//
|
||||
// CustomNumericInputField
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
Controls.Add(inputField);
|
||||
Controls.Add(isNullcheckBox);
|
||||
Margin = new Padding(3, 2, 3, 2);
|
||||
Name = "CustomNumericInputField";
|
||||
Size = new Size(199, 26);
|
||||
ResumeLayout(false);
|
||||
PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private CheckBox isNullcheckBox;
|
||||
private TextBox inputField;
|
||||
}
|
||||
}
|
@ -0,0 +1,99 @@
|
||||
using Cop.Borovkov.Var3.Exceptions;
|
||||
|
||||
namespace Cop.Borovkov.Var3.Components
|
||||
{
|
||||
/// <summary>
|
||||
/// Визуальный компонент ввода целочисленного значения допускающего null
|
||||
/// </summary>
|
||||
public partial class CustomNumericInputField : UserControl
|
||||
{
|
||||
private event EventHandler? _numericInputChanged;
|
||||
|
||||
private event Action<Exception>? _errorOccured;
|
||||
|
||||
/// <summary>
|
||||
/// </summary>
|
||||
public CustomNumericInputField()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Событие возникающие при изменении поля ввода
|
||||
/// </summary>
|
||||
public event EventHandler NumericInputChanged
|
||||
{
|
||||
add => _numericInputChanged += value;
|
||||
remove => _numericInputChanged -= value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Обработка ошибок
|
||||
/// </summary>
|
||||
public event Action<Exception> AnErrorOccurred
|
||||
{
|
||||
add => _errorOccured += value;
|
||||
remove => _errorOccured -= value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Значения поля ввода
|
||||
/// </summary>
|
||||
public int? Value
|
||||
{
|
||||
get
|
||||
{
|
||||
if (isNullcheckBox.Checked)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (int.TryParse(inputField.Text, out var value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
throw new InvalidNumericInputValueException();
|
||||
}
|
||||
set
|
||||
{
|
||||
isNullcheckBox.Checked = value is null;
|
||||
|
||||
if (!isNullcheckBox.Checked)
|
||||
{
|
||||
inputField.Text = value.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void IsNullcheckBox_CheckedChanged(object sender, EventArgs e)
|
||||
{
|
||||
inputField.Enabled = !isNullcheckBox.Checked;
|
||||
if (!inputField.Enabled)
|
||||
{
|
||||
inputField.Text = string.Empty;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_numericInputChanged?.Invoke(sender, e);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_errorOccured?.Invoke(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void InputField_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
_numericInputChanged?.Invoke(sender, e);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_errorOccured?.Invoke(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<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>
|
@ -0,0 +1,9 @@
|
||||
namespace Cop.Borovkov.Var3.Exceptions
|
||||
{
|
||||
public class InvalidNumericInputValueException : Exception
|
||||
{
|
||||
public InvalidNumericInputValueException() { }
|
||||
|
||||
public InvalidNumericInputValueException(string message) : base(message) { }
|
||||
}
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
namespace Cop.Borovkov.Var3.Models
|
||||
{
|
||||
public record CustomDataTableColumnParameter
|
||||
{
|
||||
public string HeaderName { get; init; } = string.Empty;
|
||||
|
||||
public int Width { get; init; } = 0;
|
||||
|
||||
public bool Visible { get; init; } = true;
|
||||
|
||||
public string PropertyName { get; init; } = string.Empty;
|
||||
}
|
||||
}
|
246
Cop.Borovkov.Var3/TestCustomComponents/Forms/Form1.Designer.cs
generated
Normal file
246
Cop.Borovkov.Var3/TestCustomComponents/Forms/Form1.Designer.cs
generated
Normal file
@ -0,0 +1,246 @@
|
||||
namespace TestCustomComponents
|
||||
{
|
||||
partial class Form1
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
customDataTable1 = new Cop.Borovkov.Var3.Components.CustomDataTable();
|
||||
customListBox1 = new Cop.Borovkov.Var3.Components.CustomListBox();
|
||||
customNumericInputField1 = new Cop.Borovkov.Var3.Components.CustomNumericInputField();
|
||||
button1 = new Button();
|
||||
button2 = new Button();
|
||||
button3 = new Button();
|
||||
richTextBox1 = new RichTextBox();
|
||||
button4 = new Button();
|
||||
button5 = new Button();
|
||||
button6 = new Button();
|
||||
button7 = new Button();
|
||||
button8 = new Button();
|
||||
button9 = new Button();
|
||||
button10 = new Button();
|
||||
button11 = new Button();
|
||||
button12 = new Button();
|
||||
SuspendLayout();
|
||||
//
|
||||
// customDataTable1
|
||||
//
|
||||
customDataTable1.Location = new Point(297, 23);
|
||||
customDataTable1.Name = "customDataTable1";
|
||||
customDataTable1.Size = new Size(491, 212);
|
||||
customDataTable1.TabIndex = 0;
|
||||
//
|
||||
// customListBox1
|
||||
//
|
||||
customListBox1.Location = new Point(12, 11);
|
||||
customListBox1.Margin = new Padding(3, 2, 3, 2);
|
||||
customListBox1.Name = "customListBox1";
|
||||
customListBox1.Selected = "";
|
||||
customListBox1.Size = new Size(164, 140);
|
||||
customListBox1.TabIndex = 1;
|
||||
//
|
||||
// customNumericInputField1
|
||||
//
|
||||
customNumericInputField1.Location = new Point(12, 155);
|
||||
customNumericInputField1.Margin = new Padding(3, 2, 3, 2);
|
||||
customNumericInputField1.Name = "customNumericInputField1";
|
||||
customNumericInputField1.Size = new Size(249, 32);
|
||||
customNumericInputField1.TabIndex = 2;
|
||||
//
|
||||
// button1
|
||||
//
|
||||
button1.Location = new Point(26, 309);
|
||||
button1.Name = "button1";
|
||||
button1.Size = new Size(94, 29);
|
||||
button1.TabIndex = 3;
|
||||
button1.Text = "button1";
|
||||
button1.UseVisualStyleBackColor = true;
|
||||
button1.Click += button1_Click;
|
||||
//
|
||||
// button2
|
||||
//
|
||||
button2.Location = new Point(126, 309);
|
||||
button2.Name = "button2";
|
||||
button2.Size = new Size(94, 29);
|
||||
button2.TabIndex = 4;
|
||||
button2.Text = "button2";
|
||||
button2.UseVisualStyleBackColor = true;
|
||||
button2.Click += button2_Click;
|
||||
//
|
||||
// button3
|
||||
//
|
||||
button3.Location = new Point(226, 309);
|
||||
button3.Name = "button3";
|
||||
button3.Size = new Size(94, 29);
|
||||
button3.TabIndex = 5;
|
||||
button3.Text = "button3";
|
||||
button3.UseVisualStyleBackColor = true;
|
||||
button3.Click += button3_Click;
|
||||
//
|
||||
// richTextBox1
|
||||
//
|
||||
richTextBox1.Location = new Point(567, 241);
|
||||
richTextBox1.Name = "richTextBox1";
|
||||
richTextBox1.Size = new Size(125, 165);
|
||||
richTextBox1.TabIndex = 6;
|
||||
richTextBox1.Text = "";
|
||||
//
|
||||
// button4
|
||||
//
|
||||
button4.Location = new Point(698, 241);
|
||||
button4.Name = "button4";
|
||||
button4.Size = new Size(94, 29);
|
||||
button4.TabIndex = 7;
|
||||
button4.Text = "button4";
|
||||
button4.UseVisualStyleBackColor = true;
|
||||
button4.Click += button4_Click;
|
||||
//
|
||||
// button5
|
||||
//
|
||||
button5.Location = new Point(26, 344);
|
||||
button5.Name = "button5";
|
||||
button5.Size = new Size(94, 29);
|
||||
button5.TabIndex = 8;
|
||||
button5.Text = "button5";
|
||||
button5.UseVisualStyleBackColor = true;
|
||||
button5.Click += button5_Click;
|
||||
//
|
||||
// button6
|
||||
//
|
||||
button6.Location = new Point(126, 344);
|
||||
button6.Name = "button6";
|
||||
button6.Size = new Size(94, 29);
|
||||
button6.TabIndex = 9;
|
||||
button6.Text = "button6";
|
||||
button6.UseVisualStyleBackColor = true;
|
||||
button6.Click += button6_Click;
|
||||
//
|
||||
// button7
|
||||
//
|
||||
button7.Location = new Point(226, 344);
|
||||
button7.Name = "button7";
|
||||
button7.Size = new Size(94, 29);
|
||||
button7.TabIndex = 10;
|
||||
button7.Text = "button7";
|
||||
button7.UseVisualStyleBackColor = true;
|
||||
button7.Click += button7_Click;
|
||||
//
|
||||
// button8
|
||||
//
|
||||
button8.Location = new Point(26, 379);
|
||||
button8.Name = "button8";
|
||||
button8.Size = new Size(94, 29);
|
||||
button8.TabIndex = 11;
|
||||
button8.Text = "button8";
|
||||
button8.UseVisualStyleBackColor = true;
|
||||
button8.Click += button8_Click;
|
||||
//
|
||||
// button9
|
||||
//
|
||||
button9.Location = new Point(126, 377);
|
||||
button9.Name = "button9";
|
||||
button9.Size = new Size(94, 29);
|
||||
button9.TabIndex = 12;
|
||||
button9.Text = "button9";
|
||||
button9.UseVisualStyleBackColor = true;
|
||||
button9.Click += button9_Click;
|
||||
//
|
||||
// button10
|
||||
//
|
||||
button10.Location = new Point(226, 377);
|
||||
button10.Name = "button10";
|
||||
button10.Size = new Size(94, 29);
|
||||
button10.TabIndex = 13;
|
||||
button10.Text = "button10";
|
||||
button10.UseVisualStyleBackColor = true;
|
||||
button10.Click += button10_Click;
|
||||
//
|
||||
// button11
|
||||
//
|
||||
button11.Location = new Point(26, 414);
|
||||
button11.Name = "button11";
|
||||
button11.Size = new Size(94, 29);
|
||||
button11.TabIndex = 14;
|
||||
button11.Text = "button11";
|
||||
button11.UseVisualStyleBackColor = true;
|
||||
button11.Click += button11_Click;
|
||||
//
|
||||
// button12
|
||||
//
|
||||
button12.Location = new Point(126, 414);
|
||||
button12.Name = "button12";
|
||||
button12.Size = new Size(94, 29);
|
||||
button12.TabIndex = 15;
|
||||
button12.Text = "button12";
|
||||
button12.UseVisualStyleBackColor = true;
|
||||
button12.Click += button12_Click;
|
||||
//
|
||||
// Form1
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(7F, 15F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(800, 450);
|
||||
Controls.Add(button12);
|
||||
Controls.Add(button11);
|
||||
Controls.Add(button10);
|
||||
Controls.Add(button9);
|
||||
Controls.Add(button8);
|
||||
Controls.Add(button7);
|
||||
Controls.Add(button6);
|
||||
Controls.Add(button5);
|
||||
Controls.Add(button4);
|
||||
Controls.Add(richTextBox1);
|
||||
Controls.Add(button3);
|
||||
Controls.Add(button2);
|
||||
Controls.Add(button1);
|
||||
Controls.Add(customNumericInputField1);
|
||||
Controls.Add(customListBox1);
|
||||
Controls.Add(customDataTable1);
|
||||
Name = "Form1";
|
||||
Text = "Form1";
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private Cop.Borovkov.Var3.Components.CustomDataTable customDataTable1;
|
||||
private Cop.Borovkov.Var3.Components.CustomListBox customListBox1;
|
||||
private Cop.Borovkov.Var3.Components.CustomNumericInputField customNumericInputField1;
|
||||
private Button button1;
|
||||
private Button button2;
|
||||
private Button button3;
|
||||
private RichTextBox richTextBox1;
|
||||
private Button button4;
|
||||
private Button button5;
|
||||
private Button button6;
|
||||
private Button button7;
|
||||
private Button button8;
|
||||
private Button button9;
|
||||
private Button button10;
|
||||
private Button button11;
|
||||
private Button button12;
|
||||
}
|
||||
}
|
122
Cop.Borovkov.Var3/TestCustomComponents/Forms/Form1.cs
Normal file
122
Cop.Borovkov.Var3/TestCustomComponents/Forms/Form1.cs
Normal file
@ -0,0 +1,122 @@
|
||||
using TestCustomComponents.Models;
|
||||
|
||||
namespace TestCustomComponents
|
||||
{
|
||||
public partial class Form1 : Form
|
||||
{
|
||||
public Form1()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void Log(string message)
|
||||
{
|
||||
richTextBox1.Text = $"{richTextBox1.Text}\n{message}";
|
||||
}
|
||||
|
||||
private void button1_Click(object sender, EventArgs e)
|
||||
{
|
||||
customListBox1.AnErrorOccurred += ex => Log(ex.Message);
|
||||
customListBox1.ValueChanged += (obj, sender) => Log($"Selected1 is {customListBox1.Selected}");
|
||||
customNumericInputField1.AnErrorOccurred += ex => Log(ex.Message);
|
||||
customNumericInputField1.NumericInputChanged += (obj, sender) => Log("Test 4 ok");
|
||||
|
||||
customListBox1.FillValues(["hello", "world", "123", "321"]);
|
||||
|
||||
customListBox1.Selected = "123";
|
||||
}
|
||||
|
||||
private void button2_Click(object sender, EventArgs e)
|
||||
{
|
||||
customListBox1.Clear();
|
||||
customListBox1.Selected = "234";
|
||||
}
|
||||
|
||||
private void button3_Click(object sender, EventArgs e)
|
||||
{
|
||||
Log($"Selected2 is {customNumericInputField1.Value?.ToString() ?? "null"}");
|
||||
}
|
||||
|
||||
private void button4_Click(object sender, EventArgs e)
|
||||
{
|
||||
richTextBox1.Clear();
|
||||
}
|
||||
|
||||
private void button5_Click(object sender, EventArgs e)
|
||||
{
|
||||
customNumericInputField1.Value = 3333;
|
||||
}
|
||||
|
||||
private void button6_Click(object sender, EventArgs e)
|
||||
{
|
||||
customNumericInputField1.Value = null;
|
||||
}
|
||||
|
||||
private void button7_Click(object sender, EventArgs e)
|
||||
{
|
||||
customDataTable1.ConfigureColumns(
|
||||
new()
|
||||
{
|
||||
HeaderName = "Id",
|
||||
PropertyName = nameof(TestModel.Id),
|
||||
Visible = false,
|
||||
},
|
||||
new()
|
||||
{
|
||||
HeaderName = "Name",
|
||||
PropertyName = nameof(TestModel.Name),
|
||||
Width = 100,
|
||||
},
|
||||
new()
|
||||
{
|
||||
HeaderName = "Age",
|
||||
PropertyName = nameof(TestModel.Age),
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
private void button8_Click(object sender, EventArgs e)
|
||||
{
|
||||
customDataTable1.Fill<TestModel>([
|
||||
new(){
|
||||
Id = 1,
|
||||
Name = "Vasya",
|
||||
Age = 5,
|
||||
},
|
||||
new()
|
||||
{
|
||||
Id = 2,
|
||||
Name = "Vilthare",
|
||||
Age = 3,
|
||||
},
|
||||
new()
|
||||
{
|
||||
Id = 3,
|
||||
Name = "MOMO",
|
||||
Age = 10,
|
||||
},
|
||||
]);
|
||||
}
|
||||
|
||||
private void button9_Click(object sender, EventArgs e)
|
||||
{
|
||||
customDataTable1.Clear();
|
||||
}
|
||||
|
||||
private void button10_Click(object sender, EventArgs e)
|
||||
{
|
||||
Log($"selected3 {customDataTable1.SelectedRow}");
|
||||
}
|
||||
|
||||
private void button11_Click(object sender, EventArgs e)
|
||||
{
|
||||
customDataTable1.SelectedRow = customNumericInputField1.Value!.Value;
|
||||
}
|
||||
|
||||
private void button12_Click(object sender, EventArgs e)
|
||||
{
|
||||
var elem = customDataTable1.GetRow<TestModel>(customDataTable1.SelectedRow)!;
|
||||
Log($"Selected: id={elem.Id} name={elem.Name} age={elem.Age}");
|
||||
}
|
||||
}
|
||||
}
|
120
Cop.Borovkov.Var3/TestCustomComponents/Forms/Form1.resx
Normal file
120
Cop.Borovkov.Var3/TestCustomComponents/Forms/Form1.resx
Normal file
@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<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>
|
11
Cop.Borovkov.Var3/TestCustomComponents/Models/TestModel.cs
Normal file
11
Cop.Borovkov.Var3/TestCustomComponents/Models/TestModel.cs
Normal file
@ -0,0 +1,11 @@
|
||||
namespace TestCustomComponents.Models
|
||||
{
|
||||
public class TestModel
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
|
||||
public int Age { get; set; }
|
||||
}
|
||||
}
|
17
Cop.Borovkov.Var3/TestCustomComponents/Program.cs
Normal file
17
Cop.Borovkov.Var3/TestCustomComponents/Program.cs
Normal file
@ -0,0 +1,17 @@
|
||||
namespace TestCustomComponents
|
||||
{
|
||||
internal static class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[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 Form1());
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<TargetFramework>net8.0-windows</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<UseWindowsForms>true</UseWindowsForms>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Cop.Borovkov.Var3\Cop.Borovkov.Var3.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
Loading…
Reference in New Issue
Block a user