/// <summary>
        /// Обработчик событий при изменении "Количество ограничений"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void numericCountRestrictions_ValueChanged(object sender, EventArgs e)
        {
            // Создаём ячейки
            int countVariables    = Decimal.ToInt32(numericCountVariables.Value);
            int countRestrictions = Decimal.ToInt32(numericCountRestrictions.Value);

            DataGridWorker.CreateGrids(_dataGridViewTargetFunction, countVariables, true);
            DataGridWorker.CreateGrids(_dataGridViewRestrictions, countVariables, countRestrictions, true);
            DataGridWorker.CreateGrids(_dataGridViewCornerDot, countVariables, true);
        }
        /// <summary>
        /// Обработчик событий при изменении пункта "Добавить угловую точку"
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxCornerDot_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBoxCornerDot.Checked == true)
            {
                if (_dataGridViewCornerDot.Columns.Count == 0)
                {
                    int countVariables = Decimal.ToInt32(numericCountVariables.Value);
                    DataGridWorker.CreateGrids(_dataGridViewCornerDot, countVariables, true);
                }

                _dataGridViewCornerDot.Visible = true;
            }
            else
            {
                _dataGridViewCornerDot.Visible = false;
            }
        }
        /// <summary>
        /// При загрузке главного окна
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormMain_Load(object sender, EventArgs e)
        {
            // Путь до справки. Для helpProvider
            helpProvider.HelpNamespace = new Uri(Path.Combine(ExeDirectory, "data\\help\\mainpagehelp.html")).LocalPath;

            // Для openFileDialog
            openFileDialog.InitialDirectory = new Uri(Path.Combine(ExeDirectory, "data\\")).LocalPath;

            // Для saveFileDialog
            saveFileDialog.InitialDirectory = new Uri(Path.Combine(ExeDirectory, "data\\")).LocalPath;

            // Создаём ячейки
            int countVariables    = Decimal.ToInt32(numericCountVariables.Value);
            int countRestrictions = Decimal.ToInt32(numericCountRestrictions.Value);

            DataGridWorker.CreateGrids(_dataGridViewTargetFunction, countVariables, false);
            DataGridWorker.CreateGrids(_dataGridViewRestrictions, countVariables, countRestrictions, false);

            // Настройки по умолчанию
            radioButtonMin.Checked            = true;
            radioButtonStepByStepMode.Checked = true;
        }
        /// <summary>
        /// Открыть задачу из файла
        /// </summary>
        /// <param name="fileName"></param>
        private void OpenTaskFromPath(string fileName)
        {
            string fileText = File.ReadAllText(fileName);

            if (fileText == "")
            {
                throw new Exception("Файл пуст.\nПожалуйста, проверьте файл и попробуйте ещё раз.");
            }

            // Чистим массив от лишних символов
            fileText = fileText.Replace("\r", "");
            fileText = fileText.Replace("= ", "");

            // Чистим от последнего /n, если пользователь вдруг нажал Enter после уравнения
            if (fileText[fileText.Length - 1] == '\n')
            {
                fileText = fileText.Remove(fileText.Length - 1);
            }

            // Чистим от лишних пробелов
            fileText = string.Join(" ", fileText.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));

            // Определяем макс или мин и очищаем от этого строку
            if (fileText.Contains("->max") || fileText.Contains("-> max"))
            {
                radioButtonMax.Checked = true;
                fileText = fileText.Replace(" ->max", "");
                fileText = fileText.Replace(" -> max", "");
            }
            else
            {
                if (fileText.Contains("->min") || fileText.Contains("-> min"))
                {
                    radioButtonMin.Checked = true;
                    fileText = fileText.Replace(" ->min", "");
                    fileText = fileText.Replace(" -> min", "");
                }
                else
                {
                    throw new Exception("В файле отсутствует условие максимизации или минимизации. Пожалуйста, установите это условие вручную.");
                }
            }

            // Делим цельный текст на массив строк с уравнениями
            string[] tmpText = fileText.Split('\n');

            // Создаём список всего уравнения
            List <List <string> > AllTask = new List <List <string> >();

            // Заносим данные в список
            foreach (string equation in tmpText)
            {
                AllTask.Add(new List <string>(equation.Split(' ')));
            }

            // Делим на целевую и ограничения
            List <List <string> > targetFunction = new List <List <string> >();

            targetFunction.Add(new List <string>());
            targetFunction[0] = AllTask[0];

            // Удаляем целевую функцию из списка
            AllTask.Remove(AllTask.First());

            List <List <string> > restrictions = new List <List <string> >(AllTask);

            // Заносим целевую функцию в Ячейки
            DataGridWorker.SetParamToGrids(_dataGridViewTargetFunction, targetFunction, true);
            // Создаём угловую точку
            DataGridWorker.CreateGrids(_dataGridViewCornerDot, targetFunction[0].Count, true);
            // Ограничения
            DataGridWorker.SetParamToGrids(_dataGridViewRestrictions, restrictions, true);
        }