С sharp Windows Fomf

С sharp Windows Fomf
Добрый день уважаемые программисты! Столкнулся с проблемой и не знаю, как ее решить.
Допустим, у меня есть форма и в ней 3 элемента textbox и 1 button. Мне нужно что бы форма понимала в какой именно элемент textbox я ввожу значение и в соответствие с этим при клике на button она применяла решение и выводила его в остальных textbox.

Допустим:
textbox1=стороны квадрата
textbox2=периметр квадрата
textbox3=площадь квадрата

Мне известна только сторона и я ввожу ее в textbox1 кликаю по button и в остальных textbox у меня считаются и показываются остальные значения. В другом случай у меня известна площадь я ее ввожу в textbox2 и аналогично первому случаю получаю ответ в других textbox. С периметром та же самая ситуация

  • проверяешь поле на пустоту
  • Тут 2 проблемы
    1 - При нажатии на кнопку естественно TextBox теряет фокус, так что Form.ActiveControl не подойдет
    2 - При нажатии на Tab - фокус перемещается последовательно => ориентироваться на фокус вообще нельзя или вы лишаете пользователей возможности нормально управлять вводом только с клавиатуры.

    Значит надо привязываться к событию не связанным с фокусом а к событию изменения текста.

    Сделайте у формы поле TextBox с последним элементом ( в примере tbxLast)
    У первого textBox создайте ответ на событие Property Changed -> TextChanged (в примере TextBox1TextChanged)
    У второго и третьего textBox перейдите на событие Property Changed -> TextChanged и выберите ту-же функцию ответа
    В фунции ответа (т.к. sender это отправитель события, а у нас оно только от 3 textBox, то имеем право):
    tbxLast = (TextBox)sender;

    Итого:

    public partial class MainForm : Form
    {

    public MainForm()
    {
    InitializeComponent();
    //По умолчанию считаем первое поле
    this.tbxLast = textBox1;
    }

    protected TextBox tbxLast; //Наше последнее поле

    //Ответ на событие при нажатии кнопки
    void Button1Click(object sender, EventArgs e)
    {
    //Выводим имя последнего
    MessageBox.Show(this.tbxLast.Name);
    }

    //Общая функция при изменении текста в текстбоксе
    void TextBox1TextChanged(object sender, EventArgs e)
    {
    tbxLast = (TextBox)sender;
    }

    }
    }

    Хотя я не думаю что это удобно....
    И непонятно что делать если человек ввел данные в другие поля... Очищать их? Или блокировать? (а если чел передумает?)

    Если что - пишите на почту - могу набросать вариант с очищением.

    P.S: Имхо наверное лучше сделать checkbox и привязанные к нему поля.