Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175

Binding вычисляемых полей

15.05.2016, 12:48. Показов 2462. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На форме у нас есть 3 numerecUpDown контроллера.
Создаем два вычисляемых поля, которые потом будем использовать для нашей формулы.
C#
1
2
3
4
5
6
7
8
9
private decimal maxHealth
{
    get { return numericUpDownPits.Value * 35; }
}
 
private decimal totalHealth
{
    get { return numericUpDownHealth.Value * numericUpDownUnit.Value; }
}
А результат будет выводить в кнопку на которую мы должны будем кликнуть
C#
1
2
3
4
5
6
7
8
9
10
private void buttonResult_Click(object sender, EventArgs e)
{
    decimal result =
        totalHealth > maxHealth ?
        (maxHealth / 35)
        :
        (totalHealth / 35);
 
    buttonResult.Text = result.ToString();
}
Подкралась идею сделать нашу форму динамичной и при любом изменении значения одного из контроллеров что бы менялось автоматически и результат.
При попытке вынести наше действие при клике в отдельное свойство и прикрутить его к байдингу, ничего не происходит:
C#
1
buttonResult.DataBindings.Add("Text", this, "result");
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2016, 12:48
Ответы с готовыми решениями:

Вывод в DataGridView полей некоторого экземпляра класса, в котором одно из полей является списком List
Здравствуйте, помогите плиз!!! Возникла потребность вывода в DataGridView полей некоторого экземпляра класса, в котором одно из полей...

Округление вычисляемых полей
Здравствуйте. Использую SQL 2005 Допустим у меня есть таблица table{a decimal,b decimal, c as a/b} 1.В таком случае с у меня...

Суммирование вычисляемых полей.
На ленточной форме есть вычисляемые поля, при изменении значения одного из полей все поля должны просумироваться. При написании...

5
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
15.05.2016, 15:16
Вы хотите создать динамичность при изменении значений numerecUpDowns, поэтому нужно обработать события изменения их значений в этих объектах, а все расчеты у Вас есть.
0
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
15.05.2016, 16:18  [ТС]
MVK, Событие ValueChanged. Но тогда придется для каждого контроллера создавать это событие. Может есть более красивый способ решить эту проблему?
0
160 / 148 / 92
Регистрация: 30.03.2011
Сообщений: 569
16.05.2016, 13:49
Лучший ответ Сообщение было отмечено kol как решение

Решение

У Вас, собственно, простой код в обработке. Поэтому сделайте для события ValueChanged каждого numerecUpDown ссылку на один и тот же метод, в котором будет:
C#
1
2
3
4
5
6
7
decimal result =
        totalHealth > maxHealth ?
        (maxHealth / 35)
        :
        (totalHealth / 35);
 
    buttonResult.Text = result.ToString();
Добавлено через 19 часов 39 минут
Раз ответа нет, то вижу что-то непонятно. Я бы сделал так.
Как понимаю работаете в конструкторе. Поэтому создайте обработку события ValueChanged для numericUpDown1. В методе инициализации для numericUpDown1 появляется строка:
C#
1
this.numericUpDown1.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged);
, а в метод numericUpDown1_ValueChanged дописываем Ваш код :
C#
1
2
3
4
5
6
7
8
9
10
11
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
decimal result =
        totalHealth > maxHealth ?
        (maxHealth / 35)
        :
        (totalHealth / 35);
 
    buttonResult.Text = result.ToString();
 
}
В конструктор формы после вызова метода
C#
1
InitializeComponent();
дописываем две строчки
C#
1
2
this.numericUpDown2.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged);
this.numericUpDown3.ValueChanged += new System.EventHandler(this.numericUpDown1_ValueChanged);
Они указывают, что при событии ValueChanged для numericUpDown2 и numericUpDown3 вызывается метод numericUpDown1_ValueChanged

sender в обработчике будет указывать на numericUpDown, который вызвал событие. Чтобы в обработчике определить, например, имя numericUpDown, то это делается так:
C#
1
string name = (NumericUpDown) sender).Name;
0
24 / 10 / 5
Регистрация: 30.01.2015
Сообщений: 175
16.05.2016, 14:55  [ТС]
MVK, Спасибо, я вчера ещё разобрался. Но всё равно сейчас думаю как это сделать с помощью байдинга. Потому что на пример если вручную вводить, и не убирать текущий курсор с поля ввода, то значение не измениться, если конечно не нажать клавишу Enter.
В общем хотелось потренироваться с байдингом, за одно вышел и пример интересный, но его вроде как событиями можно решить. Всё равно спасибо
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
16.05.2016, 15:51
Цитата Сообщение от kol Посмотреть сообщение
Но всё равно сейчас думаю как это сделать с помощью байдинга
Если вы хотите сделать с помощью байндинга, то нужно сделать следующим образом:

1) Нужно создать модель данных. Сейчас ваши свойства находятся прямо в форме, что категорически неправильно. Вынесите все свойства, относящиеся к данным в отдельный класс. (это кстати в любом случае нужно делать, хоть с байндингом, хоть без)
2) Ваш класс, назовем его Data, должен реализовать интерфейс INotifyPropertyChanged для того, что бы к нему вы могли конектится через байндинг.
3) Класс должен вызывать событие PropertyChanged, когда какое-либо его поле поменялось. Вот так:
Data
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
    class Data : INotifyPropertyChanged
    {
        //Свойства с поддержкой байндинга
        private decimal pits = 1;
        public decimal Pits{ get { return pits; } set { pits = value; OnChanged();} }
 
        private decimal health = 1;
        public decimal Health { get { return health; } set { health = value; OnChanged(); } }
 
        private decimal unit = 1;
        public decimal Unit { get { return unit; } set { unit = value; OnChanged(); } }
 
        public event PropertyChangedEventHandler PropertyChanged = delegate { };
 
        //Вычисялемое свойство
        public decimal MaxHealth
        {
            get { return Pits * 35; }
        }
 
        //Вычисялемое свойство
        public decimal TotalHealth
        {
            get { return Health * Unit; }
        }
 
        protected virtual void OnChanged()
        {
            //сигнализируем о том, что наши вычисляемые свойства поменялись
            PropertyChanged(this, new PropertyChangedEventArgs("MaxHealth"));
            PropertyChanged(this, new PropertyChangedEventArgs("TotalHealth"));
        }
    }


4) В вашей форме создаете модель и привязываетесь к ней через байндинг:
Форма
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public partial class Form1 : Form
    {
        private Data data;
 
        public Form1()
        {
            InitializeComponent();
 
            data = new Data();
 
            //создаем контролы
            var nud1 = new NumericUpDown { Parent = this };
            var nud2 = new NumericUpDown { Parent = this, Left = 150 };
            var nud3 = new NumericUpDown { Parent = this, Left = 300 };
            var bt = new Button {Parent = this, Top = 100};
 
            //делаем привязки
            nud1.DataBindings.Add("Value", data, "Health", false, DataSourceUpdateMode.OnPropertyChanged);
            nud2.DataBindings.Add("Value", data, "Pits", false, DataSourceUpdateMode.OnPropertyChanged);
            nud3.DataBindings.Add("Value", data, "Unit", false, DataSourceUpdateMode.OnPropertyChanged);
            bt.DataBindings.Add("Text", data, "TotalHealth");
        }
    }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.05.2016, 15:51
Помогаю со студенческими работами здесь

Обновление вычисляемых полей
В общем такая проблемка. Есть подформа, на которой часть данных вычисляется из других полей. На форме стоит автообновление. Так вод данные...

Порядок прохода вычисляемых полей.
Какой порядок вычислений значения для Computed Field ? Т.е. есть 2 поля. №2 использует значение №1. В зависимости от их расположения...

Выборка данных из вычисляемых полей
Здравствуйте! Необходимо для Клиентов (Client) вывести информацию по связанными с ними Счёт-фактурами (Count). Поля общ кол-во и сумма...

Создание вычисляемых полей в InterBase
С помощью запроса Select Cena*0,93 Cena s nadbavkoy From Sotrudniki Рассчитала цену с надбавкой. Но одного поля мне не достаточно,...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru