с# Ввод допустимых чисел и очищение текстовых полей
Столкнулся с проблемой ввода текста при разных конфигурациях:
- Проблема в том, что при удалении элементов при помощи кнопки удаления "delete", выскакивает
MessageBoxчто пустое поле. Я туплю на ровном месте и не понимаю, как убрать эту фишку. Использовал для проверки пустые ли поля.
P.S. При очистке полей(у меня их не одно), выскакиваютMessageBox.
Подскажите как исправить данную проблему? - В куче с проверкой на буквы, все работает максимально через одно место.
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);
}
}
}