private void TextBoxChanged(object sender, EventArgs e)
        {
            InputDataTextBox textBox = (InputDataTextBox)sender;

            for (int row = 0; row < textBoxes.GetLength(0); row++)
            {
                for (int column = 0; column < textBoxes.GetLength(1); column++)
                {
                    if (textBox.Equals(textBoxes[row, column]))
                    {
                        UpdateLabels(row, column);
                        //
                        int[,] textBoxValues = new int[2, 2];
                        textBoxValues[0, 0]  = (int)textBoxes[0, 0].Value;
                        textBoxValues[0, 1]  = (int)textBoxes[0, 1].Value;
                        textBoxValues[1, 0]  = (int)textBoxes[1, 0].Value;
                        textBoxValues[1, 1]  = (int)textBoxes[1, 1].Value;

                        /* в linq :
                         *
                         *  int[,] textBoxValues = textBoxes.Cast<InputDataTextBox>()
                         *  .Select((x, i) => new { x?.Value, i })
                         *  .Aggregate(
                         *    new int[textBoxes.GetLength(0), textBoxes.GetLength(1)],
                         *    (accum, item) =>
                         *    {
                         *        accum[item.i / textBoxes.GetLength(1), item.i % textBoxes.GetLength(1)] = (int)item.Value.GetValueOrDefault();
                         *        return accum;
                         *    });*/
                        //
                        textBoxUpdate.Invoke(textBoxValues);
                    }
                }
            }
        }
        private void tbSettingValidatingInt(object sender, CancelEventArgs e)
        {
            InputDataTextBox textBox = (InputDataTextBox)sender;

            if (!Int32.TryParse(textBox.Text, out int value))
            {
                textBox.Text = textBox.LastState;
                MessageBox.Show("Введены недопустимые значения");
            }
        }