С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 204

Привязка дробных данных к textbox

12.05.2025, 19:20. Показов 2432. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
сделал привязку и вроде бы все работает, целое число записывается,
но никак не могу записать дробное число.
особенно если пользователь вводит его через запятую.
где вставить проверку на дробь и соответственно заменить запятую на точку, никак не пойму
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class DEP :BindableObject {
  public event PropertyChangedEventHandler PropertyChanged;
  private void OnPropertyChanged(object sender, string propertyName) {
    if (PropertyChanged != null) {
      PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
    }
  }
  private decimal _lost;                          // расход [2]
  public decimal lost { get { return _lost; } set { _lost= value; OnPropertyChanged(this, "lost"); } }
  private decimal _len;                           // длина  [3]
  public decimal len { get { return _len; } set { _len = value; OnPropertyChanged(this, "len"); } }
  }
сама привязка
C#
1
2
3
4
  
DEP dep....
MyTextBox tb3 = new MyTextBox() { Name = "tb01" };
  tb3.DataBindings.Add(new Binding("Text", dep, "len", false, DataSourceUpdateMode.OnPropertyChanged));
спасибо
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.05.2025, 19:20
Ответы с готовыми решениями:

Проверка на ввод дробных чисел в textBox
доброго времени суток. уже несколько дней не могу написать рабочий код на проверку ввода в textBox....

Разница между "." и "," в разделении дробных чисел в TextBox
Дорогие друзья, недавно писал программу, которая бы считала введенные значения по достаточно...

Привязка данных к textbox
Добрый день! Имеется форма с датагридом, в котором с помощью запроса отобраются данные из двух...

28
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
12.05.2025, 19:46
Цитата Сообщение от sonmax Посмотреть сообщение
где вставить проверку на дробь и соответственно заменить запятую на точку
Чтобы обработать некорректный ввод данных можно использовать обработчик события Validating. Там же можно и с точками/запятыми разбираться.
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
13.05.2025, 08:56
sonmax, Судя по коду это WPF. В класс Application в конструктор добавьте вот это
C#
1
2
3
4
5
6
7
8
public App()
{
    // Данная опция позволяет использовать тип обновления привязки UpdateSourceTrigger=PropertyChanged
    // для TextBox при вводе дробных значений.
    FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
 
    InitializeComponent();
}
Добавлено через 4 минуты
Цитата Сообщение от sonmax Посмотреть сообщение
C#
1
tb3.DataBindings.Add(new Binding("Text", dep, "len", false, DataSourceUpdateMode.OnPropertyChanged));
Привязки делаются в XAML, да и вообще вся разметка делается в XAML. C# для этого дела не используется от слова совсем.
XML
1
2
3
<TextBox Grid.Column="4" 
         Text="{Binding Labor, Mode=TwoWay, Converter={StaticResource DecimalNullableValueConverter}, UpdateSourceTrigger=PropertyChanged}"  
         Margin="0" Padding="5" VerticalAlignment="Center" HorizontalContentAlignment="Right"/>
Добавлено через 2 минуты
sonmax,
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
В класс Application в конструктор добавьте вот это
Это работает для проектов WPF на NET 6+. В проектах WPF на NET Framework 4.x эта опция включена по умолчанию.

Добавлено через 34 секунды
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
включена
Выключена.

Добавлено через 4 минуты
sonmax,
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Судя по коду это WPF.
Или всё же не WPF? Хотя вот это
Цитата Сообщение от sonmax Посмотреть сообщение
C#
1
BindableObject
вроде как из какого-то фреймворка для реализации MVVM...
0
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 204
13.05.2025, 19:01  [ТС]
Спасибо за ответы, удалось только к вечеру добраться до программы.
программа в winforms

суть в том, что пользователь может добавлять строки с 20 окнами в ряду.
в этих окнах, где-то сам пользователь задает значения, где-то они рассчитываются автоматом из предыдущих полей.
сделал отдельные процедуры для считывания/записи данных из окон в массив,
но мне показалось это неудобным, решил попробовать через привязку.
по сути головняк я сам себе придумал.
т.к. в проектах в основном использую winforms, то такой надобности особо и не было.
ну теперь, блин, появилась.

судя по вашим ответам все это для WPF
FrameworkCompatibilityPreferences.KeepTe xtBoxDisplaySynchronizedWithTextProperty = false;
и Validating
тоже не заработали.

я как то ни как не могу определить событие где после ввода - значение записывается в массив.
чтоб на этом этапе ошибку обработать.
keydown - рано, keyup - поздно


сейчас склоняюсь к тому, чтобы все данные перевести в string,
а потом уже при расчете переводить в дробь. но это как то не криво..
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
13.05.2025, 19:11
Цитата Сообщение от sonmax Посмотреть сообщение
не могу определить событие где после ввода - значение записывается
После потери фокуса ввода или в случае принудительной обработки, например, клавиши Enter, вызывается обработчик события Validating. Вот в нём и можно выполнить замену запятой и корректность самих данных.

Не по теме:

Судя по вашему описанию, какой либо модели данных у вас нет, всё храните в простых массивах.

0
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 204
13.05.2025, 20:21  [ТС]
у меня keyup отвечает за расчет в окнах и переход на другое окно.
но уже тут поздно что либо делать.

получается следующее (на видео было бы конечно более наглядно):
значение в окне(то что вводится) переменная соответствующая окну
0 0
0, 0
тут происходит как то проверка, т.к. "0," - это не число, то ошибка и в переменную пишется 0
т.е не дает дальше вводить, и уже сбрасывается на старую переменную, в данном случае 0

уф, как то так объяснил.

Добавлено через 1 минуту
Цитата Сообщение от Uswer Посмотреть сообщение
Судя по вашему описанию, какой либо модели данных у вас нет, всё храните в простых массивах.
да в классе
C#
1
public class DEP :BindableObject {
т.к. изначально и не планировал привязки. а сейчас как то лень, т.к. 90% все корректно работает.
только с decimal бы разобраться
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
13.05.2025, 23:28
Цитата Сообщение от sonmax Посмотреть сообщение
90% все корректно работает
Ну это пока вы чего-нибудь не поменяете/добавите.
Большинство завсегдатаев форума вам сразу скажут о шаблонах разработки, которые делят приложение на слои. Каждый слой отвечает за свою часть обработки данных. Для больших приложений без такого разделения их поддержка и развитие становятся болью. Однако в частных случаях можно сделать и без всего этого, поэтому опустим эту тему (пока опустим ;-))

Раз уж вы начали использовать привязку данных, то останавливаться глупо, т.к. это шаг вперёд. Поэтому настоятельно рекомендую погрузиться в её изучение.

Теперь по теме.
Вообще, насколько я смог понять, вам должен подойти IEditableObject интерфейс. Реализовав его в своём классе вы получите возможность отката изменений значения. Но это только часть проблемы. Вообще валидация данных довольно объёмная тема, поэтому коснусь только малой части.
Для double значения привязка данных за кулисами использует DoubleConverter, если я не ошибаюсь. А тот, в свою очередь, применяет текущую CultureInfo. И от этой CultureInfo зависит разделитель целой и дробной частей (точка или запятая). Однако это поведение можно поменять прикрутив собственную конвертацию. Достигается это либо предварительной обработкой данных в обработчике события Validating, о чём я уже не раз повторил, либо это делается в объекте привязки путём подключения своего обработчика события Parse (см. пример). Как говориться "выбирай на вкус".

Добавлено через 20 минут
Перечитав стартовое сообщение вижу, что основная проблема именно в разделителе (точка или запятая). Посмотрите как делается валидация ввода, например тут.
1
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
14.05.2025, 09:32
Цитата Сообщение от sonmax Посмотреть сообщение
программа в winforms
Цитата Сообщение от sonmax Посмотреть сообщение
судя по вашим ответам все это для WPF
Да, я просто впервые тут на форуме увидел, что кто-то использует в формах привязку данных, вот и перепутал. Эта фишка по дефолту используется только в WPF
Цитата Сообщение от Uswer Посмотреть сообщение
Раз уж вы начали использовать привязку данных, то останавливаться глупо, т.к. это шаг вперёд. Поэтому настоятельно рекомендую погрузиться в её изучение.
Полностью согласен.
sonmax,
Цитата Сообщение от Uswer Посмотреть сообщение
Вот в нём и можно выполнить замену запятой и корректность самих данных.
Вот вам пример конвертера, может прикрутите куда, или просто посмотрите как менять разделители
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.Globalization;
using System.Windows.Data;
 
namespace DBClient.Converters
{
    [ValueConversion(typeof(decimal?), typeof(string))]
    public class DecimalNullableValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            decimal? dValue = (decimal?)value;
            return dValue?.ToString(culture);
        }
 
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string dValue = value.ToString();
 
            dValue = dValue.Trim();
 
            if (dValue.Contains('.'))
            {
                dValue = dValue.Replace(".", ",");
            }
 
            if (decimal.TryParse(dValue, NumberStyles.Any, culture, out decimal result))
            {
                return result;
            }
 
            if (dValue == "")
            {
                value = null;
            }
 
            return value;
        }
    }
}
Добавлено через 28 минут
sonmax, Забыл настройку клиента показать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ***************************************************************************************
//
// Конвертер выполняет корректироваку строки при английской раскладке
// работает при русской культуре приложения
//
// Запись в App.xaml.cs в методе OnStartup(StartupEventArgs e)
//
//  Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("RU-ru");
//  Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("RU-ru");
//  FrameworkElement.LanguageProperty.OverrideMetadata(
//          typeof(FrameworkElement),
//          new FrameworkPropertyMetadata(
//              XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
//
// ***************************************************************************************
Добавлено через 2 минуты
sonmax, Ну и для double? пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Globalization;
using System.Windows.Data;
 
namespace DBClient.Converters
{
    [ValueConversion(typeof(double?), typeof(string))]
    public class DoubleNullableValueConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            double? dValue = (double?)value;
            return dValue?.ToString(culture);
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string dValue = value.ToString();
 
            dValue = dValue.Trim();
 
            if (dValue.Contains('.'))
            {
                dValue = dValue.Replace(".", ",");
            }
 
            if (double.TryParse(dValue, NumberStyles.AllowDecimalPoint, culture, out double result))
            {
                return result;
            }
 
            if (dValue == "")
            {
                value = null;
            }
 
            return value;
        }
    }
}
0
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 204
14.05.2025, 14:48  [ТС]
Спасибо за советы.
Событие конвертации вроде бы отловил, но при выводе это не очень помогло.
курсор перескакивает в начало строки.

пример. надо ввести 1,5
по шагам:

1 вариант если переменная len из класса DEP - string

1) "1" - все нормально курсор после "1"
2) "," - тоже все нормально курсор после ","
3) "5" - все норм
но если на шаге 2 я ввожу ".", то вижу как программа меняет ее на запятую,
а курсор перемещается в начало. т.е перед "1"
по идее на строковую переменную это не должно действовать?
есть подозрение. что проверка на число происходит до Replace().
и вообще почему что-то проверяется при вводе строки.

2 Вариант если переменная len (decimal/double)

тут при любом вводе (запятая/точка) перескакивает в начало строки
0
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 204
14.05.2025, 14:55  [ТС]
видео записал
это первый вариант, len = string
первый ввод через запятую, второй - точка
Вложения
Тип файла: mp4 20250514_145239_ScreenVideo.mp4 (285.5 Кб, 4 просмотров)
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
14.05.2025, 15:21
sonmax, не надо обрабатывать TextChanged
0
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 204
14.05.2025, 15:31  [ТС]
у меня его и нет. но причина наверное в моем классе, а не в привязке

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 public class MyTextBox: TextBox {
   public MyTextBox() {
        this.BorderColor = Color.Red;
        this.Font = new Font("Arial Narrow", 9);
        this.BorderStyle = BorderStyle.Fixed3D; // обязательно так
        this.TextAlign = HorizontalAlignment.Center;
        this.Margin = new Padding(2, 2, 2, 2);
        this.Size = new Size(200, this.Height);
        this.KeyUp += new KeyEventHandler(tbox_KeyUp);
      }
     private void tbox_KeyUp(object sender, KeyEventArgs e) {
        MyTextBox tbox = (MyTextBox)sender;
        tbox.Text = tbox.Text.Replace(".", ",");
        #region расчет будет только по enter
        if (e == null) return;
        if (e.KeyValue != 13) return;
        tbox.BorderColor = (tbox.Text == "0") ? Color.Red : Color.Green;
        #endregion
       // .... тут расчет параметров[S][/S]
      }
   #region  цветная рамка
      const int WM_NCPAINT = 0x85;
      const uint RDW_INVALIDATE = 0x1;
      const uint RDW_IUPDATENOW = 0x100;
      const uint RDW_FRAME = 0x400;
      [DllImport("user32.dll")]
      static extern IntPtr GetWindowDC(IntPtr hWnd);
      [DllImport("user32.dll")]
      static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
      [DllImport("user32.dll")]
      static extern bool RedrawWindow(IntPtr hWnd, IntPtr lprc, IntPtr hrgn, uint flags);
      Color borderColor = Color.Blue;
      public Color BorderColor {
        get { return borderColor; }
        set {
          borderColor = value;
          RedrawWindow(Handle, IntPtr.Zero, IntPtr.Zero, RDW_FRAME | RDW_IUPDATENOW | RDW_INVALIDATE);
        }
      }
      protected override void WndProc(ref Message m) {
          base.WndProc(ref m);
          if (m.Msg == WM_NCPAINT && BorderColor != Color.Transparent &&
              BorderStyle == System.Windows.Forms.BorderStyle.Fixed3D) {
            var hdc = GetWindowDC(this.Handle);
            using (var g = Graphics.FromHdcInternal(hdc))
            using (var p = new Pen(BorderColor))
              g.DrawRectangle(p, new Rectangle(0, 0, Width - 1, Height - 1));
            ReleaseDC(this.Handle, hdc);
          }
      }
      protected override void OnSizeChanged(EventArgs e) {
        base.OnSizeChanged(e);
        RedrawWindow(Handle, IntPtr.Zero, IntPtr.Zero, RDW_FRAME | RDW_IUPDATENOW | RDW_INVALIDATE);
      }
     
      #endregion
   }
т.к. если привязываю на стандартный TextBox, то для строковой переменной отображается нормально
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
14.05.2025, 16:09
sonmax, мда!
Ну раз уж смешали логику обработки вводимых данных и собственно сам контрол, то тогда обрабатывайте ввод до конца. А значит управляйте положением курсора после замены точки.
Цитата Сообщение от sonmax Посмотреть сообщение
#region расчет будет только по enter
А если текстбокс потеряет фокус ввода как-то иначе?
sonmax, почему вы настойчиво не хотите делать проверки в обработчике Validating?
0
 Аватар для Andrey-MSK
3317 / 2204 / 387
Регистрация: 14.08.2018
Сообщений: 7,411
Записей в блоге: 4
14.05.2025, 16:26
Цитата Сообщение от sonmax Посмотреть сообщение
#region расчет будет только по enter
Расчёты можно делать в привязанном свойстве в методе set, вот пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public Draw SelectedDraw
{
    get => _selectedDraw;
    set
    {
        // Проверяем изменение свойства
        if (Set(ref _selectedDraw, value))
        {
            // И тут делаем что нужно
            if (SelectedDraw != null)
                DrawName = _selectedDraw.DName;
            else
                DrawName = string.Empty;
        }
    }
}
Базовый класс для INPC
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.ComponentModel;
using System.Runtime.CompilerServices;
 
using Services.Interfaces;
 
namespace VModels.Base
{
    public class BaseViewModel : INotifyPropertyChanged, IBaseViewModel
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
 
        protected virtual bool Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null)
        {
            if (Equals(field, value))
                return false;
 
            field = value;
 
            OnPropertyChanged(PropertyName);
 
            return true;
        }
    }
}
0
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 204
14.05.2025, 18:09  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
Ну раз уж смешали логику обработки вводимых данных и собственно сам контрол, то тогда обрабатывайте ввод до конца. А значит управляйте положением курсора после замены точки.
не соглашусь с вами. расчет в проге д.б последовательный при переходе от окна к следующему окну.
мне всегда проще на примерах объяснить...
возьмем 10 окон, в первые 3 вводит пользователь, 4 рассчитывается исходя из 3х предыдущих.
в 5 -6 опять пользователь в 7 расчет из 1,3, 4 и 6. т.е. просто загнать все в один расчет не получается.
и надо, чтобы пользователь последовательно перемещался по окнам.
sonmax, почему вы настойчиво не хотите делать проверки в обработчике Validating?
я на каком то этапе пробовал это, по времени уже поздно для автозамены.
вообще обработка значения по событиям textbox наверное не подходит. по крайней мере у меня не получилось подобрать подходящее.
отлавливать через BindableObject наверное более правильно.
в общем сейчас остановился на следующем варианте.
стандартный класс textbox + переменная len - в string.
жаль красивостей в виде рамки нет. но пока по другому никак.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3392 / 2713 / 574
Регистрация: 04.09.2018
Сообщений: 8,534
Записей в блоге: 3
14.05.2025, 19:20
Валидация - валидацией, а культура - это культура.
Чтобы применить точку во всех боксах для всего приложения:
C#
1
2
3
4
5
6
7
8
9
10
11
12
protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    var culture = CultureInfo.GetCultureInfo("en-EN");
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
 
    FrameworkElement.LanguageProperty.OverrideMetadata(
        typeof(FrameworkElement),
        new FrameworkPropertyMetadata(
            XmlLanguage.GetLanguage(culture.IetfLanguageTag)));
}
и более с этим не парится.
Валидаторы и конвертеры, как правило, принимаю текущую культуру, и больше менять запятые на точки не требуется.

Добавлено через 1 час 3 минуты
Ой, а это же за WPF речь идет? Почему в WinForms разделе..
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
14.05.2025, 20:06
Цитата Сообщение от wizard41 Посмотреть сообщение
это же за WPF речь идет?
Нет, приложение сделано в формах.

Неизбежно возвращаемся к слоям приложения. sonmax, поймите одно нужно стараться отделить данные от их обработки и от их отображения. Какой бы шаблон разработки не применялся всегда следует держать в голове как минимум эти три задачи. Сосредоточимся на двух задачах: отображение и обработка. Отображение это UI, а ваш разукрашенный текстбокс это его элемент. И оба они не должны ничего знать о том какие данные в них вводят. Чтобы этого достичь нагромождают большую кучу вспомогательного кода. Например, для вашего случая, чтобы не добавлять логику форматирования данных (то есть тот код, который отслеживает и меняет запятую на точку) я бы написал класс форматтер, который выполнял эту задачу. Текстбокс должен принимать этот форматтер, передавать ему пользовательский ввод и получать "правильное" представление. Заметьте я ни разу не упомянул, что речь идёт о дробном числе потому, что задача хранения данных лежит на другом слое. Для вашего случая это класс DEP.

Вообще замена запятой миллион раз обсуждалась на форуме. sonmax, вы подобные темы искали, читали?
1
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3392 / 2713 / 574
Регистрация: 04.09.2018
Сообщений: 8,534
Записей в блоге: 3
14.05.2025, 20:15
BaseViewModel : INotifyPropertyChanged - в формах?? Я что-то пропустил в технологиях?

Добавлено через 49 секунд
Ааа, так это Andrey-MSK с толку сбивает
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
14.05.2025, 21:33
Лучший ответ Сообщение было отмечено sonmax как решение

Решение

sonmax, пробуйте
Базовый класс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  internal class Notifier : INotifyPropertyChanged
  {
    public event PropertyChangedEventHandler PropertyChanged;
 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
 
    protected virtual bool Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null)
    {
      if (Equals(field, value))
        return false;
 
      field = value;
 
      OnPropertyChanged(PropertyName);
 
      return true;
    }
  }

Класс данных
C#
1
2
3
4
5
6
7
8
  internal class DEP : Notifier
  {
    private decimal _lost;                          // расход [2]
    public decimal Lost { get => _lost; set => Set(ref _lost, value); }
 
    private decimal _len;                           // длина  [3]
    public decimal Len { get { return _len; } set => Set(ref _len, value); }
  }

Форма
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
      // Кнопка на форме нужна для демонстрации потери фокуса ввода текстбоксом
    }
    private DEP _dep;
 
    private void Form1_Load(object sender, EventArgs e)
    {
      _dep = new DEP() { Lost = 0.123M, Len = 0.423M };
      textBox1.DataBindings.Add(new Binding("Text", _dep, "Len"));
    }
 
    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
      TextBox tb = (TextBox)sender;
 
      // помимо этих действий можно применить любую предварительную обработку
      string textValue = tb.Text.Trim();
      textValue = textValue.Replace('.', ',');
 
      if (!double.TryParse(textValue, out double res))
        e.Cancel = true;
 
      tb.Text = textValue;
    }
  }

TextBoxAndDouble.mp4
0
2282 / 1598 / 400
Регистрация: 26.06.2017
Сообщений: 4,726
Записей в блоге: 1
14.05.2025, 21:34
del
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.05.2025, 21:34
Помогаю со студенческими работами здесь

Привязка данных dataGridView к textBox'ам на второй форме
Здравствуйте! Помогите, пожалуйста, разобраться. Есть форма, на которой находится dataGridView и...

Двунаправленная привязка данных между textbox.text и элементом класса
как организовать двунаправленную привязку данных между textbox.text и элементом класса типа string

привязка данных к textBox
Мне нужно написать класс Visualisator который принимает экземпляр произвольного класса и выводит в...

Привязка combobox и textbox к базе данных
Здравствуйте! Пишу программу с одной базой данных, в которой несколько таблиц. Хочу вводить данные...

Привязка данных из datagridview в textbox и combobox
Здравствуйте, уважаемые программисты! Я разрабатываю информационную систему &quot;Кадровый учёт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru