нарабкот по выводу элемента для добавления и редактирования

This commit is contained in:
kotcheshir73 2021-03-29 23:16:11 +04:00
parent 9325f592e1
commit da3e126579
46 changed files with 1440 additions and 116 deletions

View File

@ -21,7 +21,7 @@ namespace DatabaseCore.Models.Security
[Required] [Required]
[DataMember] [DataMember]
[MapConfiguration("Operation")] [MapConfiguration("AccessOperation")]
public AccessOperation AccessOperation { get; set; } public AccessOperation AccessOperation { get; set; }
[Required] [Required]

View File

@ -0,0 +1,71 @@

namespace DesktopTools.BaseControls
{
partial class AbstractBaseControl
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
protected 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()
{
this.labelTitle = new System.Windows.Forms.Label();
this.panelControl = new System.Windows.Forms.Panel();
this.SuspendLayout();
//
// labelTitle
//
this.labelTitle.Dock = System.Windows.Forms.DockStyle.Left;
this.labelTitle.Location = new System.Drawing.Point(0, 0);
this.labelTitle.Name = "labelTitle";
this.labelTitle.Size = new System.Drawing.Size(93, 25);
this.labelTitle.TabIndex = 0;
this.labelTitle.Text = "Наименование:";
this.labelTitle.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// panelControl
//
this.panelControl.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelControl.Location = new System.Drawing.Point(93, 0);
this.panelControl.Name = "panelControl";
this.panelControl.Size = new System.Drawing.Size(407, 25);
this.panelControl.TabIndex = 1;
//
// BaseControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.panelControl);
this.Controls.Add(this.labelTitle);
this.Name = "BaseControl";
this.Size = new System.Drawing.Size(500, 25);
this.ResumeLayout(false);
}
#endregion
protected System.Windows.Forms.Label labelTitle;
protected System.Windows.Forms.Panel panelControl;
}
}

View File

@ -0,0 +1,121 @@
using ModuleTools.Extensions;
using System;
using System.Windows.Forms;
namespace DesktopTools.BaseControls
{
public abstract partial class AbstractBaseControl : UserControl
{
/// <summary>
/// Оригинальное значение (требуется при откате изменений)
/// </summary>
protected object _originalValue;
/// <summary>
/// Необходимость проверки при получении данных
/// </summary>
protected bool _mustCheckValue;
/// <summary>
/// Название свойства, по которму идет отображение
/// </summary>
protected string PropertyName { get; private set; }
/// <summary>
/// Событие изменения значения в контроле
/// </summary>
protected event Action OnValueChange;
/// <summary>
/// Событие изменения значения в контроле
/// </summary>
public event Action OnValueChangeEvent { add { OnValueChange += value; } remove { OnValueChange -= value; } }
/// <summary>
/// Вызов события в дочерних контролах
/// </summary>
protected void CallOnValueChangeEvent() => OnValueChange?.Invoke();
public AbstractBaseControl(string propertyName)
{
InitializeComponent();
PropertyName = propertyName;
}
#region Работа с заголовком
/// <summary>
/// Установка заголовка
/// </summary>
/// <param name="title"></param>
/// <returns>Ширину полученного загаловка</returns>
public int SetTitle(string title)
{
labelTitle.Text = title;
labelTitle.AutoSize = true;
return labelTitle.Width;
}
/// <summary>
/// Установка ширины заголовка (вызывается через событие, чтобы у всех заголовков получилась одна ширина)
/// </summary>
/// <param name="width"></param>
public void SetTitleWidth(int width)
{
labelTitle.AutoSize = false;
labelTitle.Width = width;
}
#endregion
/// <summary>
/// Устанвока контрола в режим только просмотра
/// </summary>
/// <param name="readOnly"></param>
public abstract void SetReadOnly(bool readOnly);
/// <summary>
/// Установка значения
/// </summary>
/// <param name="value"></param>
public virtual void SetValueToControl(object value) => _originalValue = value;
/// <summary>
/// Сброс значения
/// </summary>
public abstract void DropValue();
/// <summary>
/// Установка флага необхоидмости проверки
/// </summary>
/// <param name="mustCheckValue"></param>
public void SetMustCheckValue(bool mustCheckValue) => _mustCheckValue = mustCheckValue;
/// <summary>
/// Проверка на заполненность
/// </summary>
/// <returns></returns>
public abstract bool CheckValue();
/// <summary>
/// Получение значение с контрола
/// </summary>
/// <returns></returns>
protected abstract object GetValueFromControl();
/// <summary>
/// Заполнение свойства объекта значением из контрола
/// </summary>
/// <param name="obj"></param>
public void FillPropertyToObject(object obj)
{
if (obj != null && PropertyName.IsNotEmpty())
{
var property = obj.GetType().GetProperty(PropertyName);
if (property != null)
{
property.SetValue(obj, GetValueFromControl());
}
}
}
}
}

View File

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

View File

@ -0,0 +1,58 @@

namespace DesktopTools.BaseControls
{
partial class BaseControlInt
{
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.checkBoxNullable = new System.Windows.Forms.CheckBox();
this.numericUpDown = new System.Windows.Forms.NumericUpDown();
//
// checkBoxNullable
//
this.checkBoxNullable.AutoSize = true;
this.checkBoxNullable.Location = new System.Drawing.Point(41, 14);
this.checkBoxNullable.Name = "checkBoxNullable";
this.checkBoxNullable.Size = new System.Drawing.Size(83, 19);
this.checkBoxNullable.TabIndex = 1;
this.checkBoxNullable.UseVisualStyleBackColor = true;
this.checkBoxNullable.Dock = System.Windows.Forms.DockStyle.Left;
//
// numericUpDown
//
this.numericUpDown.Dock = System.Windows.Forms.DockStyle.Fill;
this.numericUpDown.Location = new System.Drawing.Point(148, 9);
this.numericUpDown.Name = "numericUpDown";
this.numericUpDown.Size = new System.Drawing.Size(120, 23);
this.numericUpDown.TabIndex = 2;
this.numericUpDown.Minimum = int.MinValue;
this.numericUpDown.Maximum = int.MaxValue;
}
#endregion
private System.Windows.Forms.CheckBox checkBoxNullable;
private System.Windows.Forms.NumericUpDown numericUpDown;
}
}

View File

@ -0,0 +1,64 @@
using System;
using System.Drawing;
using System.Windows.Forms;
namespace DesktopTools.BaseControls
{
public partial class BaseControlInt : AbstractBaseControl
{
public BaseControlInt(string propertyName) : base(propertyName)
{
InitializeComponent();
checkBoxNullable.Visible = false;
panelControl.Controls.Add(checkBoxNullable);
checkBoxNullable.CheckedChanged += (object sender, EventArgs e) =>
{
numericUpDown.Enabled = !(sender as CheckBox).Checked;
CallOnValueChangeEvent();
};
panelControl.Controls.Add(numericUpDown);
numericUpDown.ValueChanged += (object sender, EventArgs e) => { CallOnValueChangeEvent(); };
_originalValue = 0;
}
public override void SetReadOnly(bool readOnly)
{
numericUpDown.Enabled = !readOnly;
checkBoxNullable.Enabled = !readOnly;
}
public override void SetValueToControl(object value)
{
base.SetValueToControl(value);
if (value != null)
{
numericUpDown.Value = Convert.ToInt32(value);
}
}
public override void DropValue()
{
numericUpDown.Value = _originalValue != null ? Convert.ToInt32(_originalValue) : 0;
}
public override bool CheckValue()
{
if (_mustCheckValue && checkBoxNullable.Checked)
{
BackColor = Color.OrangeRed;
return false;
}
return true;
}
protected override object GetValueFromControl()
{
if (_mustCheckValue && checkBoxNullable.Checked)
{
throw new ArgumentNullException($"Поле свойства '{labelTitle.Text}' должно быть заполнено");
}
return checkBoxNullable.Checked? null : Convert.ToInt32(numericUpDown.Value);
}
}
}

View 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>

View File

@ -0,0 +1,42 @@

namespace DesktopTools.BaseControls
{
partial class BaseControlText
{
/// <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()
{
this.textBox = new System.Windows.Forms.TextBox();
//
// textBox
//
this.textBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox.Location = new System.Drawing.Point(0, 0);
this.textBox.Name = "textBox";
this.textBox.Size = new System.Drawing.Size(1000, 1000);
this.textBox.TabIndex = 1;
}
#endregion
private System.Windows.Forms.TextBox textBox;
}
}

View File

@ -0,0 +1,46 @@
using ModuleTools.Extensions;
using System;
using System.Drawing;
namespace DesktopTools.BaseControls
{
public partial class BaseControlText : AbstractBaseControl
{
public BaseControlText(string propertyName) : base(propertyName)
{
InitializeComponent();
panelControl.Controls.Add(textBox);
textBox.TextChanged += (object sender, EventArgs e) => { CallOnValueChangeEvent(); };
_originalValue = string.Empty;
}
public override void SetReadOnly(bool readOnly) => textBox.Enabled = !readOnly;
public override void SetValueToControl(object value)
{
base.SetValueToControl(value);
textBox.Text = value.ToString();
}
public override void DropValue() => textBox.Text = _originalValue.ToString();
public override bool CheckValue()
{
if(_mustCheckValue && textBox.Text.IsEmpty())
{
BackColor = Color.OrangeRed;
return false;
}
return true;
}
protected override object GetValueFromControl()
{
if (_mustCheckValue && textBox.Text.IsEmpty())
{
throw new ArgumentNullException($"Поле свойства '{labelTitle.Text}' должно быть заполнено");
}
return textBox.Text;
}
}
}

View File

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

View File

@ -0,0 +1,46 @@

namespace DesktopTools.Controls
{
partial class BaseControlViewEntityElement
{
/// <summary>
/// Обязательная переменная конструктора.
/// </summary>
protected 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()
{
this.SuspendLayout();
//
// BaseControlViewEntityElement
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Name = "BaseControlViewEntityElement";
this.Size = new System.Drawing.Size(695, 578);
this.ResumeLayout(false);
}
#endregion
}
}

View File

@ -0,0 +1,104 @@
using DesktopTools.Helpers;
using ModuleTools.Enums;
using System;
using System.Windows.Forms;
namespace DesktopTools.Controls
{
public partial class BaseControlViewEntityElement : UserControl
{
/// <summary>
/// Признак налиичия изменений
/// </summary>
protected bool _haveChages = false;
/// <summary>
/// Событие, вызываемое при закрытии контрола
/// </summary>
protected event Action<Guid> CloseEvent;
/// <summary>
/// Событие, вызываемое при закрытии контрола
/// </summary>
public event Action<Guid> CloseEventAdd { add { CloseEvent += value; } remove { CloseEvent -= value; } }
/// <summary>
/// Открытие формы
/// </summary>
public virtual void Open() { }
/// <summary>
/// Закрытие формы
/// </summary>
public virtual void Close()
{
if(_haveChages && DialogHelper.MessageQuestion("Имеется несохраненные данные, вы действительно хотите закрыть элемент?", "Закрытие элемента") ==
DialogResult.Yes)
{
if (!Save())
{
return;
}
}
CloseEvent?.Invoke(ControlId);
Form?.Close();
Dispose();
}
protected virtual bool Save() { return true; }
/// <summary>
/// Дубликат контрола
/// </summary>
/// <returns></returns>
public virtual BaseControlViewEntityElement Clone() { return null; }
/// <summary>
/// Установка флага, что есть изменения
/// </summary>
protected void ValueChange() => _haveChages = true;
/// <summary>
/// Идентификатор контрола
/// </summary>
public Guid ControlId { get; protected set; }
/// <summary>
/// Идентификатор элемента с которым идет раота при редактировании
/// </summary>
public Guid? ElementId { get; protected set; }
/// <summary>
/// Идентификатор родителського элемента
/// </summary>
public Guid? ParentEleemtId { get; protected set; }
/// <summary>
/// Заголовок контрола
/// </summary>
public string Title { get; protected set; }
/// <summary>
/// Порядок контрола в меню
/// </summary>
public int Order { get; protected set; }
/// <summary>
/// Операция в системе
/// </summary>
public AccessOperation AccessOperation { get; protected set; }
/// <summary>
/// Форма в которой открыт контрол
/// </summary>
public Form Form { get; set; }
/// <summary>
/// Констркутор
/// </summary>
public BaseControlViewEntityElement()
{
InitializeComponent();
}
}
}

View File

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

View File

@ -26,7 +26,7 @@ namespace DesktopTools.Controls
/// </summary> /// </summary>
public virtual void Close() public virtual void Close()
{ {
CloseEvent?.Invoke(Id); CloseEvent?.Invoke(ControlId);
Dispose(); Dispose();
} }
@ -39,7 +39,7 @@ namespace DesktopTools.Controls
/// <summary> /// <summary>
/// Идентификатор контрола /// Идентификатор контрола
/// </summary> /// </summary>
public Guid Id { get; protected set; } public Guid ControlId { get; protected set; }
/// <summary> /// <summary>
/// Заголовок контрола /// Заголовок контрола

View File

@ -0,0 +1,107 @@

namespace DesktopTools.Controls
{
partial class GenericControlEntityElement<G, S, L, E, BL>
{
/// <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()
{
this.toolStripActions = new System.Windows.Forms.ToolStrip();
this.toolStripButtonSave = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonReload = new System.Windows.Forms.ToolStripButton();
this.toolStripButtonClose = new System.Windows.Forms.ToolStripButton();
this.panelContainer = new System.Windows.Forms.Panel();
this.toolStripActions.SuspendLayout();
this.SuspendLayout();
//
// toolStripActions
//
this.toolStripActions.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripButtonSave,
this.toolStripButtonReload,
this.toolStripButtonClose});
this.toolStripActions.Location = new System.Drawing.Point(0, 0);
this.toolStripActions.Name = "toolStripActions";
this.toolStripActions.Size = new System.Drawing.Size(594, 25);
this.toolStripActions.TabIndex = 0;
this.toolStripActions.Text = "toolStrip1";
//
// toolStripButtonSave
//
this.toolStripButtonSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonSave.Image = global::DesktopTools.Properties.Resources.Save;
this.toolStripButtonSave.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButtonSave.Name = "toolStripButtonSave";
this.toolStripButtonSave.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonSave.Text = "Сохранить";
//
// toolStripButtonReload
//
this.toolStripButtonReload.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonReload.Image = global::DesktopTools.Properties.Resources.Reload;
this.toolStripButtonReload.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButtonReload.Name = "toolStripButtonReload";
this.toolStripButtonReload.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonReload.Text = "Обновить";
//
// toolStripButtonClose
//
this.toolStripButtonClose.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
this.toolStripButtonClose.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this.toolStripButtonClose.Image = global::DesktopTools.Properties.Resources.Close;
this.toolStripButtonClose.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButtonClose.Name = "toolStripButtonClose";
this.toolStripButtonClose.Size = new System.Drawing.Size(23, 22);
this.toolStripButtonClose.Text = "Закрыть";
//
// panelContainer
//
this.panelContainer.AutoScroll = true;
this.panelContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelContainer.Location = new System.Drawing.Point(0, 25);
this.panelContainer.Name = "panelContainer";
this.panelContainer.Size = new System.Drawing.Size(594, 485);
this.panelContainer.TabIndex = 1;
//
// GenericControlEntityElement
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.panelContainer);
this.Controls.Add(this.toolStripActions);
this.Name = "GenericControlEntityElement";
this.Size = new System.Drawing.Size(594, 510);
this.toolStripActions.ResumeLayout(false);
this.toolStripActions.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolStrip toolStripActions;
private System.Windows.Forms.ToolStripButton toolStripButtonSave;
private System.Windows.Forms.ToolStripButton toolStripButtonReload;
private System.Windows.Forms.ToolStripButton toolStripButtonClose;
private System.Windows.Forms.Panel panelContainer;
}
}

View File

@ -0,0 +1,151 @@
using DesktopTools.BaseControls;
using ModuleTools.Attributes;
using ModuleTools.BindingModels;
using ModuleTools.BusinessLogics;
using ModuleTools.ViewModels;
using System;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
namespace DesktopTools.Controls
{
public partial class GenericControlEntityElement<G, S, L, E, BL> : BaseControlViewEntityElement
where G : GetBindingModel, new()
where S : SetBindingModel, new()
where L : ListViewModel<E>
where E : ElementViewModel
where BL : GenericBusinessLogic<G, S, L, E>
{
/// <summary>
/// Объект бизнес-логики для получения данных
/// </summary>
private readonly BL _businessLogic;
private event Action<int> SetTitleWidth;
private event Action DropValues;
private event Func<bool> CheckValues;
private event Action<object> GetValues;
private E Element { get; set; }
public GenericControlEntityElement(Guid? id)
{
InitializeComponent();
InitEvents();
_businessLogic = DependencyManager.Instance.Resolve<BL>();
Element = _businessLogic.GetElement(new G { Id = id });
}
public override void Open()
{
base.Open();
if (panelContainer.Controls.Count == 0)
{
Configurate();
}
//LoadList();
}
private void InitEvents()
{
toolStripButtonSave.Click += (object sender, EventArgs e) => { Save(); };
toolStripButtonReload.Click += (object sender, EventArgs e) => { DropValues?.Invoke(); };
toolStripButtonClose.Click += (object sender, EventArgs e) => { Close(); };
}
private void Configurate()
{
int positionY = 5;
int positionX = 5;
int interval = 15;
int titleWidth = 0;
foreach (var property in typeof(E).GetProperties())
{
var attribute = property.GetCustomAttribute<ViewModelOnElementPropertyAttribute>();
if (attribute != null)
{
AbstractBaseControl control = null;
switch (property.PropertyType.Name.ToLower())
{
case "string":
control = new BaseControlText(property.Name);
break;
case "int32":
control = new BaseControlInt(property.Name);
break;
}
if (control == null)
{
continue;
}
if (Element != null)
{
control.SetValueToControl(property.GetValue(Element));
}
var widthTitle = control.SetTitle(attribute.DisplayName);
if (widthTitle > titleWidth)
{
titleWidth = widthTitle;
}
control.OnValueChangeEvent += ValueChange;
DropValues += control.DropValue;
CheckValues += control.CheckValue;
SetTitleWidth += control.SetTitleWidth;
GetValues += control.FillPropertyToObject;
control.Location = new System.Drawing.Point(positionX, positionY);
control.Width = Width - positionX * 2;
control.Anchor = AnchorStyles.Right | AnchorStyles.Top | AnchorStyles.Left;
positionY += control.Height + interval;
control.SetReadOnly(attribute.ReadOnly);
control.SetMustCheckValue(attribute.MustHaveValue);
panelContainer.Controls.Add(control);
}
}
SetTitleWidth(titleWidth);
}
protected override bool Save()
{
if (CheckValues.GetInvocationList().Select(x => (bool)x.DynamicInvoke()).ToList().Any(x => !x))
{
return false;
}
var model = Element == null ? new S() : Mapper.MapToClass<E, S>(Element, true);
GetValues(model);
if (model != null)
{
if (Element == null)
{
Element = _businessLogic.Create(model);
}
else
{
Element = _businessLogic.Update(model);
}
if (Element == null)
{
throw new Exception($"Ошибка при сохранении: {_businessLogic.Errors.LastOrDefault().Message}");
}
MessageBox.Show("Сохранение прошло успешно", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
return true;
}
return false;
}
}
}

View File

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

View File

@ -6,15 +6,17 @@ using ModuleTools.Extensions;
using ModuleTools.ViewModels; using ModuleTools.ViewModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
namespace DesktopTools.Controls namespace DesktopTools.Controls
{ {
public partial class GenericControlEntityList<G, S, L, E, BL> : BaseControlViewEntityList public partial class GenericControlEntityList<G, S, L, E, BL> : BaseControlViewEntityList
where G : GetBindingModel where G : GetBindingModel, new()
where S : SetBindingModel where S : SetBindingModel, new()
where L: ListViewModel<E> where L : ListViewModel<E>
where E : ElementViewModel where E : ElementViewModel
where BL : GenericBusinessLogic<G, S, L, E> where BL : GenericBusinessLogic<G, S, L, E>
{ {
@ -33,14 +35,14 @@ namespace DesktopTools.Controls
_businessLogic = DependencyManager.Instance.Resolve<BL>(); _businessLogic = DependencyManager.Instance.Resolve<BL>();
} }
public override void Open() public override async void Open()
{ {
base.Open(); base.Open();
if (dataGridViewList.Columns.Count == 0) if (dataGridViewList.Columns.Count == 0)
{ {
Configurate(GetConfig()); Configurate(GetConfig());
} }
LoadList(); await LoadListAsync();
} }
public override void Close() public override void Close()
@ -54,7 +56,7 @@ namespace DesktopTools.Controls
/// <param name="model">Настройки</param> /// <param name="model">Настройки</param>
private void Configurate(ControlViewEntityListConfiguration config) private void Configurate(ControlViewEntityListConfiguration config)
{ {
if(config == null) if (config == null)
{ {
return; return;
} }
@ -66,7 +68,8 @@ namespace DesktopTools.Controls
var attr = property.GetCustomAttribute<ViewModelOnListPropertyAttribute>(); var attr = property.GetCustomAttribute<ViewModelOnListPropertyAttribute>();
if (attr != null) if (attr != null)
{ {
dataGridViewList.Columns.Add(new DataGridViewTextBoxColumn var colIndex = attr.DisplayName == "Идентификатор" ? 0 : dataGridViewList.Columns.Count;
dataGridViewList.Columns.Insert(colIndex, new DataGridViewTextBoxColumn
{ {
HeaderText = attr.DisplayName, HeaderText = attr.DisplayName,
Name = string.Format("Column{0}", property.Name), Name = string.Format("Column{0}", property.Name),
@ -158,10 +161,10 @@ namespace DesktopTools.Controls
toolStripButtonUpd.Click += (object sender, EventArgs e) => { CallUpdElementEvent(); }; toolStripButtonUpd.Click += (object sender, EventArgs e) => { CallUpdElementEvent(); };
toolStripButtonDel.Click += (object sender, EventArgs e) => { CallDelElementEvent(); }; toolStripButtonDel.Click += (object sender, EventArgs e) => { CallDelElementEvent(); };
toolStripButtonSearch.Click += (object sender, EventArgs e) => { panelSearch.Visible = !panelSearch.Visible; }; toolStripButtonSearch.Click += (object sender, EventArgs e) => { panelSearch.Visible = !panelSearch.Visible; };
toolStripButtonRef.Click += (object sender, EventArgs e) => { LoadList(); }; toolStripButtonRef.Click += async (object sender, EventArgs e) => { await LoadListAsync(); };
toolStripButtonClose.Click += (object sender, EventArgs e) => { Close(); }; toolStripButtonClose.Click += (object sender, EventArgs e) => { Close(); };
buttonSearch.Click += (object sender, EventArgs e) => { LoadList(); }; buttonSearch.Click += async (object sender, EventArgs e) => { await LoadListAsync(); };
buttonCancelSearch.Click += (object sender, EventArgs e) => { panelSearch.Visible = false; }; buttonCancelSearch.Click += (object sender, EventArgs e) => { panelSearch.Visible = false; };
dataGridViewList.KeyDown += (object sender, KeyEventArgs e) => dataGridViewList.KeyDown += (object sender, KeyEventArgs e) =>
@ -184,37 +187,37 @@ namespace DesktopTools.Controls
CallUpdElementEvent(); CallUpdElementEvent();
}; };
toolStripButtonPrev.Click += (object sender, EventArgs e) => toolStripButtonPrev.Click += async (object sender, EventArgs e) =>
{ {
if (int.TryParse(toolStripTextBoxPage.Text, out int page)) if (int.TryParse(toolStripTextBoxPage.Text, out int page))
{ {
toolStripTextBoxPage.Text = (page - 1).ToString(); toolStripTextBoxPage.Text = (page - 1).ToString();
LoadList(); await LoadListAsync();
} }
}; };
toolStripButtonNext.Click += (object sender, EventArgs e) => toolStripButtonNext.Click += async (object sender, EventArgs e) =>
{ {
if (int.TryParse(toolStripTextBoxPage.Text, out int page)) if (int.TryParse(toolStripTextBoxPage.Text, out int page))
{ {
toolStripTextBoxPage.Text = (page + 1).ToString(); toolStripTextBoxPage.Text = (page + 1).ToString();
LoadList(); await LoadListAsync();
} }
}; };
toolStripTextBoxPage.KeyDown += (object sender, KeyEventArgs e) => toolStripTextBoxPage.KeyDown += async (object sender, KeyEventArgs e) =>
{ {
if (e.KeyData == Keys.Enter) if (e.KeyData == Keys.Enter)
{ {
LoadList(); await LoadListAsync();
} }
}; };
toolStripComboBoxPageNames.SelectedIndexChanged += (object sender, EventArgs e) => { LoadList(); }; toolStripComboBoxPageNames.SelectedIndexChanged += async (object sender, EventArgs e) => { await LoadListAsync(); };
} }
/// <summary> /// <summary>
/// Вызов события загрузки данных на datagrid /// Вызов события загрузки данных на datagrid
/// </summary> /// </summary>
private void LoadList() private async Task LoadListAsync()
{ {
var cursor = Cursor.Current; var cursor = Cursor.Current;
L data = null; L data = null;
@ -229,7 +232,7 @@ namespace DesktopTools.Controls
{ {
if (int.TryParse(toolStripTextBoxPage.Text, out int page) && int.TryParse(toolStripTextBoxPage.Tag.ToString(), out int count)) if (int.TryParse(toolStripTextBoxPage.Text, out int page) && int.TryParse(toolStripTextBoxPage.Tag.ToString(), out int count))
{ {
data = GetDataWithPageNumber(page, count); await Task.Run(() => data = GetDataWithPageNumber(page, count));
} }
} }
// поименная // поименная
@ -238,13 +241,13 @@ namespace DesktopTools.Controls
var key = toolStripComboBoxPageNames.Text; var key = toolStripComboBoxPageNames.Text;
if (key.IsNotEmpty()) if (key.IsNotEmpty())
{ {
data = GetDataWithPageName(key); await Task.Run(() => data = GetDataWithPageName(key));
} }
} }
} }
else else
{ {
data = GetData(); await Task.Run(() => data = GetData());
} }
if (data == null) if (data == null)
@ -254,7 +257,7 @@ namespace DesktopTools.Controls
} }
toolStripLabelCountPages.Text = $"из {data.MaxCount}"; toolStripLabelCountPages.Text = $"из {data.MaxCount}";
FillDataOnGrid(data.List); FillDataOnGridAsync(data.List);
} }
finally finally
{ {
@ -266,7 +269,7 @@ namespace DesktopTools.Controls
/// Заполнение таблицы /// Заполнение таблицы
/// </summary> /// </summary>
/// <param name="data"></param> /// <param name="data"></param>
private void FillDataOnGrid(List<E> data) private void FillDataOnGridAsync(List<E> data)
{ {
if (data == null) if (data == null)
{ {
@ -288,7 +291,7 @@ namespace DesktopTools.Controls
/// <summary> /// <summary>
/// Вызов события при добавлении элемента /// Вызов события при добавлении элемента
/// </summary> /// </summary>
private void CallAddElementEvent() => AddElement(); private void CallAddElementEvent() => LaunchControl(null);
/// <summary> /// <summary>
/// Вызов события при изменении элемента /// Вызов события при изменении элемента
@ -297,8 +300,7 @@ namespace DesktopTools.Controls
{ {
foreach (DataGridViewRow selected in dataGridViewList.SelectedRows) foreach (DataGridViewRow selected in dataGridViewList.SelectedRows)
{ {
var id = new Guid(selected.Cells[0].Value.ToString()); LaunchControl(new Guid(selected.Cells[0].Value.ToString()));
UpdElement(id);
} }
} }
@ -309,21 +311,60 @@ namespace DesktopTools.Controls
{ {
if (MessageBox.Show("Удалить выбранные записи?", "Подтверждение", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) if (MessageBox.Show("Удалить выбранные записи?", "Подтверждение", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{ {
foreach (DataGridViewRow selected in dataGridViewList.SelectedRows) var cursor = Cursor.Current;
try
{ {
var id = new Guid(selected.Cells[0].Value.ToString()); Cursor.Current = Cursors.WaitCursor;
DelElement(id); foreach (DataGridViewRow selected in dataGridViewList.SelectedRows)
{
_businessLogic.Delete(new G { Id = new Guid(selected.Cells[0].Value.ToString()) });
}
}
catch (Exception ex)
{
if (_businessLogic.Errors.Count != 0)
{
MessageBox.Show(_businessLogic.Errors.LastOrDefault().Message ?? ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
Cursor.Current = cursor;
} }
} }
} }
protected virtual void AddElement() { } /// <summary>
/// Создание формы с контролом для работы с элементом
/// </summary>
/// <param name="id"></param>
private void LaunchControl(Guid? id)
{
try
{
var control = new GenericControlEntityElement<G, S, L, E, BL>(id);
control.Open();
var form = new Form
{
Height = control.Height,
Width = control.Width,
Text = $"{Title}. Добавление",
StartPosition = FormStartPosition.CenterParent,
ControlBox = false
};
form.Controls.Add(control);
control.Dock = DockStyle.Fill;
control.Form = form;
form.Show();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
protected virtual void UpdElement(Guid id) { } protected virtual ControlViewEntityListConfiguration GetConfig() => new();
protected virtual void DelElement(Guid id) { }
protected virtual ControlViewEntityListConfiguration GetConfig() { return null; }
protected virtual L GetData() { return null; } protected virtual L GetData() { return null; }

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DesktopTools.Helpers
{
public static class DialogHelper
{
public static DialogResult MessageQuestion(string message, string title) =>
MessageBox.Show(message, title, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
}
}

View File

@ -130,6 +130,16 @@ namespace DesktopTools.Properties {
} }
} }
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap Reload {
get {
object obj = ResourceManager.GetObject("Reload", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary> /// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap. /// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary> /// </summary>
@ -140,6 +150,16 @@ namespace DesktopTools.Properties {
} }
} }
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
public static System.Drawing.Bitmap Save {
get {
object obj = ResourceManager.GetObject("Save", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary> /// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap. /// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary> /// </summary>

View File

@ -112,43 +112,49 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="Add" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Clear" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Clear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Close" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Del" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Del.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Down.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Left" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Left.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Ref" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="Ref" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Ref.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\Ref.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="Right" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="Right" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Right.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\Right.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="Upd" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Upd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Left" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Left.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Close" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Search" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="Search" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Search.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\Search.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="Up" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="Up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Up.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\Up.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="Upd" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="Del" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Upd.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\Del.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Down.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Add" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Save" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Clear" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Clear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Reload" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Reload.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
</root> </root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -19,24 +19,20 @@ namespace ModuleTools.Attributes
/// <summary> /// <summary>
/// Сложное свойство (свойствое в другом классе-свойстве) /// Сложное свойство (свойствое в другом классе-свойстве)
/// </summary> /// </summary>
public bool IsDifficle { get; set; } public bool IsDifficle { get; set; } = false;
/// <summary> /// <summary>
/// Можно копировать поле даже при доступе без прав /// Можно копировать поле даже при доступе без прав
/// </summary> /// </summary>
public bool AllowCopyWithoutRigth { get; set; } public bool AllowCopyWithoutRigth { get; set; } = true;
/// <summary> /// <summary>
/// Настройка для полей сущности правил маппинга /// Настройка для полей сущности правил маппинга
/// </summary> /// </summary>
/// <param name="propertyNameFromMModel">Название свойства с класса, из которого извлекаем данные</param> /// <param name="propertyNameFromMModel">Название свойства с класса, из которого извлекаем данные</param>
/// <param name="isDifficle">Сложное свойство (свойствое в другом классе-свойстве)</param> public MapConfigurationAttribute(string propertyNameFromMModel)
/// <param name="allowCopyWithoutRigth">Можно копировать поле даже при доступе без прав</param>
public MapConfigurationAttribute(string propertyNameFromMModel, bool isDifficle = false, bool allowCopyWithoutRigth = true)
{ {
PropertyNameFromModel = propertyNameFromMModel; PropertyNameFromModel = propertyNameFromMModel;
IsDifficle = isDifficle;
AllowCopyWithoutRigth = allowCopyWithoutRigth;
} }
} }
} }

View File

@ -0,0 +1,59 @@
using System;
namespace ModuleTools.Attributes
{
/// <summary>
/// Настройка отображения свойства класса при выводе объекта класса (требуется для автоматизации вывода элемента,
/// применяется к классам ElementViewModel)
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public class ViewModelOnElementPropertyAttribute : Attribute
{
/// <summary>
/// Название на форме
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// Поле должно быть обязательно заполнено
/// </summary>
public bool MustHaveValue { get; set; } = false;
/// <summary>
/// Запрет на редактирование, только вывод
/// </summary>
public bool ReadOnly { get; set; } = false;
/// <summary>
/// Ширина
/// </summary>
public int? Width { get; set; }
/// <summary>
/// Высота
/// </summary>
public int? Height { get; set; }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="displayName">Название на форме</param>
public ViewModelOnElementPropertyAttribute(string displayName)
{
DisplayName = displayName;
}
/// <summary>
/// Конструктор
/// </summary>
/// <param name="displayName">Название на форме</param>
/// <param name="width">Ширина</param>
/// <param name="height">Высота</param>
public ViewModelOnElementPropertyAttribute(string displayName, int width, int height)
{
DisplayName = displayName;
Width = width;
Height = height;
}
}
}

View File

@ -17,27 +17,24 @@ namespace ModuleTools.Attributes
/// <summary> /// <summary>
/// Скрывать или нет при выводе списка /// Скрывать или нет при выводе списка
/// </summary> /// </summary>
public bool IsHide { get; set; } public bool IsHide { get; set; } = false;
/// <summary> /// <summary>
/// Ширина колонки /// Ширина колонки
/// </summary> /// </summary>
public int? ColumnWidth { get; set; } public int? ColumnWidth { get; set; } = null;
/// <summary> /// <summary>
/// Настройка отображения элемента в контролах /// Настройка отображения элемента в контролах
/// </summary> /// </summary>
/// <param name="displayName">Название на форме</param> /// <param name="displayName">Название на форме</param>
/// <param name="isHide">Скрывать или нет</param> public ViewModelOnListPropertyAttribute(string displayName)
public ViewModelOnListPropertyAttribute(string displayName, bool isHide = false)
{ {
DisplayName = displayName; DisplayName = displayName;
ColumnWidth = null;
IsHide = isHide;
} }
/// <summary> /// <summary>
/// Конструктор /// Настройка отображения элемента в контролах
/// </summary> /// </summary>
/// <param name="displayName">Название на форме</param> /// <param name="displayName">Название на форме</param>
/// <param name="columnWidth">Ширина колонки</param> /// <param name="columnWidth">Ширина колонки</param>
@ -45,7 +42,6 @@ namespace ModuleTools.Attributes
{ {
DisplayName = displayName; DisplayName = displayName;
ColumnWidth = columnWidth; ColumnWidth = columnWidth;
IsHide = false;
} }
} }
} }

View File

@ -1,4 +1,5 @@
using System; using ModuleTools.Attributes;
using System;
namespace ModuleTools.BindingModels namespace ModuleTools.BindingModels
{ {
@ -10,6 +11,7 @@ namespace ModuleTools.BindingModels
/// <summary> /// <summary>
/// Идентификатор записи /// Идентификатор записи
/// </summary> /// </summary>
[MapConfiguration("Id")]
public Guid Id { get; set; } public Guid Id { get; set; }
} }
} }

View File

@ -70,10 +70,10 @@ namespace ModuleTools.BusinessLogics
{ {
if (Security.CheckAccess(new SecurityManagerCheckAccessModel(model, _serviceOperation, type, _entity))) if (Security.CheckAccess(new SecurityManagerCheckAccessModel(model, _serviceOperation, type, _entity)))
{ {
Errors.Add(("Ошибка безопасности", Security.ErrorMessage)); return false;
return true;
} }
return false; Errors.Add(("Ошибка безопасности", Security.ErrorMessage));
return true;
} }
/// <summary> /// <summary>
@ -86,7 +86,7 @@ namespace ModuleTools.BusinessLogics
Errors.Clear(); Errors.Clear();
try try
{ {
model.HaveRight = NoAccess(model, AccessType.View); model.HaveRight = !NoAccess(model, AccessType.View);
if (model.HaveRight && !_allowSimpleView) if (model.HaveRight && !_allowSimpleView)
{ {
throw new MethodAccessException("Нет прав на получение списка"); throw new MethodAccessException("Нет прав на получение списка");
@ -117,7 +117,7 @@ namespace ModuleTools.BusinessLogics
Errors.Clear(); Errors.Clear();
try try
{ {
model.HaveRight = NoAccess(model, AccessType.View); model.HaveRight = !NoAccess(model, AccessType.View);
if (model.HaveRight && !_allowSimpleView) if (model.HaveRight && !_allowSimpleView)
{ {
throw new MethodAccessException("Нет прав на получение списка"); throw new MethodAccessException("Нет прав на получение списка");

View File

@ -8,7 +8,7 @@ namespace ModuleTools.ViewModels
/// </summary> /// </summary>
public class ElementViewModel public class ElementViewModel
{ {
[ViewModelOnListProperty("Идентификатор", isHide: true)] [ViewModelOnListProperty("Идентификатор", IsHide = true)]
[MapConfiguration("Id")] [MapConfiguration("Id")]
public Guid Id { get; set; } public Guid Id { get; set; }
} }

View File

@ -72,7 +72,6 @@ namespace DepartmentPortalDesctop
this.textBoxPassword.Size = new System.Drawing.Size(242, 23); this.textBoxPassword.Size = new System.Drawing.Size(242, 23);
this.textBoxPassword.TabIndex = 3; this.textBoxPassword.TabIndex = 3;
this.textBoxPassword.UseSystemPasswordChar = true; this.textBoxPassword.UseSystemPasswordChar = true;
this.textBoxPassword.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxPassword_KeyDown);
// //
// buttonEnter // buttonEnter
// //
@ -91,6 +90,7 @@ namespace DepartmentPortalDesctop
// //
// FormEnter // FormEnter
// //
this.AcceptButton = this.buttonEnter;
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(324, 131); this.ClientSize = new System.Drawing.Size(324, 131);

View File

@ -18,7 +18,7 @@ namespace DepartmentPortalDesctop
InitializeComponent(); InitializeComponent();
} }
private void Login() private void ButtonEnter_Click(object sender, EventArgs e)
{ {
if (textBoxLogin.Text.IsEmpty()) if (textBoxLogin.Text.IsEmpty())
{ {
@ -40,15 +40,5 @@ namespace DepartmentPortalDesctop
ErrorMessanger.PrintErrorMessage("При аутентфикации возникла ошибка: ", new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("Аутентфикация", ex.Message) }); ErrorMessanger.PrintErrorMessage("При аутентфикации возникла ошибка: ", new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("Аутентфикация", ex.Message) });
} }
} }
private void ButtonEnter_Click(object sender, EventArgs e) => Login();
private void TextBoxPassword_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Login();
}
}
} }
} }

View File

@ -66,16 +66,16 @@ namespace DepartmentPortalDesctop
} }
var ctrl = _baseControls[id].Clone(); var ctrl = _baseControls[id].Clone();
if (!_controls.ContainsKey(ctrl.Id)) if (!_controls.ContainsKey(ctrl.ControlId))
{ {
ctrl.CloseEventAdd += CloseControl; ctrl.CloseEventAdd += CloseControl;
ctrl.Dock = DockStyle.Fill; ctrl.Dock = DockStyle.Fill;
ctrl.Open(); ctrl.Open();
_controls.Add(ctrl.Id, ctrl); _controls.Add(ctrl.ControlId, ctrl);
splitContainerMain.Panel1.Controls.Clear(); splitContainerMain.Panel1.Controls.Clear();
splitContainerMain.Panel1.Controls.Add(ctrl); splitContainerMain.Panel1.Controls.Add(ctrl);
dataGridViewControls.Rows.Add(new object[] { ctrl.Id, ctrl.Title }); dataGridViewControls.Rows.Add(new object[] { ctrl.ControlId, ctrl.Title });
dataGridViewControls.Rows[^1].Selected = true; dataGridViewControls.Rows[^1].Selected = true;
} }
} }
@ -97,7 +97,7 @@ namespace DepartmentPortalDesctop
} }
for (int i = 0; i < dataGridViewControls.Rows.Count; ++i) for (int i = 0; i < dataGridViewControls.Rows.Count; ++i)
{ {
if (dataGridViewControls.Rows[i].Cells[0].Value.ToString() == ctrl.Id.ToString()) if (dataGridViewControls.Rows[i].Cells[0].Value.ToString() == ctrl.ControlId.ToString())
{ {
dataGridViewControls.Rows.RemoveAt(i); dataGridViewControls.Rows.RemoveAt(i);
if (i < dataGridViewControls.Rows.Count - 1) if (i < dataGridViewControls.Rows.Count - 1)
@ -113,7 +113,7 @@ namespace DepartmentPortalDesctop
break; break;
} }
} }
_controls.Remove(ctrl.Id); _controls.Remove(ctrl.ControlId);
} }
/// <summary> /// <summary>

View File

@ -1,4 +1,5 @@
using ModuleTools.BindingModels; using ModuleTools.Attributes;
using ModuleTools.BindingModels;
using ModuleTools.Enums; using ModuleTools.Enums;
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
@ -23,11 +24,14 @@ namespace SecurityBusinessLogic.BindingModels
/// </summary> /// </summary>
public class AccessSetBindingModel : SetBindingModel public class AccessSetBindingModel : SetBindingModel
{ {
[MapConfiguration("RoleId")]
public Guid RoleId { get; set; } public Guid RoleId { get; set; }
[Required(ErrorMessage = "required")] [Required(ErrorMessage = "required")]
public AccessOperation Operation { get; set; } [MapConfiguration("AccessOperation")]
public AccessOperation AccessOperation { get; set; }
[MapConfiguration("AccessType")]
public AccessType AccessType { get; set; } public AccessType AccessType { get; set; }
} }
} }

View File

@ -1,4 +1,5 @@
using ModuleTools.BindingModels; using ModuleTools.Attributes;
using ModuleTools.BindingModels;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace SecurityBusinessLogic.BindingModels namespace SecurityBusinessLogic.BindingModels
@ -17,12 +18,15 @@ namespace SecurityBusinessLogic.BindingModels
public class EnviromentSettingSetBindingModel : SetBindingModel public class EnviromentSettingSetBindingModel : SetBindingModel
{ {
[Required(ErrorMessage = "required")] [Required(ErrorMessage = "required")]
[MapConfiguration("Key")]
public string Key { get; set; } public string Key { get; set; }
[Required(ErrorMessage = "required")] [Required(ErrorMessage = "required")]
[MapConfiguration("Value")]
public string Value { get; set; } public string Value { get; set; }
[Required(ErrorMessage = "required")] [Required(ErrorMessage = "required")]
[MapConfiguration("Description")]
public string Description { get; set; } public string Description { get; set; }
} }
} }

View File

@ -1,4 +1,5 @@
using ModuleTools.BindingModels; using ModuleTools.Attributes;
using ModuleTools.BindingModels;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace SecurityBusinessLogic.BindingModels namespace SecurityBusinessLogic.BindingModels
@ -14,9 +15,11 @@ namespace SecurityBusinessLogic.BindingModels
public class RoleSetBindingModel : SetBindingModel public class RoleSetBindingModel : SetBindingModel
{ {
[Required(ErrorMessage = "required")] [Required(ErrorMessage = "required")]
[MapConfiguration("RoleName")]
public string RoleName { get; set; } public string RoleName { get; set; }
[Required(ErrorMessage = "required")] [Required(ErrorMessage = "required")]
[MapConfiguration("RolePriority")]
public int RolePriority { get; set; } public int RolePriority { get; set; }
} }
} }

View File

@ -1,6 +1,6 @@
using ModuleTools.BindingModels; using ModuleTools.Attributes;
using ModuleTools.BindingModels;
using System; using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace SecurityBusinessLogic.BindingModels namespace SecurityBusinessLogic.BindingModels
@ -18,25 +18,34 @@ namespace SecurityBusinessLogic.BindingModels
public class UserSetBindingModel : SetBindingModel public class UserSetBindingModel : SetBindingModel
{ {
[Required(ErrorMessage = "required")] [Required(ErrorMessage = "required")]
[MapConfiguration("Login")]
public string Login { get; set; } public string Login { get; set; }
[Required(ErrorMessage = "required")] [Required(ErrorMessage = "required")]
public string Password { get; set; } public string Password { get; set; }
[MapConfiguration("StudentId")]
public Guid? StudentId { get; set; } public Guid? StudentId { get; set; }
[MapConfiguration("LecturerId")]
public Guid? LecturerId { get; set; } public Guid? LecturerId { get; set; }
[MapConfiguration("EmployeeId")]
public Guid? EmployeeId { get; set; } public Guid? EmployeeId { get; set; }
[MapConfiguration("Avatar")]
public byte[] Avatar { get; set; } public byte[] Avatar { get; set; }
[MapConfiguration("DateLastVisit")]
public DateTime? DateLastVisit { get; set; } public DateTime? DateLastVisit { get; set; }
[MapConfiguration("IsBanned")]
public bool IsBanned { get; set; } public bool IsBanned { get; set; }
[MapConfiguration("DateBanned")]
public DateTime? DateBanned { get; set; } public DateTime? DateBanned { get; set; }
[MapConfiguration("CountAttempt")]
public int CountAttempt { get; set; } public int CountAttempt { get; set; }
} }
} }

View File

@ -19,7 +19,7 @@ namespace SecurityBusinessLogic.ViewModels
public Guid RoleId { get; set; } public Guid RoleId { get; set; }
[ViewModelOnListProperty("Роль", 100)] [ViewModelOnListProperty("Роль", 100)]
[MapConfiguration("Role.RoleName", true, AllowCopyWithoutRigth = false)] [MapConfiguration("Role.RoleName", IsDifficle = true, AllowCopyWithoutRigth = false)]
public string RoleName { get; set; } public string RoleName { get; set; }
[MapConfiguration("AccessOperation", AllowCopyWithoutRigth = false)] [MapConfiguration("AccessOperation", AllowCopyWithoutRigth = false)]

View File

@ -14,14 +14,17 @@ namespace SecurityBusinessLogic.ViewModels
public class EnviromentSettingViewModel : ElementViewModel public class EnviromentSettingViewModel : ElementViewModel
{ {
[ViewModelOnListProperty("Ключ")] [ViewModelOnListProperty("Ключ")]
[ViewModelOnElementProperty("Ключ", MustHaveValue = true, ReadOnly = true)]
[MapConfiguration("Key", AllowCopyWithoutRigth = false)] [MapConfiguration("Key", AllowCopyWithoutRigth = false)]
public string Key { get; set; } public string Key { get; set; }
[ViewModelOnListProperty("Значение")] [ViewModelOnListProperty("Значение")]
[ViewModelOnElementProperty("Значение", MustHaveValue = true)]
[MapConfiguration("Value", AllowCopyWithoutRigth = false)] [MapConfiguration("Value", AllowCopyWithoutRigth = false)]
public string Value { get; set; } public string Value { get; set; }
[ViewModelOnListProperty("Описание")] [ViewModelOnListProperty("Описание")]
[ViewModelOnElementProperty("Описание")]
[MapConfiguration("Description", AllowCopyWithoutRigth = false)] [MapConfiguration("Description", AllowCopyWithoutRigth = false)]
public string Description { get; set; } public string Description { get; set; }

View File

@ -14,10 +14,12 @@ namespace SecurityBusinessLogic.ViewModels
public class RoleViewModel : ElementViewModel public class RoleViewModel : ElementViewModel
{ {
[ViewModelOnListProperty("Название роли")] [ViewModelOnListProperty("Название роли")]
[ViewModelOnElementProperty("Название роли")]
[MapConfiguration("RoleName")] [MapConfiguration("RoleName")]
public string RoleName { get; set; } public string RoleName { get; set; }
[ViewModelOnListProperty("Приоритет", 100)] [ViewModelOnListProperty("Приоритет", 100)]
[ViewModelOnElementProperty("Приоритет")]
[MapConfiguration("RolePriority")] [MapConfiguration("RolePriority")]
public int RolePriority { get; set; } public int RolePriority { get; set; }

View File

@ -15,9 +15,13 @@ namespace SecurityBusinessLogic.ViewModels
public class UserViewModel : ElementViewModel public class UserViewModel : ElementViewModel
{ {
[ViewModelOnListProperty("Пользователь")] [ViewModelOnListProperty("Пользователь")]
[ViewModelOnElementProperty("Логин")]
[MapConfiguration("UserName")] [MapConfiguration("UserName")]
public string Login { get; set; } public string Login { get; set; }
[MapConfiguration("PasswordHash", AllowCopyWithoutRigth = false)]
public string Password { get; set; }
[MapConfiguration("StudentId")] [MapConfiguration("StudentId")]
public Guid? StudentId { get; set; } public Guid? StudentId { get; set; }

View File

@ -22,7 +22,7 @@ namespace SecurityImplementation.SecurityDatabaseImplementation
{ {
using var context = DatabaseManager.GetContext; using var context = DatabaseManager.GetContext;
var exsistEntity = context.Accesses.FirstOrDefault(x => x.AccessOperation == model.Operation && x.RoleId == model.RoleId && x.AccessType == model.AccessType); var exsistEntity = context.Accesses.FirstOrDefault(x => x.AccessOperation == model.AccessOperation && x.RoleId == model.RoleId && x.AccessType == model.AccessType);
if (exsistEntity == null) if (exsistEntity == null)
{ {
var entity = Mapper.MapToClass<AccessSetBindingModel, Access>(model, true); var entity = Mapper.MapToClass<AccessSetBindingModel, Access>(model, true);

View File

@ -20,12 +20,12 @@ namespace SecurityWindowsDesktop.Controls
InitializeComponent(); InitializeComponent();
_roleBusinessLogic = DependencyManager.Instance.Resolve<RoleBusinessLogic>(); _roleBusinessLogic = DependencyManager.Instance.Resolve<RoleBusinessLogic>();
Title = "Доступы"; Title = "Доступы";
Id = new Guid("6eebc4c4-cb86-4368-93e0-33dbdbb7409a"); ControlId = new Guid("6eebc4c4-cb86-4368-93e0-33dbdbb7409a");
Order = 1; Order = 1;
AccessOperation = AccessOperation.Доступы; AccessOperation = AccessOperation.Доступы;
} }
public override BaseControlViewEntityList Clone() => new AccessesControl() { Id = Guid.NewGuid() }; public override BaseControlViewEntityList Clone() => new AccessesControl() { ControlId = Guid.NewGuid() };
protected override ControlViewEntityListConfiguration GetConfig() => new() protected override ControlViewEntityListConfiguration GetConfig() => new()
{ {

View File

@ -15,12 +15,12 @@ namespace SecurityWindowsDesktop.Controls
{ {
InitializeComponent(); InitializeComponent();
Title = "Настройки Среды"; Title = "Настройки Среды";
Id = new Guid("b3865c23-b1db-475b-b95c-aa51edc60388"); ControlId = new Guid("b3865c23-b1db-475b-b95c-aa51edc60388");
Order = 1; Order = 1;
AccessOperation = AccessOperation.НастройкиСреды; AccessOperation = AccessOperation.НастройкиСреды;
} }
public override BaseControlViewEntityList Clone() => new EnviromentSettingControl() { Id = Guid.NewGuid() }; public override BaseControlViewEntityList Clone() => new EnviromentSettingControl() { ControlId = Guid.NewGuid() };
protected override ControlViewEntityListConfiguration GetConfig() => new() protected override ControlViewEntityListConfiguration GetConfig() => new()
{ {

View File

@ -15,12 +15,12 @@ namespace SecurityWindowsDesktop.Controls
{ {
InitializeComponent(); InitializeComponent();
Title = "Роли"; Title = "Роли";
Id = new Guid("6a33ce5c-e950-4294-9f75-2a0b35941bf7"); ControlId = new Guid("6a33ce5c-e950-4294-9f75-2a0b35941bf7");
Order = 1; Order = 1;
AccessOperation = AccessOperation.Роли; AccessOperation = AccessOperation.Роли;
} }
public override BaseControlViewEntityList Clone() => new RolesControl() { Id = Guid.NewGuid() }; public override BaseControlViewEntityList Clone() => new RolesControl() { ControlId = Guid.NewGuid() };
protected override ControlViewEntityListConfiguration GetConfig() => new() protected override ControlViewEntityListConfiguration GetConfig() => new()
{ {

View File

@ -15,12 +15,12 @@ namespace SecurityWindowsDesktop.Controls
{ {
InitializeComponent(); InitializeComponent();
Title = "Пользователи"; Title = "Пользователи";
Id = new Guid("d5596997-d1f5-4e5e-b94b-6bdd6bca3452"); ControlId = new Guid("d5596997-d1f5-4e5e-b94b-6bdd6bca3452");
Order = 1; Order = 1;
AccessOperation = AccessOperation.Пользователи; AccessOperation = AccessOperation.Пользователи;
} }
public override BaseControlViewEntityList Clone() => new UsersControl() { Id = Guid.NewGuid() }; public override BaseControlViewEntityList Clone() => new UsersControl() { ControlId = Guid.NewGuid() };
protected override ControlViewEntityListConfiguration GetConfig() => new() protected override ControlViewEntityListConfiguration GetConfig() => new()
{ {

View File

@ -46,7 +46,7 @@ namespace SecurityWindowsDesktop
{ {
list.Add(new WindowDesktopExtensionControlModel list.Add(new WindowDesktopExtensionControlModel
{ {
Id = cntrl.Id, Id = cntrl.ControlId,
Order = cntrl.Order, Order = cntrl.Order,
Title = cntrl.Title, Title = cntrl.Title,
Control = cntrl Control = cntrl