using DesktopTools.Interfaces; using ToolsModule.Extensions; using System; using System.Windows.Forms; namespace DesktopTools.BaseControls { /// /// Описание контрола для работы со значением свойства класса /// public partial class AbstractBaseControl : UserControl { /// /// Фнукции для основного контрола /// protected IBaseControl _baseControl; /// /// Оригинальное значение (требуется при откате изменений) /// protected object _originalValue; /// /// Необходимость проверки при получении данных /// protected bool _mustFilling; /// /// Название свойства, по которму идет отображение /// protected string _propertyName; #region Событие изменения значения /// /// Событие изменения значения в контроле /// private event Action OnValueChange; /// /// Событие изменения значения в контроле /// public event Action OnValueChangeEvent { add { OnValueChange += value; } remove { OnValueChange -= value; } } /// /// Вызов события в дочерних контролах /// protected void CallOnValueChangeEvent() => OnValueChange?.Invoke(); #endregion /// /// Конструктор /// /// Название свойстваДолжно ли оно быть заполненным обязательно /// Устанвока контрола в режим только просмотра public AbstractBaseControl(string propertyName, bool mustFilling, bool readOnly) { InitializeComponent(); Name = $"Control{propertyName}"; _propertyName = propertyName; _mustFilling = mustFilling; panelControl.Enabled = !readOnly; _baseControl?.SetDefaultValue(); } #region Работа с заголовком /// /// Установка заголовка /// /// /// Ширину полученного загаловка public int SetTitle(string title) { labelTitle.Text = title; labelTitle.AutoSize = true; return labelTitle.Width; } /// /// Установка ширины заголовка (вызывается через событие, чтобы у всех заголовков получилась одна ширина) /// /// public void SetTitleWidth(int width) { labelTitle.AutoSize = false; labelTitle.Width = width; } #endregion #region Работа со значением /// /// Извлечение значения из свойства объекта /// /// public void SetValue(object obj) { if (obj != null && _propertyName.IsNotEmpty()) { var property = obj.GetType().GetProperty(_propertyName); if (property != null) { _originalValue = property.GetValue(obj); _baseControl?.SetValueToControl(_originalValue); } } } /// /// Сброс значения /// public void DropValue() => _baseControl?.DropValueForControl(); /// /// Проверка на заполненность /// /// public bool CheckValue() => _baseControl?.CheckValueForControl() ?? false; /// /// Заполнение свойства объекта значением из контрола /// /// public void GetValue(object obj) { if (obj != null && _propertyName.IsNotEmpty()) { var property = obj.GetType().GetProperty(_propertyName); if (property != null) { property.SetValue(obj, _baseControl?.GetValueFromControl()); } } } #endregion } }