Cześć,
w aplikacji chcę umieścić zależne od siebie kontrolki NumericUpDow
. Wartość jednej ma ma się zmieniać proporcjonalnie do zmiany wartości drugiej. Ze wzoru x/y = x'/y'
, gdzie x, y są początkowymi wartościami, a x', y' tymi nowymi, wyprowadziłem sobie x' oraz y' i przystąpiłem do realizacji tego zadania. Oto efekt:
using System;
using System.Drawing;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
EventHandler a, b;
public Form1()
{
InitializeComponent();
numericUpDown1.Maximum = decimal.MaxValue;
numericUpDown2.Maximum = decimal.MaxValue;
numericUpDown1.Minimum = 1;
numericUpDown2.Minimum = 1;
// przykładowe wartości
decimal val1 = 640;
decimal val2 = 400;
numericUpDown1.Value = val1;
numericUpDown2.Value = val2;
a = (object sender, EventArgs e) =>
{
numericUpDown2.ValueChanged -= b;
decimal y = val2;
decimal x = val1;
decimal _x = (sender as NumericUpDown).Value;
decimal _y = (y * _x) / x;
numericUpDown2.Value = _y;
numericUpDown2.ValueChanged += b;
};
b = (object sender, EventArgs e) =>
{
numericUpDown1.ValueChanged -= a;
decimal y = val2;
decimal x = val1;
decimal _y = (sender as NumericUpDown).Value;
decimal _x = (x * _y) / y;
numericUpDown1.Value = _x;
numericUpDown1.ValueChanged += a;
};
numericUpDown1.ValueChanged += a;
numericUpDown2.ValueChanged += b;
}
}
}
I teraz rodzi się pytanie. Czy da się to zrobić bardziej elegancko? Nie podobają mi się te manewry ze zdarzeniami przy zmianie wartości, a nie mam innego pomysłu.