123 lines
4.0 KiB
C#
123 lines
4.0 KiB
C#
using MyCustomComponents.Extensions;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Data;
|
||
using System.Drawing;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Forms;
|
||
|
||
namespace MyCustomComponents
|
||
{
|
||
public partial class CustomInputRangeNumber : UserControl
|
||
{
|
||
// Диапазон
|
||
private string example = "Введите значение от " + decimal.MinValue + " до " + decimal.MaxValue;
|
||
|
||
// В случае ошибки
|
||
public string Error { get; protected set; } = string.Empty;
|
||
|
||
// Создам 2 публичных поля для настройки границ диапазона
|
||
public decimal? MinValue { get; set; } = null;
|
||
public decimal? MaxValue { get; set; } = null;
|
||
|
||
|
||
/* Публичное свойство для установки и получения введённого значения (set, get). При получении проводится проверка,
|
||
Если введённое значение не входит в диапозон, возвращать значение null, а в отдельное поле выводить текст ошибки.
|
||
При установке должна проводиться проверка, если передаваемое значение не входит в диапозон, то не заполнять поле компонента.
|
||
*/
|
||
|
||
public decimal? Value
|
||
{
|
||
get
|
||
{
|
||
// Как мы проверим что программист не забыл задать минимальное, максимальное значение?
|
||
// Проверка, что MinValue и MaxValue задан
|
||
if (!MinValue.HasValue || !MaxValue.HasValue)
|
||
{
|
||
throw new RangeException("MinValue и MaxValue должны быть заданы.");
|
||
}
|
||
|
||
// Проверяем, что max не может быть min
|
||
if (MaxValue.Value <= MinValue.Value)
|
||
{
|
||
throw new RangeException("MaxValue должно быть больше MinValue");
|
||
}
|
||
|
||
decimal currentValue = numericUpDown.Value;
|
||
|
||
// Проверка, что значение в диапазоне
|
||
if (currentValue < MinValue.Value || currentValue > MaxValue.Value)
|
||
{
|
||
throw new RangeException($"Введённое значение {currentValue} лежит вне диапазона {MinValue.Value} - {MaxValue.Value}.");
|
||
}
|
||
|
||
return currentValue;
|
||
}
|
||
set
|
||
{
|
||
// Проверка, что MinValue и MaxValue заданы
|
||
if (!MinValue.HasValue || !MaxValue.HasValue)
|
||
{
|
||
Error = "MinValue и MaxValue должны быть заданы.";
|
||
return;
|
||
}
|
||
|
||
// Проверка, что MinValue меньше MaxValue
|
||
if (MinValue.Value >= MaxValue.Value)
|
||
{
|
||
Error = "Диапазон неверен. MinValue должен быть меньше, чем MaxValue.";
|
||
return;
|
||
}
|
||
|
||
// Если число верно в диапозоне, то значение устанавливается
|
||
if (value.HasValue && value.Value >= MinValue.Value && value.Value <= MaxValue.Value)
|
||
{
|
||
numericUpDown.Value = value.Value;
|
||
|
||
// Очистить ошибку, если значение установлено успешно
|
||
Error = null;
|
||
}
|
||
else
|
||
{
|
||
Error = $"Значение должно быть в диапазоне от {MinValue.Value} до {MaxValue.Value}.";
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
public CustomInputRangeNumber()
|
||
{
|
||
InitializeComponent();
|
||
}
|
||
|
||
private void numericUpDown_Enter(object sender, EventArgs e)
|
||
{
|
||
ToolTip toolTip = new ToolTip();
|
||
toolTip.Show(example, numericUpDown, 30, -20, 1000);
|
||
}
|
||
|
||
private void numericUpDown_ValueChanged(object sender, EventArgs e)
|
||
{
|
||
_changeEvent?.Invoke(sender, e);
|
||
}
|
||
|
||
private EventHandler _changeEvent;
|
||
|
||
// Событие, вызываемое при смене значения
|
||
public event EventHandler ChangeEvent
|
||
{
|
||
add
|
||
{
|
||
_changeEvent += value;
|
||
}
|
||
remove
|
||
{
|
||
_changeEvent -= value;
|
||
}
|
||
}
|
||
}
|
||
}
|