using System; using System.Drawing; using System.Windows.Forms; namespace DesktopTools.BaseControls { /// /// Контрол, предоставляющий работу с перечислениями /// public partial class BaseControlEnum : AbstractBaseControl { /// /// Конструктор /// /// /// /// /// public BaseControlEnum(string propertyName, bool mustFilling, bool readOnly, Type enumType) : base(propertyName, mustFilling, readOnly) { InitializeComponent(); if (!_mustFilling) { checkBoxNullable.CheckedChanged += (object sender, EventArgs e) => { comboBox.Enabled = !(sender as CheckBox).Checked; CallOnValueChangeEvent(); }; panelControl.Controls.Add(checkBoxNullable); } comboBox.Items.Clear(); foreach (var val in Enum.GetValues(enumType)) { comboBox.Items.Add(val); } comboBox.SelectedIndexChanged += (object sender, EventArgs e) => { CallOnValueChangeEvent(); }; panelControl.Controls.Add(comboBox); } protected override void SetDefaultValue() => _originalValue = null; protected override void SetValueToControl(object value) { if (value != null) { comboBox.SelectedIndex = comboBox.Items.IndexOf(value); } else if (!_mustFilling) { checkBoxNullable.Checked = true; } } public override void DropValue() { if (_originalValue != null) { comboBox.SelectedIndex = comboBox.Items.IndexOf(_originalValue); } else if (!_mustFilling) { checkBoxNullable.Checked = true; } } public override bool CheckValue() { if (_mustFilling && comboBox.SelectedIndex == -1) { BackColor = Color.OrangeRed; return false; } return true; } protected override object GetValueFromControl() { if (_mustFilling && comboBox.SelectedIndex == -1) { throw new ArgumentNullException($"Поле свойства '{labelTitle.Text}' должно быть заполнено"); } return checkBoxNullable.Checked ? null : comboBox.SelectedItem; } } }