Оффтопик. Изучаем C#

Автор Тема: Оффтопик. Изучаем C#  (Прочитано 244119 раз)

0 Пользователей и 5 Гостей просматривают эту тему.

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Оффтопик. Изучаем C#
« Ответ #255 : 17-02-2023, 11:07:47 »
Если используется WPF, я бы подумал на предмет валидации данных в окне.
Обычный winform

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Оффтопик. Изучаем C#
« Ответ #256 : 17-02-2023, 11:09:40 »
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Оффтопик. Изучаем C#
« Ответ #257 : 17-02-2023, 12:05:46 »
https://habr.com/ru/post/209820/ ?
ну немного не то, у меня в textbox просто не вводятся или не вставляются символы, которые не являются числами, вопрос в том, что функция лежащая в самом классе формы работает нормально
Код - C# [Выбрать]
  1. this.textBox1_ur3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.textBox_KeyPress_minus);
если же использовать такой код
Код - C# [Выбрать]
  1. this.textBox1_ur3.KeyPress += new System.Windows.Forms.KeyPressEventHandler(form_function.textBox_KeyPress_minus);
то код нормально компилируется, работает, но в какой-то момент эта строка из designer просто исчезает.
так то просто форм много и было бы проще сделать в одном месте эти функции и с каждой формы обращаться к этому классу чем на каждую новую форму их копировать, может я просто из-за отсутствия профильного образования не знаю каких-то нюансов в этом вопросе и так делать нельзя?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Оффтопик. Изучаем C#
« Ответ #258 : 17-02-2023, 12:23:27 »
Может, нечто типа:
Код - C# [Выбрать]
  1.         private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
  2.         {
  3.             OnlyNumbers. IsValueDigital(sender, e);
  4.         }
  5.  
  6. // Вообще в другом каталоге, отдельный класс
  7.     public static class OnlyNumbers
  8.     {
  9.         public static void IsValueDigital(object sender, KeyPressEventArgs e)
  10.         {
  11.             if (!Char.IsDigit(e.KeyChar))
  12.             {
  13.                 e.Handled = true;
  14.             }
  15.         }
  16.     }
По-быстрому проверил - вроде работает.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Оффтопик. Изучаем C#
« Ответ #259 : 17-02-2023, 12:39:10 »
itext7
Если я не ошибаюсь itext5 был бесплатным, а потом сделали itext7 и он уже под другой лицензией

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Оффтопик. Изучаем C#
« Ответ #260 : 17-02-2023, 12:54:12 »
Может, нечто типа:
Char.IsDigit(e.KeyChar

Давно что-то делал подобное, этот вариант не очень.
Нужно будет добавить +-. и сложно будет предотвратить случайный порядок нажатия символов  --+7...5.03+45.

Проще будет сделать так, после ввода симола пробовать парсить строку в нужное число
if (int.TryParse(text, out int res))...
if (double.TryParse(text, out int res))...

Или проверку через регулярные выражения реализовать, сложнее разобраться новичкам
if (Regex.IsMatch(text, @"^[+-]?\d*\.?\d*$"))...


Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Оффтопик. Изучаем C#
« Ответ #261 : 17-02-2023, 13:42:19 »
Да собственно этот "валидатор" может содержать в себе что угодно. Проблема в том, что он "отваливается".
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Оффтопик. Изучаем C#
« Ответ #262 : 17-02-2023, 16:06:08 »
Проще будет сделать так, после ввода симола пробовать парсить строку в нужное число
if (int.TryParse(text, out int res))...
if (double.TryParse(text, out int res))...
Вот это очень плохой вариант, у меня помню парс игнорил запятую если она разделитель и выдавал число как целое состоящее из дробной и целой части, так что тут все не так просто, я просто запретил ввод всех символов кроме чисел, точки, запятой и минуса, причем запятая автоматом на точку заменяется, ну и там проверки что минус может быть только первым и только один, точка только одна и не может быть первым символом и тд. ну и запрет на копирование в ячейку, дает почти 100% шанс что ничего лишнего там не окажется, а парсится если это значение вообще если понадобится.
« Последнее редактирование: 17-02-2023, 17:01:56 от alz »

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Оффтопик. Изучаем C#
« Ответ #263 : 19-02-2023, 14:59:20 »
Вот это очень плохой вариант, у меня помню парс игнорил запятую если она разделитель
И поэтому это плохой вариант и нужно городить кучу кода для проверки?
а text.replace(',', '.'); впереди не судьба добавить?

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Оффтопик. Изучаем C#
« Ответ #264 : 19-02-2023, 19:05:59 »
И поэтому это плохой вариант и нужно городить кучу кода для проверки?
а text.replace(',', '.'); впереди не судьба добавить?

Ну так то пофиг какой вариант использовать

Код - C# [Выбрать]
  1. public static void textBox_KeyPress_minus(object sender, KeyPressEventArgs e)
  2.         {
  3.             TextBox tTBox = sender as TextBox;              
  4.             if (double.TryParse(tTBox.Text + e.KeyChar, System.Globalization.NumberStyles.Any,
  5.                                     System.Globalization.CultureInfo.InvariantCulture, out _)) e.Handled = true;
  6.         }
или
Код - C# [Выбрать]
  1. public static void textBox_KeyPress_minus(object sender, KeyPressEventArgs e)
  2.         {
  3.            TextBox tTBox = sender as TextBox;
  4.             if (e.KeyChar == ',') e.KeyChar = '.';        
  5.             if (!Char.IsDigit(e.KeyChar) && (e.KeyChar != 8) && ((e.KeyChar != '-') || (tTBox.Text.IndexOf("-") == 0) || tTBox.SelectionStart != 0) &&
  6.                 ((e.KeyChar != '.') || (tTBox.Text.IndexOf(".") != -1) || (tTBox.SelectionStart == 0) || (!Char.IsDigit(tTBox.Text.Substring(tTBox.SelectionStart - 1, 1), 0)) || (tTBox.Text.IndexOf(".") != -1)))
  7.                 e.Handled = true;
  8.         }

Вопрос почему обработчик отваливается через некоторое время, когда я даже не скажу, просто замечаю периодически что его уже нет. Если вызывает функцию другого класса.
« Последнее редактирование: 19-02-2023, 19:36:46 от alz »

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Оффтопик. Изучаем C#
« Ответ #265 : 19-02-2023, 20:48:08 »
Если вызывает функцию другого класса.
А этот другой класс статический?
Извините, вам запрещён просмотр содержимого спойлеров.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Оффтопик. Изучаем C#
« Ответ #266 : 20-02-2023, 07:06:48 »
А этот другой класс статический?
Из которого вызывается обычный, вызывается статический.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Re: Оффтопик. Изучаем C#
« Ответ #267 : 20-02-2023, 08:52:47 »
Не понял, если честно. У тебя есть событие, которое обращается к методу статического класса (валидатору, так обзову). Валидатор в свою очередь обращается к методу второго класса. И вот этот второй класс - статический? Ну так, на всякий случай.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Оффтопик. Изучаем C#
« Ответ #268 : 20-02-2023, 08:58:27 »
Не понял, если честно. У тебя есть событие, которое обращается к методу статического класса (валидатору, так обзову). Валидатор в свою очередь обращается к методу второго класса. И вот этот второй класс - статический? Ну так, на всякий случай.
Событие напрямую обращается к валидатору в статическом классе.

Оффлайн alz

  • ADN OPEN
  • **
  • Сообщений: 95
  • Карма: 11
Re: Оффтопик. Изучаем C#
« Ответ #269 : 16-03-2023, 17:19:48 »
В общем разобрался в этом вопросе все дело в файле designer, если в нем есть хоть какие-то ссылки на другие классы, то при изменении элементов формы при перестроении файла все это удаляется, соответственно любые валидаторы находящиеся в других класса там использовать не получится, точнее получится, но до первого изменения чего-либо на форме, так что раньше я все обработчики закидывал в него, если они ссылались на функции внутри формы проблем не было.
Решением оказалось помещение обработчиков событий в основной код формы, отсюда ничего не удаляется:

Код - C# [Выбрать]
  1. using System;
  2. using System.Windows.Forms;
  3.  
  4. namespace Function
  5. {
  6.     public partial class Form1 : Form
  7.     {        
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.             Function function = new Function();
  12.             textBox1.KeyPress += new KeyPressEventHandler(function.TbKeyDoubleMinus);
  13.             textBox1.LostFocus += new EventHandler(function.TbLostFocus);
  14.         }
  15.     }
  16. }

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

Код - C# [Выбрать]
  1. using System;
  2. using System.Linq;
  3. using System.Windows.Forms;
  4.  
  5. namespace Function
  6. {
  7.     /// <summary>
  8.     /// События для управлением пользовательским вводом в текстбоксы
  9.     /// </summary>
  10.     internal class Function
  11.     {
  12.         /// <summary>
  13.         /// добавляет 0 к содержимому текстбокса если в нем нет чисел
  14.         /// используется при событии потери фокуса что бы в текстбоксе точно было число которое можно парсить      
  15.         /// </summary>
  16.         /// <param name="sender"></param>
  17.         /// <param name="e"></param>
  18.         public void TbLostFocus(object sender, EventArgs e)
  19.         {
  20.             TextBox tTB = sender as TextBox;
  21.             foreach (Char c in tTB.Text) if (Char.IsDigit(c)) return;          
  22.             tTB.Text += "0";
  23.         }
  24.         /// <summary>
  25.         /// это событие позволяет возможность вводить десятичные положительные и отрицательные числа
  26.         /// </summary>
  27.         /// <param name="sender"></param>
  28.         /// <param name="e"></param>
  29.         public void TbKeyDoubleMinus(object sender, KeyPressEventArgs e)
  30.         {
  31.             TextBox tTB = sender as TextBox;          
  32.             if (e.KeyChar == ',') e.KeyChar = '.';          
  33.             if (e.KeyChar == '-')
  34.             {
  35.                 int pos = tTB.SelectionStart;
  36.                 if (tTB.Text.Contains('-'))
  37.                 {
  38.                     tTB.Text = tTB.Text.Substring(1);
  39.                     tTB.SelectionStart = pos - 1;
  40.                 }
  41.                 else
  42.                 {
  43.                     tTB.Text = '-' + tTB.Text;
  44.                     tTB.SelectionStart = pos + 1;
  45.                 }
  46.                 e.Handled = true;
  47.                 return;
  48.             }
  49.             if (e.KeyChar == '.')
  50.             {
  51.                 if (tTB.Text.Contains('.') | (tTB.SelectionStart == 0 & tTB.Text.Contains('-'))) e.Handled = true;              
  52.                 return;
  53.             }
  54.             if (e.KeyChar == 8 )
  55.             {
  56.                 if (tTB.SelectionLength > 0)
  57.                 {
  58.                     int pos = tTB.SelectionStart;
  59.                     tTB.Text = tTB.Text.Substring(0, tTB.SelectionStart) + tTB.Text.Substring(tTB.SelectionStart + tTB.SelectionLength);
  60.                     tTB.SelectionStart = pos;
  61.                     e.Handled = true;
  62.                 }                
  63.                 return;
  64.             }
  65.             if (Char.IsDigit(e.KeyChar))
  66.             {
  67.                 if (tTB.Text.Contains('-') & tTB.SelectionStart == 0) e.Handled = true;
  68.                 return;
  69.             }
  70.             e.Handled = true;
  71.         }
  72.         /// <summary>
  73.         /// это событие позволяет вводить десятичные положительные числа
  74.         /// </summary>
  75.         /// <param name="sender"></param>
  76.         /// <param name="e"></param>
  77.         public void TbKeyDouble(object sender, KeyPressEventArgs e)
  78.         {
  79.             TextBox tTB = sender as TextBox;
  80.             if (e.KeyChar == ',') e.KeyChar = '.';
  81.             if (e.KeyChar == '.')
  82.             {
  83.                 if (tTB.Text.Contains('.') | (tTB.SelectionStart == 0 & tTB.Text.Contains('-'))) e.Handled = true;
  84.                 return;
  85.             }
  86.             if (e.KeyChar == 8)
  87.             {
  88.                 if (tTB.SelectionLength > 0)
  89.                 {
  90.                     int pos = tTB.SelectionStart;
  91.                     tTB.Text = tTB.Text.Substring(0, tTB.SelectionStart) + tTB.Text.Substring(tTB.SelectionStart + tTB.SelectionLength);
  92.                     tTB.SelectionStart = pos;
  93.                     e.Handled = true;
  94.                 }
  95.                 return;
  96.             }
  97.             if (Char.IsDigit(e.KeyChar))
  98.             {
  99.                 if (tTB.Text.Contains('-') & tTB.SelectionStart == 0) e.Handled = true;
  100.                 return;
  101.             }
  102.             e.Handled = true;
  103.         }
  104.         /// <summary>
  105.         /// это событие позволяет вводить целые положительные и отрицательные числа
  106.         /// </summary>
  107.         /// <param name="sender"></param>
  108.         /// <param name="e"></param>
  109.         public void TbKeyIntegerMinus(object sender, KeyPressEventArgs e)
  110.         {
  111.             TextBox tTB = sender as TextBox;            
  112.             if (e.KeyChar == '-')
  113.             {
  114.                 int pos = tTB.SelectionStart;
  115.                 if (tTB.Text.Contains('-'))
  116.                 {
  117.                     tTB.Text = tTB.Text.Substring(1);
  118.                     tTB.SelectionStart = pos - 1;
  119.                 }
  120.                 else
  121.                 {
  122.                     tTB.Text = '-' + tTB.Text;
  123.                     tTB.SelectionStart = pos + 1;
  124.                 }
  125.                 e.Handled = true;
  126.                 return;
  127.             }
  128.             if (e.KeyChar == 8)
  129.             {
  130.                 if (tTB.SelectionLength > 0)
  131.                 {
  132.                     int pos = tTB.SelectionStart;
  133.                     tTB.Text = tTB.Text.Substring(0, tTB.SelectionStart) + tTB.Text.Substring(tTB.SelectionStart + tTB.SelectionLength);
  134.                     tTB.SelectionStart = pos;
  135.                     e.Handled = true;
  136.                 }
  137.                 return;
  138.             }
  139.             if (Char.IsDigit(e.KeyChar))
  140.             {
  141.                 if (tTB.Text.Contains('-') & tTB.SelectionStart == 0) e.Handled = true;
  142.                 return;
  143.             }
  144.             e.Handled = true;
  145.         }
  146.         /// <summary>
  147.         /// это событие позволяет вводить целые положительные числа
  148.         /// </summary>
  149.         /// <param name="sender"></param>
  150.         /// <param name="e"></param>
  151.         public void TbKeyInteger(object sender, KeyPressEventArgs e)
  152.         {
  153.             TextBox tTB = sender as TextBox;
  154.             if (e.KeyChar == 8)
  155.             {
  156.                 if (tTB.SelectionLength > 0)
  157.                 {
  158.                     int pos = tTB.SelectionStart;
  159.                     tTB.Text = tTB.Text.Substring(0, tTB.SelectionStart) + tTB.Text.Substring(tTB.SelectionStart + tTB.SelectionLength);
  160.                     tTB.SelectionStart = pos;
  161.                     e.Handled = true;
  162.                 }
  163.                 return;
  164.             }
  165.             if (Char.IsDigit(e.KeyChar))
  166.             {
  167.                 if (tTB.Text.Contains('-') & tTB.SelectionStart == 0) e.Handled = true;
  168.                 return;
  169.             }
  170.             e.Handled = true;
  171.         }
  172.     }
  173. }
  174.