с# Ввод допустимых чисел и очищение текстовых полей

Столкнулся с проблемой ввода текста при разных конфигурациях:

  1. Проблема в том, что при удалении элементов при помощи кнопки удаления "delete", выскакивает MessageBox что пустое поле. Я туплю на ровном месте и не понимаю, как убрать эту фишку. Использовал для проверки пустые ли поля.
    P.S. При очистке полей(у меня их не одно), выскакивают MessageBox.
    Подскажите как исправить данную проблему?
  2. В куче с проверкой на буквы, все работает максимально через одно место.

P.S. Когда ввел ограничение только на цифры, начало два раза выскакивать что поле пустое)

  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            char c = e.KeyChar;
            e.Handled = c >= 'а' && c <= 'я' || c >= 'А' && c <= 'Я' || c == 'ё' || c == 'Ё';
        }

 private void AmtGenTextBox_TextChanged(object sender, EventArgs e)
        {
            Regex rx = new Regex(@"\D", RegexOptions.IgnoreCase);
            {
                AmtGenTextBox.Text = rx.Replace(AmtGenTextBox.Text, "");
            }
            if (AmtGenTextBox.Text.Length == 0)
                MessageBox.Show("Введите, пожалуйста, значение");
        }

 private void GenClearButton_Click(object sender, EventArgs e)
        {
            GenTextBox.Text = null;
        }

 private void ClearAllButton_Click(object sender, EventArgs e)
        {

              foreach (Control c in Controls)
              {
                  if (c.GetType() == typeof(GroupBox))
                        foreach (Control d in c.Controls)
                           if (d.GetType() == typeof(TextBox))
                               d.Text = string.Empty;

                  if (c.GetType() == typeof(TextBox))
                        c.Text = string.Empty;
              }
        }


Ответы (1 шт):

Автор решения: Bulson

Ваш прошлый вопрос и этот можно решить с помощью такого примера. пример работы

Когда вы создали визуальный интерфейс своей программы, переходите к созданию классов модели предметной области. Создадим такую модель. Это будет такой класс, в котором свойства используются для введения необходимых данных и отображения результата и метод, который вычисляет результат.

public class RandomModel
{
    private static Random _random = new Random();

    public uint Max { get; set; }
    public uint Min { get; set; }
    public uint Count { get; set; }

    private string _result;
    public string Result
    {
        get => _result;
        set
        {
            _result = value;
            //вызываем событие
            ResultChanged?.Invoke(this, EventArgs.Empty);
        }
    }

    //событие о том, что значение свойства изменилось
    public EventHandler ResultChanged;

    //Конструктор
    public RandomModel()
    {
        Max = 100;
        Min = 1;
        Count = 1;
    }

    /// <summary>
    /// Генерация
    /// </summary>
    internal void GenerateResult()
    {
        if (PropsNotValid(out string textError))
        {
            Result = textError;
            return;
        }

        var nums = new List<int>();
        for (int i = 0; i < Count; i++)
        {
            nums.Add(_random.Next((int)Min, (int)Max));
        }

        Result = string.Join("", nums);
    }

    /// <summary>
    /// Проверка значений свойств перед генерацией
    /// </summary>
    /// <param name="textError"></param>
    /// <returns></returns>
    private bool PropsNotValid(out string textError)
    {
        if (Max <= Min)
        {
            textError = "Максимум не может быть меньше минимума";
            return true;
        }

        textError = String.Empty;
        return false;
    }
}

Далее с помощью привязок к текстбоксам свойств нашей модели мы получаем рабочий пример

public partial class MainForm : Form
{
    //модель
    public readonly RandomModel _rVM = new RandomModel();

    public MainForm()
    {
        InitializeComponent();

        //привязка свойства у модели Min с проверкой ввода
        _textBoxMin.DataBindings.Add("Text", _rVM,
            nameof(_rVM.Min), true, DataSourceUpdateMode.OnValidation);
        _textBoxMin.Validating += TextBox_Validating;

        //привязка свойства у модели Max с проверкой ввода
        _textBoxMax.DataBindings.Add("Text", _rVM,
            nameof(_rVM.Max), true, DataSourceUpdateMode.OnValidation);
        _textBoxMax.Validating += TextBox_Validating;

        //привязка свойства у модели Count с проверкой ввода
        _textBoxCount.DataBindings.Add("Text", _rVM,
            nameof(_rVM.Count), true, DataSourceUpdateMode.OnValidation);
        _textBoxCount.Validating += TextBox_Validating;

        //привязка к свойству Result
        _textBoxResult.DataBindings.Add("Text", _rVM, nameof(_rVM.Result));

        //кнопка вызывает метод у модели
        _buttonGen.Click += (s, e) => _rVM.GenerateResult();
        //если свойство Result у модели изменилось, то перечитываем его
        _rVM.ResultChanged += (s, e) => _textBoxResult.DataBindings["Text"].ReadValue();
    }

    /// <summary>
    /// Проверка введенных данных
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void TextBox_Validating(object sender, CancelEventArgs e)
    {
        var textBox = sender as TextBox;
        //проверяем, через парсинг
        if (!uint.TryParse(textBox.Text.Trim(), out uint num))
        {
            MessageBox.Show("Введите цифровое значение!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
→ Ссылка